《进程同步与通信.ppt》由会员分享,可在线阅读,更多相关《进程同步与通信.ppt(80页珍藏版)》请在三一办公上搜索。
1、第3章 进程同步与通信,进程同步与互斥,经典进程同步问题,管程,AND信号量,进程通信,3.1 进程的同步与互斥,OS引入进程后,由于进程的异步性,可能会导致程序执行结果的不确定性,使程序执行时出现不可再现性。进程互斥与同步的主要任务是使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。,3,并发原理,1 并发带来的问题全局变量的共享充满了危险如果两个进程都使用了同一个全局变量,并且都对该变量进行了读写操作,那么不同的读写执行顺序是非常关键的。操作系统很难最佳地管理资源的分配定位程序的错误是很困难的这是因为并发程序的不确定性和不可再现性,4,并发给操作系统设计和管理
2、带来了很多问题,为此要关注的事情有以下几个方面:,操作系统必须记录每个进程的情况,并通过进程控制块实现。操作系统必须为每个进程分配和释放各种资源,这些资源包括处理机、存储器、文件和I/O设备。操作系统必须保护每一个进程的数据和资源,避免遭到其他进程的干涉和破坏保证进程执行结果的正确性,进程的执行结果与速度无关。,5,进程的交互,这里以进程之间是否知道对方的存在,按进程的交互方式分三种情况:进程之间不知道对方的存在 独立的进程 竞争的关系进程之间知道对方的存在共享数据时要进行合作进程直接得知对方互相通信,用于合作完成某些任务,6,进程同步的基本概念,同步:指多个进程中发生的事件存在着某种时序关系
3、,它们 必须按规定时序执行,以共同完成一项任务。互斥:多个进程不能同时使用同一资源。进程通信:是指多进程之间要传递一定的信息临界资源:某段时间内仅允许一个进程使用的资源。临界区:每个进程中访问临界资源的那段代码。,7,几个进程共享同一临界资源,它们必须以互相排斥的方式使用临界资源即当一个进程正在使用临界资源且尚未使用完时,其他进程必须延迟对该资源的进一步操作,在当前的进程使用完成之前,不能从中插入使用这个临界资源,否则将会造成信息混乱和操作出错。,8,例:P1,P2两进程共享变量COUNT(COUNT的初值为5)P1:R1=COUNT;R1=R1+1;COUNT=R1;P2:R2=COUNT;
4、R2=R2+1;COUNT=R2;,分析:1执行顺序P2P1执行结果P1:COUNT为7,P2:COUNT为6。2执行顺序P1:R1=COUNTP2:R2=COUNTP1:R1=R1+1;COUNT=R1P2:R2=R2+1;COUNT=R2执行结果P1:COUNT为6,P2:COUNT为6。,临界资源实例,9,例:P1,P2两线程共享变量COUNT(COUNT的初值为5)P1:R1=COUNT;R1=R1+1;COUNT=R1;P2:R2=COUNT;R2=R2+1;COUNT=R2;,用Bernstein条件考察R(P1)=R1,COUNTW(P1)=R1,COUNTR(P2)=R2,CO
5、UNTW(P2)=R2,COUNTR(P1)W(P2),临界资源实例,P1、P2不符合Bernstein条件必须对程序的执行顺序施加某种限制,10,While(1),空闲让进 当无进程处于临界区时,临界资源处于空闲状态。此时允许进程进入临界区。忙则等待 当已有进程进入临界区时,临界资源正在被访问,其他想进入临界区的进程必须等待。有限等待 对于要求访问临界资源的进程,应保证在有效的时间内进入,以免进入“死等”状态。让权等待 当进程不能进入临界区时,应立即释放处理机,以免进程进入“忙等”。,进入区,临界区,退出区,剩余区,同步机制应遵循的准则,访问临界资源的进程描述为,11,互斥实现的硬件方法,禁
6、止中断专用机器指令TS(Test and Set)指令 Swap指令,12,禁止中断,在单处理机环境中,并发执行的进程不能在CPU上同时执行,只能交替执行。另外,对于一个进程而言,它将一直运行,直到被中断。因此,为了保证互斥,只要保证一个进程不被中断就可以了,这可以通过系统内核开启、禁止中断来实现,13,禁止中断,书中图3-2 实现了互斥由于在临界区内进程不能被中断,故保证了互斥。但该方法代价很高。进程被限制只能接替执行。另外,在多处理机环境中,禁止中断仅对执行本指令的CPU起作用,对其他CPU不起作用,也就不能保证对临界区的互斥进入。,14,专用机器指令,在很多计算机(特别是多处理机)中设有
7、专用指令来解决互斥问题。依据所采用的指令的不同,硬件方法可以分为:TS指令和Swap指令,15,/TS指令:boolean TS(lock);boolean lock;boolean temp;temp=lock;lock=true;return temp;,Lock有两种状态:当lock=false时,表示资源空闲;当lock=true时,表示资源正在被使用。为了实现互斥,设布尔变量lock,其初值为false,表示资源空闲。利用TS指令实现互斥。缺点:没有做到:“让权等待”。,/TS指令的使用while(TS(lock)/*什么也不做*/;临界区;lock=false;剩余区;,TS(Te
8、st and Set)指令,16,硬件方法的优点:,适用范围广适用任意数目的进程简单标志设置简单,容易验证其正确性支持多个临界区在一个进程中有多个临界区,只需为每个临界区设置一个变量。,17,硬件方法的缺点:,进程在等待进入临界区时,不能做到“让权等待”由于进入临界区的进程是从等待进程中随机选择的,可能造成某个进程长时间不能被选上,从而导致“饥饿”状态。,18,实现互斥的方法:,一种是让希望并发执行的进程自己来完成,可通过软件来完成。第二种方法是使用专门的机器指令来完成,方法的优点是可以减少开销,但与具体的硬件系统相关,很难成为一种通用的解决方案。第三种方法是有操作系统中提供某种支持。,19,
9、通过平等协商方式实现进程互斥的最初方法使软件方法。其基本思路是在进入区检查和设置一些标志,如果已有进程在临界区,则在进入区通过循环检查进行等待;在推出区修改标志。,20,互斥实现的软件方法,/进程0while(turn!=0)/什么都不做;临界区;turn=1;剩余区;/进程1while(turn!=1)do/什么都不做;临界区;turn=0;剩余区;,设置公共整型变量turn,用于指示进入临界区的进程编号i(i=0,1)。使P0、P1轮流访问临界资源。缺点:强制性轮流进入临界区,不能保证“空闲让进”。,单标志算法,21,/进程0 while(flag1)/什么都不做;flag0=true;临
10、界区;flag0=false;剩余区;/进程1while(flag0)/什么都不做;flag1=true;临界区;flag1=false;剩余区;,设置数组flag,初始时设每个元素为false,表示所有进程都未进入临界区。若flagi=true,表示进程进入临界区执行。在每个进程进入临界区时,先查看临界资源是否被使用,若正在使用,该进程等待,否则才可进入。解决了“空闲让进”问题。缺点:可能同时进入临界区,不能保证“忙则等待”。,用软件方法解决互斥问题,双标志、先检查算法,22,/进程0flag0=true;while(flag1)/什么也不做;临界区;flag0=false;剩余区;,两进程
11、先后同时作flagi=true;缺点:保证了不同时进入临界区,但又可能都进不去。不能保证“有空让进”。,/进程1flag1=true;while(flag0)/什么也不做;临界区;flag1=false;剩余区;,双标志、先修改后检查算法,用软件方法解决互斥问题,23,/进程0flag0=true;turn=1;while(flag1),保证了“有空让进”和“忙则等待”。,/进程1flag1=true;turn=0;while(flag0),先修改、后检查、后修改算法,用软件方法解决互斥问题,24,信号量和PV操作,1965年,荷兰学者Dijkstra提出了信号灯机制,卓有成效地解决了进程同步
12、问题。记录型信号灯的定义struct semaphore int value;struct PCB*queue;,25,信号灯的PV操作,void wait(semaphore s)s.value=s.value-1;if(s.value 0)block(s.queue);/*将进程阻塞,并将其投入等待队列s.queue*/void signal(semaphore s)s.value=s.value+1;if(s.value=0)wackup(s.queue);/*唤醒阻塞进程,将其从等待队列s.queue 取出,投入就绪队列*/,26,从资源的观点看信号灯的意义:s.value的初值表示系
13、统中某种资源数目。wait(s)表示要申请一个资源。signal(s)表示要释放一个资源。s.value 0时,|s.value|表示等待队列的进程数。,信号灯的物理意义,27,用信号灯解决互斥问题,如果信号量的初值为1,表示仅允许一个进程访问临界区,此时的信号量转换为互斥信号量。P操作和V操作分别置于进入区和推出区。如定义mutex为互斥信号量,其初值为1,P,V操作的位置如书中图3-9,28,用信号灯解决互斥问题,semaphore mutex=1;P1:while(1)P(mutex);临界区;V(mutex);剩余区;,P2:while(1)P(mutex);临界区V(mutex);剩
14、余区;,29,用信号灯解决同步问题,即:可以控制进程执行的先后顺序semaphore a,b=0,0;s1;V(a);V(b)P(a);s2P(b);s3,30,生产者消费者问题读者写者问题哲学家进餐问题打磕睡的理发师问题,3.2经典进程同步问题,31,生产者-消费者问题,指有两组进程共享一个环形的缓冲池。一组进程被称为生产者,另一组进程被称为消费者。缓冲池是由若干个大小相等的缓冲区组成的,每个缓冲区可以容纳一个产品。生产者进程不断地将生产的产品放入缓冲池,消费者进程不断地将产品从缓冲池中取出。,32,用信号量解决“生产者-消费者”问题,void consumer()/消费者进程while(t
15、rue)P(full);P(mutex);data_c=bufferj;j=(j+1)%n;V(mutex);V(empty);consume the item in data_c;,semaphore mutex=1;semaphore empty=n;semaphore full=0;,int i,j;ITEM buffern;ITEM data_p,data_c;,void producer()/生产者进程 while(true)produce an item in data_p;P(empty);P(mutex);bufferi=data_p;i=(i+1)%n;V(mutex);V(
16、full);,33,读者-写者问题,一个数据对象若被多个并发进程所共享,且其中一些进程只要求读该数据对象的内容,而另一些进程则要求写操作,对此,我们把只想读的进程称为“读者”,而把要求写的进程称为“写者”。问题描述:读者可同时读;读者读时,写者不可写;写者写时,其他的读者、写者均不可进入。,34,读者进程:while(true)有人要读 P(Wmutex);读;无人读了 V(Wmutex);,写者进程:while(true)P(Wmutex);写;V(Wmutex);,semaphore Wmutex=1;,用信号量解决读者-写者问题,35,void reader()/*读者进程*/while
17、(true)P(Rmutex);if(Rcount=0)P(Wmutex);Rcount=Rcount+1;V(Rmutex);read;/*执行读操作*/P(Rmutex);Rcount=Rcount-1;if(Rcount=0)V(Wmutex);V(Rmutex);,Semaphore Wmutex,Rmutex=1,1;int Rcount;,用信号量解决读者-写者问题,void writer()/*写者进程*/while(true)P(Wmutex);write;/*执行写操作*/V(Wmutex);,36,哲学家进餐问题,五个哲学家,他们的生活方式是交替地思考和进餐。哲学家们共用一
18、张圆桌,围绕着圆桌而坐,在圆桌上有五个碗和五支筷子,平时哲学家进行思考,饥饿时拿起其左、右的两支筷子,试图进餐,进餐完毕又进行思考。这里的问题是哲学家只有拿到靠近他的两支筷子才能进餐,而拿到两支筷子的条件是他的左、右邻居此时都没有进餐。,37,semaphore chopstick5=1,1,1,1,1;void philosopher(int i)/*哲学家进程*/while(true)P(chopsticki);P(chopstick(i+1)%5);eating;/*进餐*/V(chopsticki);V(chopstick(i+1)%5);thinking;/*思考*/,用信号量解决哲
19、学家进餐问题,哲学家能顺利地吃到饭吗,?,38,打磕睡的理发师问题,理发店有一名理发师,一把理发椅,还有N把供等候理发的顾客坐的普通椅子。如果没有顾客到来,理发师就坐在理发椅上打磕睡。当顾客到来时,就唤醒理发师。如果顾客到来时理发师正在理发,顾客就坐下来等待。如果N把椅子都坐满了,顾客就离开该理发店去别处理发。,39,用信号量解决打磕睡的理发师问题,void customer()/顾客进程P(mutex);if(waiting CHAIRS)/如果有空位,顾客等待waiting+;V(customers);/如果有必要,唤醒理发师 V(mutex);P(barners);/如果理发师正在理发,
20、则顾客等待get_haircut();else/如果没有空位,则顾客离开 V(mutex);,#define CHAIRS 5/为等候的顾客准备的座椅数semaphore customers=0;semaphore barners=0;semaphore mutex=1;int waiting;,void barber()/理发师进程 while(true)P(customers);/如果没有顾客,理发师就打磕睡 P(mutex);/互斥进入临界区 waiting-;V(barners);/理发师准备理发了 V(mutex);cut_hair();/理发,40,用信号量解决了很多同步和互斥问题
21、,但在解决问题的过程中,我们也发现还存在一些问题,如在生产者和消费者问题中两个P操作的位置不能颠倒;哲学家进餐问题中的死锁现象等。这些问题的出现促使AND信号量的产生。,3.3 AND信号量,41,AND信号量同步机制就是要解决多个进程处于僵持状态的问题。基本思想:将进程在整个运行期间所需要的所有临界资源,一次性地全部分配给进程,待该进程使用完后再一起释放。只要尚有一个资源不能满足进程的要求,其他所有能分配给进程的资源也都不予以分配。为此,在P操作上增加一个AND条件。,3.3 AND信号量,42,Swait(s1,s2,sn)if(s1=1,AND信号量定义,43,AND信号量定义,Ssig
22、nal(s1,s2,sn)for(i=1;i=n;i=i+1)si=si+1;for(等待队列si.queue中的每个进程P)if(进程P通过Swait中的测试)/*通过检查,即资源够用*/wackup(p);/唤醒进程P;else/*未通过检查,即资源不够用*/进程P继续等待;,44,用AND信号量解决哲学家进餐问题,在该问题中,筷子是临界资源,而题目中的临界资源有5个,每个哲学家需要拿到两个临界资源才可以进餐,所以为了避免死锁的产生,哲学家在申请资源时必须一次性地申请其所需要的所有资源,具体方法如下:,45,用AND信号量解决哲学家进餐问题,semaphore chopstick5=1,1
23、,1,1,1;void philosopher(int i)/*哲学家进程*/while(true)Swait(chopsticki,chopstick(i+1)%5);.eat();/*进餐*/.Ssignal(chopsticki,chopstick(i+1)%5);.think();/*思考*/,46,管程机制,引入的原因:信号灯机制虽然既方便又有效地解决了进程同步问题,但要求访问临界资源的进程自备同步操作wait(s)、signal(s),使得大量的同步操作分散在各个进程中,给进程的管理带来不便,并会因同步操作使用不当导致死锁。Hoare和Hanson提出了管程的概念把分散在各个进程中
24、的与同一共享资源有关的同步处理从各进程中抽出并集中起来。,47,一个管程定义了一个数据结构和能为并发进程所执行(在该数据结构上)的一组操作,这组操作能同步进程和改变管程中的数据。管程=数据结构+操作+对数据结构中变量的初始化,3.4管程的定义,48,管程的基本思想,把信号量及其操作原语封装在一个对象内部,即将共享资源的所有操作集中在一个模块中。管程可以用函数库的形式实现,一个管程就是一个基本程序单位,可以单独编译。,49,管程的特征:,局限于管程的共享变量(数据结构),只能被管程的过程访问,任何外部过程都不能访问。一个进程通过调用管程的一个过程进入管程。任何时候,只能有一个进程在管程中执行,调
25、用管程的任何其他进程都被挂起,以等待管程变为可用,即管程有效地实现互斥。,50,管程结构,条件变量:管程必须使用条件变量提供对同步的支持,这些条件变量包含在管程中,并且只有在管程中才能被访问,有以下两个函数可以操作条件变量:cwait(c):调用进程的执行在条件c上挂起,管程现在可以被另一个进程使用。csignal(c):恢复在cwait上因为某些条件而挂起的进程的执行。如果有多种这样的进程,选择其中一个。,51,注意:管程中的条件变量不是计数器,不能像信号量那样积累信号,供以后使用。如果在管程中的一个进程执行csignal(c),而在条件变量c上没有等待的进程,则它所发送的信号将丢失。换句话
26、说,cwait操作必须在csignal操作之前,这条规则使实现更加简单。,52,尽管一个进程可以通过调用管程中的任何一个过程进入管程,仍可以把管程想象成具有一个入口点,并保证一次只有一个进程可以进入。其他试图进入管程的进程加入到挂起等待管程可用的进程队列中。但一个进程在管程中时,它可能会通过发送cwait(x)把自己暂时挂起在条件x上,随后它被放入等待条件改变以重新进入管程的进程队列中。,管程的结构,53,管程的结构,如果在管程中执行的一个进程发现条件变量x发生了变化,它发送csignal(x),通知相应条件队列,条件已经改变,54,条件变量用管程实现进程同步,设置两个同步操作原语wait,s
27、ignal 为了区别等待的原因,引入条件变量condition其形式为 var x,y:condition条件变量置于wait和signal之前,表示为 x.wait和x.signal例如:由于共享数据被占用而使调用进程等待,该条件变量的形式为notbusy;wait原语应改为notbusy.wait,monitor_name=monitorvariable declarationsprocedure P1();procedure P2();procedure Pn();init code,管程的语法,55,利用管程解决生产者-消费者问题,monitor monitor_PC;char buf
28、fern;int nextin,nextout;int count;condition notfull,notempty;void put(char x);/*存储数据过程*/if(count=n)cwait(notfull);buffernextin=x;nextin=(nextin+1)%n;count=count+1;csignal(notempty);,void get(char x);/*取数据过程*/if(count=0)cwait(notempty);x=buffernextout;nextout=(nextout+1)%n;count=count-1;csignal(notfu
29、ll);/*管程体*/nextin=0;nextout=0;count=0;/*变量初始化*/,56,void producer()/*生产者进程*/char x;while(true)produce an char in x;monitor_PC.put(x);,void consumer()/*消费者进程*/char x;while(true)monitor_PC.get(x);consume an x;,利用管程解决生产者-消费者问题,57,管程比信号量的优势管程优于信号量之处在于所有的同步机制都被限制在管程内部,因此易于验证同步的正确性,易于检查出错误。此外,如果有一个管程被正确地使用
30、,则所有进程对受保护资源的访问都是正确的;而对于信号量,只有当所有访问资源的进程都能正确地使用信号量时,资源访问才能保证正确。,58,3.5 进程通信,信号灯作为进程同步和互斥工具是卓有成效的。但作为通信工具就不够理想。其原因为:效率低一次只传一条消息。通信对用户不透明。因此必须引入高级通信工具,解决进程之间大量的信息传递问题,59,3.5 进程通信,按交换信息量的大小,可以把进程之间的通信分成低级通信和高级通信。在低级通信中,进程之间只能传递状态信息和整数值,信号量机制属于低级通信方式。在高级通信中,进程之间可以传递任意数量的数据,传递的信息量大,操作系统隐藏了进程通信的实现细节,大大简化了
31、进程通信程序编制上的复杂性。高级通信机制可分为三大类:,60,进程通信的类型,共享存储器系统消息传递系统直接通信方式间接通信方式管道通信,61,共享存储器系统,在共享存储系统中,相互通信的进程共享某些数据结构或存储区域,进程之间通过共享的存储区域进行通信。进程通信前,向系统申请共享存储区域,并指定共享区域的名称,若系统已经把该共享区域分配给其他进程,则将该共享区域的句柄返回给申请者。申请进程把获得的共享区域连接在本进程上之后,便可像读写普通存储区域一样对该共享区域进行读写操作,以达到传递大量信息的目的。,62,消息传递系统,在消息传递系统中,进程间的数据交换以消息为单位。用户通过使用操作系统提
32、供的一组消息通信原语来实现信息的传递。消息传递系统是一种高级通信方式,它因实现方式不同又可以分直接通信方式和间接通信方式。,63,直接通信方式:发送方直接将消息发送给接收方,接收方可以接收来自任意发送方的消息,并在读出消息的同时得知发送者是谁。间接通信方式:消息不是直接从发送方发送到接收方,而是发送到临时保存这些消息的队列,这个队列通常也被称为信箱。因此,两个通信进程,一个给一个合适的信箱发消息,一个从信箱中获得这些信息。,64,间接通信方式在消息的使用上有很大的灵活性。发送方和接受方之间的关系可以是一对一、多对一、一对多和多对多、进程和信箱的关联可以是静态的也可以是动态的。,65,信箱的所有
33、权问题:对于端口,它通常归接收进程所有,并有接收进程创建。因此当接收进程被撤销时,它的端口也随之撤销。对于通用的信箱,操作系统可以提供一个创建信箱的服务,这样信箱可以看做有创建它的进程所有,在这种情况下它们也同该进程一起终止;或者把信箱看做由操作系统所有,此时要撤销信箱需要一个显示命令。,66,管道通信,所谓管道,是指用于连接一个读进程和一个写进程,以实现进程之间通信的一种共享文件,又称pipe文件。向管道提供输入的是写进程;而负责接收管道数据的接收进程称为读进程。由于发送和接收进程是利用管道实现的通信的,所以被称为管道进程。管道通信始创于UNIX 系统,因此他能传输大量的数据,而且有效,目前
34、许多操作系统提供管道通信,如windows2000 linux OS/2,67,管道通信机制必须提高以下3个方面的协调能力,互斥。当一个进程正在对管道进行读或者写,另一个进程必须等待。同步。管道的大小是有限制的。所以当管道满的时候写进程必须等待,直到读进程把它唤醒为止。对方是否存在。只有确认对方存在时,方能进行通信。,68,进程通信中的几个问题,通信链路的建立方式通信方向通信链路连接方式 通信链路的容量数据格式 同步方式,69,通信链路的建立方式为了使发送进程和接受进程之间能够进行通讯,必须在它们之间建立一条通信链路。有两种建立通信链路方式:显示建立链路隐式建立链路一般的说,网路通信常常用显示
35、的方式建立链路,本机进程通信采用隐式方式建立通信链路。,70,通信方向根据进程通信的方向,又可以分为单向通信方式和双向通信方式。单向通信方式:指只允许发送进程向接收进程发送消息,反之不行。双向通信方式允许一个进程向另外一个进程发送消息,也可以反过来有另一个进程向发过消息的进程回送消息。双向通信方式由于进程之间可以对发过的消息进行回送确认,因此比较可靠,71,通信链路连接方式通信链路的链接又可以吧通信链路分为点对点连接和广播方式。点对点:指用一条链路将两个进程进行连接,通信的完成只与这两个进程有关。广播:指一条链路上连接了多个进程,其中的一个进程向其他多个进程同时发送消息。,72,通信链路的容量
36、是指通信链路上是否有用于暂存数据的缓冲区。无容量通信链路上没有缓冲区,不能存任何信息。有容量通信链路指在链路中设置了缓冲区,因而可以暂存消息,缓冲区的数目越大,通信链路的容量也越大。,73,数据格式字节流:发送方发送的数据没有一定的格式,接收方不需要保留各次发送间的分界。报文:比较复杂,分为报头和正文。,74,同步方式根据收发进程在进行收发操作时是否等待,同步方式又分为两种:阻塞方式:操作方要等待操作结束。非阻塞方式:操作方在提交后立即返回。具体说,一个进程向另一个进程发送消息后,发送进程可能有两种选择:一是自己阻塞,并等到接收方接收到消息后才被唤醒;另一种选择是继续执行,对于接收进程也类似。
37、,75,消息缓冲队列-示意图,76,消息缓冲队列-数据结构定义,/消息缓冲区定义struct message_buffer char sender30;/*发送进程标识符*/int size;/*消息长度*/char text200;/*消息正文*/struct message_buffer*next;/指向下一个消息缓冲区的指针/PCB中有关通信的数据项struct process_control struct message_buffer*mq;/*消息队列队首指针*/semaphore mutex=1;/*消息队列互斥信号量,初值为1*/semaphore sm=0;/*消息队列同步信号
38、量,记录消息的个数.初值为0*/,77,/发送原语char receiver30;struct message_buffer a;void send(receiver,a)struct message_buffer i;struct process_control j;getbuf(a.size,i);/*发送区a消息的长度申请一缓冲区i*/i.sender=a.sender;i.size=a.size;i.text=a.text;i.next=NULL;getid(PCB_set,receiver,j);/*获得接收进程的进程标识符j*/P(j.mutex);Insert(j.mq,i);/
39、*将消息缓冲区i挂到的消息队列j.mq上*/V(j.mutex);V(j.sm);,消息缓冲队列-发送原语,78,消息缓冲队列-接收原语,struct message_buffer b;void receive(b)struct message_buffer i;struct process_control j;j=internal_name();/*接收进程的内部标识符*/P(j.sm);P(j.mutex);remove(j.mq,i);/*从消息队列中摘下第一个消息缓冲区*/V(j.mutex);b.sender=i.sender;b.size=i.size;b.text=i.text;,79,客户服务器系统通信,常用的通信方式:命名管道:是客户端一服务器系统中一种可靠的双向通信机制,它由命名管道服务器和命名管道客户端组成。套接字:既可用于同一台计算机上的两个进程之间的通信,也适用于网路环境下的进程通信,自20世纪80年代起成为Internet网上的通信标准。由IP地址和端口号组成,IP地址用于确定网路上的一台计算机,端口号用于确定该计算机的一个进程。远程过程调用:采用客户端-服务器模式,其思想简单,就是允许程序调用网路上其他计算机上的过程。,计算机操作系统(第2版)P101-102/1 4 5 6,思考,
链接地址:https://www.31ppt.com/p-5320201.html