资源描述
*,*,*,单击此处编辑母版标题样式,单击此处编辑母版文本样式,第二级,第三级,第四级,第五级,第八章,UNIX,的进程管理,程序的并发执行与顺序执行,顺序执行,并发执行,程序执行是顺序的,程序执行是间断的,程序独占系统资源(封闭性),程序共享资源,程序执行的可再现性,程序执行失去可再现性,进程是一个具有一定功能的程序在一组数据集上的一次动态执行过程。,进程是线程的容器,是资源的分配单位。,在分时多道程序环境中,,CPU,在多道程序之间切换,每道程序执行一个时间片,并行方式完成多道程序的并发请求。传统,UNIX,描述这一活动单位是“进程”。,进程的概念,进程的组成,进程控制块,程序代码,数据集,进程的状态,运行,阻塞,就绪,创建,退出,进程控制的基本概念,进程的创建、种植、阻塞、唤醒,原语,临界区,同步,互斥,UNIX,中的进程,进程控制系统负责:,管理将要被,CPU,使用的程序和数据,存储空间分配,进程交换调度,并发执行控制,系统资源分配,1.UNIX,进程创建机制,UNIX,系统采用分时(,time-sharing system),策略,管理多道程序的运行,时间片通常设计的比较小,典型的为,1,秒,进程调度采用动态优先数法,选择占用处理器的进程,在同等优先级的进程队列中,使用,FCFS,算法调度,1,),UNIX,进程控制的层次结构,从系统启动开始,进程创建和控制具有层次性结构,引导,核心创建,0#,0#,创建,1#,终端,n,终端,1,终端,2,UNIX,中的两个特殊进程:,0#,进程,由内核程序创建,初始化时创建,1#,进程,系统引导完成后,负责调度分配处理器,管理中负责进程调度与交换,1#,进程,是所有用户进程的祖先进程,2,)用户进程的创建机制,password,用户注册,chs,wc,chs,ls,用户注销,chs,chs,chs,chs,chs,注意:用户创建的进程树以,1#,进程为根,2.UNIX,中的进程描述,UNIX,进程上下文划分为:,Proc,结构和,user,结构,用户栈、核心栈,正文段、数据段,Proc,结构,User,结,构,系,统,栈,用,户,栈,数,据,段,正,文,段,PCB,1)proc,结构,进程最基本信息,包括,:,进程状态,进程用户标识,进程标识,进程存储大小,进程调度参数,软中断信号项,执行时间及资源使用,User,结构起始址,进程页表指针,被挂起事件描述,2)use,结构,是进程的私有信息和数据,指向,proc,的指针,系统调用参数,与用户标识有关项,与文件结构有关项,输入输出项,打开文件描述符,中断及软中断参数,错误信息,各段长度,文件权限屏蔽项,交换数据项,3),寄存器的内容,如:,PC,的内容,PSW,内容,栈指针内容,通用寄存器内容,4),进程中的三个主要区段,共享正文段,数据段,栈段,命令执行和进程属性,1.UNIX,命令执行与进程创建紧密相关,Shell,命令包括内部和外部命令,.,内部命令是,shell,进程代码的一部分,如,:,cd,echo,exec,exit,pwd,set,test,times,read,wait,外部命令是以文件存储的代码,可以是二进制或,shell script,如,:,grep,more,cat,mkdir,rmdir,ls,sort,ftp,telnet,ps,.,通常,shell,创建一个新进程执行这些命令,当命令执行时,shell,进程等待它的结束,外部命令,sort,在,shell,中的执行过程,:,sh,sh,sh,sort,sh,fork,执行,sort,父,父,子,1,步,2,步,3,步,父,命令执行时系统创建进程过程实例,:,%,ps,Pid,tty,time,cmd,15672 pts/0 1:03 -,csh,%,sh,$echo this is,bourneshell,.,This is,bourneshell,.,$,ksh,$echo this is,kornshell,.,This is,kornshell,.,$,ps,Pid,tty,time,cmd,15672 pts/0 1:03 ,csh,pst/0 1:05,sh,pst/0 1:06,ksh,$D,$D,%,2.,进程属性,了解进程属性可以更好的管理和调整用户的工作。,用,ps,命令可以查阅系统中运行的进程属性,.(,不同版本略有不同,),ps,options-,作用,:,报告进程状态,常用选项,:,-a-,显示除登录,shell,以外所有运行在该终端上的进程信息,-e-,显示系统中所有运行进程的信息,-l-,进程信息按长列表方式显示,-u,uidlist,-,显示所有属于,uidlist,中用户的进程信息,长列表中包括的进程属性,:,F:,进程标志位,S:,进程状态,(,是否运行,等待事件,就绪等,),UID:,用户,ID,PID:,进程,ID,PPID:,父进程,ID,C:CPU,的利用率,PRI:,进程优先数,ADDR:,进程在内存或磁盘的地址,SZ:,占用主存空间大小,按块,WCHAN:,等待位,TTY:,终端,TIME:,进程运行或在,sleep,或停止前运行时间,CMD:,命令,引起这个进程的命令列表,.,UNIX,进程调度与管理,进程状态是,proc,中的一组数据,,system V,有九种状态。,1,进程状态及状态转换,1,)用户态下的执行态,2,)核心态下的执行态,3,)内存就绪态,4,)外存就绪态,5,)内存中的睡眠,6,)外存睡眠,7,)被跟踪态,8,)初始态,9,)僵死态,UNIX,状态转换关系,进程状态间转换的几条规定:,进程可在用户态及核心态下运行,进程,i,核心态,用户态,中断,/,系统调用,重置,PSW,对就绪进程的两种处理方法,内存就绪进程参与竞争,外存就绪应先换入内存。由,0#,进程管理。,有些状态只能做单向转换,内存睡眠的进程可调出到外存睡眠,而外存睡眠的进程不能调入到内存睡眠,外存睡眠的进程在被唤醒时只能进入外存就绪态,等待下一次的调度时再进入内存,转换是单向的。,2.,进程调度程序,1),进程调度程序主要责任,对参与竞争,CPU,且已备执行条件的进程进行分析和裁决,对选中的进程做,CPU,控制权转交,管理进程运行中各种状态的转换,完成进程在系统内外存之间的交换,2),调度原理,采用:动态优先级多级反馈循环调度法(,Round Robin With Multiple Feedback).,调度原理,:*)给进程分配一个时间片,*)时间片结束时计算进程优先级,*),用优先数做比较,选出高优先级进程,*)分析情况重置状态,*)调度高优先级进程开始运行,*)被抢夺了,cpu,的进程反馈到相应的优先级队列中,3),调度时机,UNIX,中有两种调度时机:,a,)进程自动放弃,CPU,b),进程由核心态转为用户态时,说明:,具体调度由,0#,进程中的,switch,程序完成。,且第二种调度时机特点是:综合考虑减少系统设计复杂度及实际运行中的可行性。,第一种调度时机是可预见的,插入,switch,很容易。,4),调度标志的设置,三种调度标志:,Runrun,-,请求,cpu,调度,Runin,-,请求换入内存的调度标志,Runout,-,请求换出内存的标志,5),调度策略及优先级计算,Unix,sysV,采用动态优先数调度策略,并且规定,优先数越大,其优先级越低。,优先数计算公式:,P-,pri,=P-cpu/2+PUSER+P-nice+NZERO,其中:,PUSER,,,NZERO,是优先数基值;,P-,cpu,是每个进程最近一次使用,CPU,的时间;,P-nice,是用户设置的进程优先数偏置值。,普通用户只可使用,nice,加大优先数,%nice-5,myprog,&,公式分析:,对于新创建的进程,由于,P-cpu/2=0,,所以其优先数会最小。因此会比较快的得到调度。,对于原有进程,a),当被调度时,:,随着进程被调度执行,其,P-,cpu,的值不断增加,会被其它进程抢先;,b),当不被调度时,:,由于公式中,P-,cpu,是被一个常数“,2,”所除,因此每当计算优先数时,早先被调度过的,P-cpu/2,项会衰减。因此当优先数小于当前进程和其它进程时,又会重新抢占,CPU,。,进程调度的实现实质上是完成进程之间上下文(映象)的切换。,分三步完成:,第一步:检查是否做且系统允许做上下文切换,若条件满足,则保存:,进程中各段内容(数据,正文,栈),有关寄存器中内容,相关的栈指针,否则返回有关信息,不作调度。,6),进程调度的实现过程,第二步:,0,号进程选取就绪队列中一个优先级最高的进程使之占有,CPU,;若没有满足条件的进程存在,,0,号进程循环等待直到条件满足为止。,第三步:被选中的进程变为当前进程。,系统从它的核心栈或,user,结构中恢复该进程的有关寄存器内容和栈指针,新进程开始执行。,进程管理的系统调用,1.,系统调用控制进程的产生、运行、消亡,Unix,中进程是由系统调用,fork,创建的实体。,调用,fork,的是父进程,由,fork,创建的是子进程。,一个进程可以有多个子进程,但只有一个父进程。父子进程的关系图示如下:,parent,zomb,child,child,parent,wait,fork,exec,exit,2.,进程的创建,进程创建:,fork(),调用格式:,pid,=fork();,若调用失败,,pid,=-1,若调用成功,返回子进程,pid,的值,(,pid,=0),及,proc,结构中的某些参数;,此时子进程得到的返回值是,0,且子进程是父进程的副本。,在创建进程时,Unix,的核心程序为,fork,完成:,1),在进程表中为子进程分配,proc,结构;,2),给子进程赋唯一的标识符,pid,;,3),复制父进程上下文的一个逻辑副本;,4),增加父进程的文件表、索引节点表的引用数;,5),为父进程返回子进程的标识符,pid,;为子进程返回标识符,0,。,fork,系统调用举例:,/*,例题,fork_test.c,*/,main(),int,pid,;,printf(“Just1 process new.n”);,printf(“Callingfork,()n”);,pid,=fork();,if(pid,=0),printf(“Imthe,child.n”);,else,if(pid,0),printf(“Imthe,parent.n”),else,printf(“forkfailed.n,”);,printf(“programend.n,);,分析运行结果可发现,子进程的存在!,3.,终止进程:,exit,使用,exit,系统调用,可以终止进程的运行,.,核心程序使进程进入僵死态并释放它所占有的资源,:,关闭所有打开的文件,;,撤除进程上下文占有的内存。,Exit,的调用方式为:,exit(satus,);,注意,:,程序中使用,Return,和,exit,的区别,return,是函数结束的返回,而,exit,是进程结束的返回。,孤儿进程及僵死进程的处理,孤儿进程,当子进程的父进程终止后,该子进程就变成了孤儿进程(,orphan process),。,孤儿进程由,1(init),号进程收养。,父进程终止后,子进程变成后台进程。,2),僵死进程,子进程被创建并工作完成后,等待父进程回收时变为僵死进程,.,父进程使用,wait,回收子进程,.,孤儿进程由,init,进程中的特定机制回收,.,4.,指定进程执行另一程序的系统调用,exec,系统调用功能是:用一可执行程序副本覆盖调用程序的正文段和数据段,并用调用进程提供的参数执行新的代码段。,例:,main(),printf(“onen,”);,execl(“/bin/ls”,”ls”,0);,printf(“twon,”);,perror(“execerror,”);,程序执行情况:,1,),execl,调用成功时,只输出“,one”,然后用,ls,的执行结果覆盖后面的程序代码;,2,),execl,调用失败时,输出:,one,Two,exec,error:No,sushfile,or directory,exec,系统调用的基本格式:,execve(pathname,argv,envp,);,pathname:,要执行文件的路径名;,argv,:,字符指针数组,是可执行程序的参数;,envp,:,字符指针数组,指示执行程序的环境。,Exec,有六种调用方式:,exec,的六种调用方式:,execve,execle,execvp,execv,execl,execlp,它们以后两个字母区别调用方式:,l:,长格式调用,每个参数指针独立传递并以空指针,0,结束;,例子,1,v,:用,argv,指针数组传递运行参数;否则每个命令行参数是单个参数,.,例子,2,e,:从,envp,指针数组传递环境参数;否则用现有环境变量复制新程序环境,.,p,:在,PATH,指定的目录中搜索指定的文件,否则在当前目录中搜索。,例,1:,execl(“/bin.ls”,”ls”,”-l”,”abc.c”,0);,例,2:,main(argc,argv,),intargc,;,char*,argv,;,if(,argc,0),wait(0);/*,等待子进程*,/,printf(“Imthe,parent.n”);,else,printf(“forkfailed.n,”);,printf(“programend.n,);,库函数,system,使用,system,可以在一个程序的执行中执行另一程序,调用格式为:,status=,system(command,);,其中,status:,整数,类似,wait,中的返回状态;,command:,字符指针,指出要执行的命令或程序名,.,例:用,system,函数写出一最简形式的,shell,命令解释程序例子,.,程序功能应包括:,1)shell,命令执行应该具有循环执行功能,.,2),应具有命令提示符功能,3),可正确执行用户输入的,UNIX,命令,4),可给用户一定的提示信息,5),要具有程序正常退出的机制,/*,例,mini-,sh.c,*/,#include,syscmd(prompt,),char*prompt;,for(;),char buf80;,printf(“%s”,prompt,);,gets(buf,);,if(!strcmp(buf,“exit”)return;,system(buf,);,main(),printf(“Entercommand,exit,for quit:n”);,syscmd,(“”);,exit(0);,System,函数由系统调用构成的,步骤如下:,1,)用,fork,创建一子进程;,2,)用,exce,执行,/bin/,sh,的命令;,3,)子进程中用,exit,做出错处理;,4,)父进程中用,wait,保证在命令或程序执行完后,父进程仍有控制权;,5,)用软中断信号及处理技术完成其他的控制。,
展开阅读全文