您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统第3章_3.
1第三章、进程管理3.1进程的概念3.2进程的描述3.3进程状态及其转换3.4进程控制3.5进程互斥3.6进程同步3.7进程通信3.8死锁问题3.9线程23.7进程通信一、进程通信:进程之间的信息交换、数据传送。低级通信:少量控制信息的交换,一个/几个字节。高级通信:高效、大量地传送数据,交换信息。二、进程通信方式:1、主从式:(终端控制进程与终端进程)1)主进程可自由使用从进程的资源和数据;2)从进程动作受主进程控制;3)主、从进程的关系固定。2、会话式:(用户进程与磁盘管理进程)1)使用进程要得到服务进程的许可;2)服务进程自控地完成对使用进程的服务;3)通信时二者有固定的连接关系。33、共享存储区方式:(UNIXSystemV)在存储区中划出一块共享存储区,两个进程通过对申请的共享存储区读、写实现通信。4、消息或邮箱机制:1)发送进程和接收进程之间有用于存放传送消息的缓冲区或邮箱;2)发送进程向空缓冲区或邮箱发送信息,接收进程从满缓冲区或邮箱接收信息;3)发送进程和接收进程之间没有直接固定的联系。4三、消息缓冲机制:(直接通信方式,多对一)消息缓冲区:进程通信的基本单位,记录消息的内容等信息,为多个进程共享,其数据结构描述为:TYPEmessagebuffer=recordsender_ptr;指向发送进程的指针size;消息长度text;消息正文next_ptr;指向下一个消息缓冲区的指针end56公用信号量mutex:对消息缓冲区的的访问采取互斥措施;私有信号量Sm:消息缓冲区无消息时,接收进程不能接收,同步措施。发送进程:Send(k,m)begin向系统申请一个消息缓冲区将发送消息m送到新消息缓冲区把缓冲区链入接收进程k的消息队列end接收进程:Receive(n)begin摘下消息队列中消息n把n复制到接收区释放消息缓冲区endP(mutex)V(mutex)V(Sm)P(Sm)P(mutex)V(mutex)7四、邮箱通信:(间接通信方式,灵活)邮箱:发送进程和接收进程之间设置的大小固定的私有数据结构(多个消息组成的队列),由接收进程所拥有。工作条件:发送至少有一个空格,接收时至少有一个满格。特点:发送、接收基本无时间限制。缺点:占用大量内存,接口多,效率低。(公用信箱)8同步措施:设置一对私有信号量,记录邮箱中空格满格的数量Deposit(m)beginlocalx选择邮箱的一个空格x把消息m放入空格x置格x为满标志endRemove(m)beginlocalx选择邮箱的一个满格x取走消息m置格x为空标志endP(formnum)V(mesnum)P(mesnum)V(formnum)9实例1:管道以比特流方式传送消息的通信管道,由文件系统的高速缓冲区构成。10例:创建管道,父子进程通过管道传递数据。#includestdio.hmain(){intx,fd[2];charbuf[30],s[30];pipe(fd);while((x=fork())==-1);if(x==0){sprintf(buf,thisisanexample!);write(fd[1],buf,30);exit(0);}else{wait(0);read(fd[0],s,30);printf(result:%s,s);}}11实例2:书例P1631、接收消息程序client.c2、发送消息程序server.c3、在msg.c中,创建三个子进程:其中两个调用client.c另一个调用server.c相互之间发送消息12接收消息程序client.c#includesys/types.h#includesys/ipc.h#includesys/msg.h#defineMSGKEY75structmsgform{longmtype;charmtext[256];};main(intargc,char*argv[]){structmsgformmsg;intmsgqid,pid,*pint;msgqid=msgget(MSGKEY,0777|IPC_CREAT);printf(msgqid=%d\n\n,msgqid);pid=getpid();pint=(int*)msg.mtext;*pint=pid;msg.mtype=1;msgsnd(msgqid,&msg,sizeof(int),0);msgrcv(msgqid,(structmsgform)&msg,sizeof(msg),pid,0);pint=(int*)msg.mtext;pid=(int)*pint;printf(Client%s:receivefromServerprocess%d\n,argv[1],pid);}13发送消息程序server.c--1#includesys/types.h#includesys/ipc.h#includesys/msg.h#defineMSGKEY75structmsgform{longmtype;charmtext[256];};intmsgqid;main(){structmsgformmsg;inti,*pint;intpid;externcleanup();for(i=0;i20;i++)signal(i,cleanup);msgqid=msgget(MSGKEY,0777|IPC_CREAT);printf(msgqid=%d\n\n,msgqid);14发送消息程序server.c--2for(;;){msgrcv(msgqid,(structmsgform*)&msg,256,1,0);pint=(int*)msg.mtext;pid=(int)*pint;printf(Server:receivefromClientprocess%d\n\n,pid);msg.mtype=pid;pint=(int*)msg.mtext;*pint=getpid();msgsnd(msgqid,&msg,sizeof(int),0);}cleanup(){msgctl(msgqid,IPC_RMID,0);exit();}15msg.c#includesys/types.h#includestdio.h#includeunistd.hmain(){intpid1,pid2,pid3;pid1=vfork();if(pid1==0)/*子进程2001*/{printf(\nClient1process%4d:\n,getpid());execlp(/…/client,client,1,NULL);}else{pid2=vfork();if(pid2==0)/*子进程2002*/{printf(Client2process%4d:\n,getpid());execlp(/…/client,client,2,NULL);}else{pid3=vfork();if(pid3==0)/*子进程2000*/{printf(Server3process%4d:\n,getpid());execlp(/…/server,server,NULL);}else{printf(\nThisisParentprocess%4d!\n,getpid());}}}wait(0);wait(0);wait(0);}16子进程2001子进程2002子进程2000TYPE:1TEXT:2001TYPE:1TEXT:2002TYPE:2001TEXT:2000TYPE:2002TEXT:2000消息队列书例P16317控制台DPKPDCPKCPPnCCPechobufoutbufinbufRQSQReceive(k)Write(y)Send(x,m)Read(x)U_receive(m)S_answer(a,i)实例3:和控制台的通信i18①用户进程PiCCP的接口用户进程发出问题:P_write(m)BeginP(rq)把m插入RQ队列V(rq)V(question)EndCCP接收问题:U_receive(m)BeginP(question)P(rq)把m从RQ队列取出V(rq)End19②CCP与DCP的接口CCP向outbuf送问题:outbuf_empty=1Write(y)BeginP(outbuf_empty)copy(outbuffromy)V(outbuf_full)EndDCP从outbuf中接收:outbuf_full=0Receive(k)BeginP(outbuf_full)copy(outbuftok)V(outbuf_empty)End20③DCP与显示器的通信显示器控制进程DCP:D_busy=1初始化{清除outbuf,echo=false}Beginif(outbuf满)thenreceive(k)P(D_busy)把k送入显示器数据缓冲区V(D_ready)elseecho=trueechobuf中字符置入显示器缓冲区fiEnd显示器动作DP:D_ready=0Repeatif(echo=true)then打印显示器缓冲区中字符elseP(D_ready)打印显示器缓冲区中消息V(D_busy)Until(显示器关机)21④KCP与键盘的通信键盘控制进程KCP:T_busy=1初始化{清除inbuf、echobuf}BeginP(T_ready)从键盘数据缓冲区x中取出字符x.mSend(x.m)将x.m送入echobufV(T_busy)End键盘动作KP:T_ready=0RepeatP(T_busy)把键入字符送入键盘数据缓冲区xV(T_ready)Until(终端关闭)22⑤CCP与KCP的接口KCP向inbuf送回答:inbuf_empty=1Send(k)BeginP(inbuf_empty)copy(inbuffromk)V(inbuf_full)EndCCP从inbuf中接收回答:inbuf_full=0Read(x)BeginP(inbuf_full)copy(inbuftox)V(inbuf_empty)End23⑥CCP用户进程Pi的接口CCP发出回答:S_answer(a,i)BeginP(sqi)把a插入SQi队列V(sqi)V(answeri)End用户进程接收回答:P_read(a)BeginP(answeri)P(sqi)把a从SQi队列取出V(sqi)End24会话控制进程CCP的动作描述Localk,m,xRepeatU_receive(m)将消息m的进程标号置入k中将消息m解码变换到xwrite(x)read(x)将x编码到mS_answer(m,k)Until(CCP结束)253.8死锁问题一、死锁的定义指多个进程因竞争资源而造成的僵局,即各自等待对方的资源,而在得到对方资源前又不会释放自己拥有的资源,在无外力作用下,各进程将永远不能向前推进。26二、死锁的起因1、资源竞争:可剥夺性资源(CPU、内存)非剥夺性资源(打印机):分配后不能强行收回。272、进程推进顺序非法:合法非法28三、产生死锁的必要条件:1、互斥条件:2、不剥夺条件:3、部分分配条件(请求和保持):4、环路条件:防止死锁发生,破坏四个必要条件中的一个或多个即可(主要是第3、4个,第1、2条受资源特性的限制)。29四、死锁的排除方式1、死锁的预防2、死锁的避免3、死锁的检测和恢复301、死锁的预防——破坏四个必要条件中的一个或多个2)有序资源使用法——打破“环路条件”内容:把资源编号排序,要求进程必须按编号递增的顺序申请资源:m个资源,R1R2…Rm,进程P1保持了Ri,只能申请Rj,(ji);原理:总有一个进程占据较高序号的资源,其后申请的资源必空闲,从而满足需要一直往前推进,再释放已用资源。编号原则:常用资源低序号,不常用资源高序号;缺点:序号顺序相对稳定限制新设备;当一个进程的资源使用顺序和编号顺序不一致时,资源闲置浪费;限制用户的编程自由。1)预先静
本文标题:操作系统第3章_3.
链接地址:https://www.777doc.com/doc-2381377 .html