《操作系统习题课1课件.ppt》由会员分享,可在线阅读,更多相关《操作系统习题课1课件.ppt(37页珍藏版)》请在淘文阁 - 分享文档赚钱的网站上搜索。
1、实用操作系统习题课实用操作系统习题课1P.27 1.1P.27 1.1假设假设图图1.31.3中中所示所示的理想的理想处理器处理器还有两条还有两条I/OI/O指令:指令:0011=0011=从从I/OI/O中载入中载入ACAC0111=0111=把把ACAC保存到保存到I/OI/O中中在这种情况下,在这种情况下,使用使用1212位地址标识一个特殊的外部设备位地址标识一个特殊的外部设备。请给出以下请给出以下程序的执行过程(按照图程序的执行过程(按照图1.41.4的格式):的格式):1.1.从设备从设备5 5中载入中载入ACAC。2.2.加上存储器单元加上存储器单元940940的内容。的内容。3.
2、3.把把ACAC保存到设备保存到设备6 6中。中。假设从设备假设从设备5 5中取到的下一个值为中取到的下一个值为3 3,内存单元,内存单元940940中的值为中的值为2 2。2 参考答案参考答案 3P.27 1.2P.27 1.2本章中用本章中用6 6步来描述图步来描述图1.41.4中的程序执行情况,请使用中的程序执行情况,请使用MARMAR和和MBRMBR扩充这扩充这个描述。个描述。4 参考答案参考答案 步骤步骤1 1a.a.PCPC中包含第一条指令的地址中包含第一条指令的地址300300,该,该值值被送入被送入MARMAR中。中。b.b.地址为地址为300300的指令的内容(值为十六进制数
3、的指令的内容(值为十六进制数19401940)被送入)被送入MBRMBR,并,并且且PCPC增增1 1。这两个步骤是并行完成的。这两个步骤是并行完成的。c.c.MBRMBR中的值被送入指令寄存器中的值被送入指令寄存器IRIR中。中。步骤步骤2 2a.a.指令寄存器指令寄存器IRIR中的地址部分(中的地址部分(940940)被送入)被送入MARMAR中。中。b.b.地址地址940940中的值被送入中的值被送入MBRMBR中。中。c.MBRc.MBR中的值被送入中的值被送入ACAC中。中。P.27 1.3P.27 1.3假设有一个假设有一个3232位微处理器,其位微处理器,其3232位的指令由两个
4、域组成:第一个字节位的指令由两个域组成:第一个字节包含操作码,其余部分为一个直接操作数或一个操作数地址。包含操作码,其余部分为一个直接操作数或一个操作数地址。a.a.最大可直接寻址的存储器能力为多少(以字节位单位)?最大可直接寻址的存储器能力为多少(以字节位单位)?b.b.如果微处理器总线具有下面的情况,请分析对系统速度的影响:如果微处理器总线具有下面的情况,请分析对系统速度的影响:1.1.一个一个3232位局部地址总线和一个位局部地址总线和一个1616位局部数据总线。位局部数据总线。2.2.一个一个1616位局部地址总线和一个位局部地址总线和一个1616位局部数据总线。位局部数据总线。6 参
5、考答案参考答案 a.2a.22424=16 Mbytes.=16 Mbytes.b.1.b.1.由于局部地址总线为由于局部地址总线为3232位,因此,整个地址可以通过一次位,因此,整个地址可以通过一次传输并在内存中解码。但是,由于局部数据总线为传输并在内存中解码。但是,由于局部数据总线为1616位,需要位,需要2 2个指令周期来获取一个个指令周期来获取一个3232位的指令或者操作数。位的指令或者操作数。2.2.由于通过由于通过1616位局部地址总线传输来的位局部地址总线传输来的1616位地址无法访问到位地址无法访问到整个内存空间,因此,需要两步来获得一个地址,则需要一些更整个内存空间,因此,需
6、要两步来获得一个地址,则需要一些更加复杂的内存接口控制来锁定地址的第一部分和第二部分。例如,加复杂的内存接口控制来锁定地址的第一部分和第二部分。例如,可以假设前半部分是地址的行,后半部分是地址的列。同样,需可以假设前半部分是地址的行,后半部分是地址的列。同样,需要要2 2个指令周期来获取一个个指令周期来获取一个3232位的指令或者操作数。位的指令或者操作数。P.27 1.3P.27 1.3假设有一个假设有一个3232位微处理器,其位微处理器,其3232位的指令由两个域组成:第一个字节位的指令由两个域组成:第一个字节包含操作码,其余部分为一个直接操作数或一个操作数地址。包含操作码,其余部分为一个
7、直接操作数或一个操作数地址。c.c.程序计数器和指令寄存器分别需要多少位?程序计数器和指令寄存器分别需要多少位?7 参考答案参考答案 c.c.程序计数器至少要程序计数器至少要2424位。通常,一个位。通常,一个3232位的微处理器有一个位的微处理器有一个3232位的外部地址总线和一个位的外部地址总线和一个3232位的程序计数器,除非使用片内寄位的程序计数器,除非使用片内寄存器则可以用较小的程序计数器。如果指令寄存器要包含整个指存器则可以用较小的程序计数器。如果指令寄存器要包含整个指令,则它需要令,则它需要3232位。如果它只包含运算码(成为运算码寄存器),位。如果它只包含运算码(成为运算码寄存
8、器),则它需要则它需要8 8位长。位长。P.28 1.7P.28 1.7实际上在所有包括实际上在所有包括DMADMA模块的系统中,模块的系统中,DMADMA访问访问内存内存的优先级总是高于的优先级总是高于处理器访问处理器访问内存内存的优先级。这是为什么的优先级。这是为什么?8 参考答案参考答案 如果一个处理器在尝试着读或者写如果一个处理器在尝试着读或者写内存内存时被挂起时被挂起,通常除了一点轻微通常除了一点轻微的的时间损耗之外没有任何危害。但是,时间损耗之外没有任何危害。但是,DMADMA可能以数据流的方式从或者可能以数据流的方式从或者向设备向设备(例如磁盘或磁带例如磁盘或磁带)接收或者传输数
9、据接收或者传输数据,并且这是不能被打断的。并且这是不能被打断的。否则否则,如果,如果DMADMA模块模块被挂起(拒绝继续访问被挂起(拒绝继续访问内内存),数据可能会丢失。存),数据可能会丢失。P.28 1.9P.28 1.9一台计算机包括一个一台计算机包括一个CPUCPU和一台和一台I/OI/O设备设备D D,通过一条共享总线连接到,通过一条共享总线连接到内存内存M M,数据总线的宽度为,数据总线的宽度为1 1个字。个字。CPUCPU每秒最多可执行每秒最多可执行10106 6条指令条指令,平平均每条指令需要均每条指令需要5 5个个处理器处理器周期,其中周期,其中3 3个周期需要使用存储器总线个
10、周期需要使用存储器总线。存储器读存储器读/写操作使用写操作使用1 1个机器周期。假设个机器周期。假设CPUCPU正在连续不断地执行后正在连续不断地执行后台程序,并且需要保证台程序,并且需要保证95%95%的指令执行速度,但没有任何的指令执行速度,但没有任何I/OI/O指令。假指令。假设设1 1个处理器周期等于个处理器周期等于1 1个总线周期,现在要在个总线周期,现在要在M M和和D D之间传送大块数据之间传送大块数据。a.a.若使用程序控制若使用程序控制I/OI/O,I/OI/O每传送每传送1 1个字需要个字需要CPUCPU执行两条指令执行两条指令,请估请估计通过计通过D D的的I/OI/O数
11、据传送的最大可能数据传送的最大可能速率速率。b.b.如果使用如果使用DMADMA传送,请估计传送速度。传送,请估计传送速度。10 参考答案参考答案 a.a.CPUCPU只能分配只能分配5 5的时间给的时间给I/OI/O。所以最大的所以最大的I/OI/O指令指令执行速率是执行速率是10106 60.050.055000050000条指令条指令/秒。秒。因此因此I/OI/O的传送速率是的传送速率是2500025000字字/秒。秒。b.b.使用使用DMADMA控制时,可用的机器周期的数量是控制时,可用的机器周期的数量是10106 6(0.05(0.055 50.950.952)2)2.152.151
12、0106 6 周期周期/秒秒如果我们假设如果我们假设DMADMA模块可以使用所有这些周期,并且忽略任何设置和模块可以使用所有这些周期,并且忽略任何设置和状态状态检查时间,那么这个值就是最大的检查时间,那么这个值就是最大的I/OI/O传传送送速率。速率。P.28 1.10P.28 1.10考虑以下代码:考虑以下代码:forfor (i=0i=0;i 20i 20;i+i+)forfor (j=0j=0;j 10j 10;j+j+)ai=ai*jai=ai*ja.a.指出指出代码中空间局部性代码中空间局部性的一个例子的一个例子。b.b.指出指出代码中时间局部性代码中时间局部性的一个例子的一个例子。
13、11 参考答案参考答案 a.a.读取第一条指令读取第一条指令,紧接着,紧接着读取第二条指令读取第二条指令。b.b.在很短的在很短的间隔间隔时间内,时间内,ai ai在循环内部被访问了十次。在循环内部被访问了十次。2.2.补充补充以时间为主线,请总结本节课程中提到的各种操作系统的局限,并阐以时间为主线,请总结本节课程中提到的各种操作系统的局限,并阐述新的操作系统是如何解决上述局限的。述新的操作系统是如何解决上述局限的。1315P.110P.110 3.53.5考虑图考虑图3.9(b)3.9(b)中的状态转换图。假设操作系统正在分派进程,有进程中的状态转换图。假设操作系统正在分派进程,有进程处于就
14、绪态和就绪处于就绪态和就绪/挂起态,并且至少有一个处于就绪挂起态,并且至少有一个处于就绪/挂起态的进程挂起态的进程比处于就绪态的所有进程的优先级都高。有两种极端的策略:比处于就绪态的所有进程的优先级都高。有两种极端的策略:(1)(1)总总是分派一个处于就绪态的进程,以减少交换;是分派一个处于就绪态的进程,以减少交换;(2)(2)总是把机会给具有总是把机会给具有最高优先级的进程,即使会导致在不需要交换时进行交换。请给出一最高优先级的进程,即使会导致在不需要交换时进行交换。请给出一种能均衡考虑优先级和性能的中间策略。种能均衡考虑优先级和性能的中间策略。16 参考答案参考答案 对于一个就绪对于一个就
15、绪/挂起态的进程,降低一定数量(如一或两个)优先级,从挂起态的进程,降低一定数量(如一或两个)优先级,从而保证只有当一个就绪而保证只有当一个就绪/挂起态的进程比就绪态的进程的最高优先级还高挂起态的进程比就绪态的进程的最高优先级还高出几个优先级时,它才会被出几个优先级时,它才会被选作选作下一个执行。下一个执行。P.136P.136 4.14.1在在进程中进程中使用使用多线程有多线程有两个好处两个好处:(1):(1)在进程中创建一个新线程在进程中创建一个新线程的开销的开销比创建一个新进程比创建一个新进程的开销的开销少;少;(2)(2)同一个进程中的线程间的通信简单。同一个进程中的线程间的通信简单。
16、那么在同那么在同一个进程中的两个线程切换一个进程中的两个线程切换的开销是否也比的开销是否也比不同进程的两个不同进程的两个线程间线程间切换的开销少?切换的开销少?18 参考答案参考答案 是的,因为两个进程间的模式切换要储存更多的状态信息。是的,因为两个进程间的模式切换要储存更多的状态信息。P.136P.136 4.24.2在比较用户级线程和内核级线程时曾指出用户级线程的一个缺点在比较用户级线程和内核级线程时曾指出用户级线程的一个缺点是是,当一个用户级线程执行系统调用时,不仅这个线程被阻塞,进程中的当一个用户级线程执行系统调用时,不仅这个线程被阻塞,进程中的所有线程都被阻塞。请问这是为什么?所有线
17、程都被阻塞。请问这是为什么?19 参考答案参考答案 因为对于用户级线程来说,一个进程的线程结构对操作系统是不可见的,因为对于用户级线程来说,一个进程的线程结构对操作系统是不可见的,而操作系统的调度是以进程为单位的。而操作系统的调度是以进程为单位的。P.137P.137 4.44.4考虑这样一个环境,用户级线程和内核级线程呈一对一的映射关系,考虑这样一个环境,用户级线程和内核级线程呈一对一的映射关系,并且允许进程中的一个或多个线程产生会引发阻塞的系统调用,而其并且允许进程中的一个或多个线程产生会引发阻塞的系统调用,而其他线程可以继续运行。解释为什么他线程可以继续运行。解释为什么在单处理器机器上,
18、在单处理器机器上,这个模型可以这个模型可以使多线程程序比使多线程程序比相应的相应的单线程程序运行速度更快?单线程程序运行速度更快?20 参考答案参考答案 问题在于机器会花费相当多的时间等待问题在于机器会花费相当多的时间等待I/OI/O操作的完成。在一个多线程程操作的完成。在一个多线程程序中,可能一个内核级线程会产生引发阻塞的系统调用,而其他内核级序中,可能一个内核级线程会产生引发阻塞的系统调用,而其他内核级线程可以继续执行。而在单处理器机器上,进程则必须阻塞线程可以继续执行。而在单处理器机器上,进程则必须阻塞直到直到所有的所有的系统调用都可以继续运行。系统调用都可以继续运行。P.174P.17
19、4 5.45.4考虑考虑下述下述程序程序:const int nconst int n =50;50;int tally;int tally;void total()void total()int count;int count;forfor (count=count=1;1;count=count 0)if(s.count0)s.count-;s.count-;else else place this process in place this process in s.queue;s.queue;block;block;void semSignal(s)void semSignal(s)2
20、4 if(there is at least one if(there is at least one process blocked on semaphore)process blocked on semaphore)remove a process P from remove a process P from s.queue;s.queue;place process P on ready place process P on ready list;list;else else s.count+;s.count+;将该定义与将该定义与图图5.35.3中的定义中的定义进行比较进行比较,得出两
21、个定义之间有一个区别:得出两个定义之间有一个区别:在前面在前面的定义中,信号量永远不会取负值。当的定义中,信号量永远不会取负值。当在程序中分别使用这两种定义时,其效在程序中分别使用这两种定义时,其效果有什么不同?果有什么不同?即能否即能否在不改变程序意在不改变程序意义的前提下,用一个定义代替另一个?义的前提下,用一个定义代替另一个?参考答案参考答案 这两个定义是等价的,在图这两个定义是等价的,在图5.35.3的定义中,当信号量的值为负值时,它的的定义中,当信号量的值为负值时,它的值代表了有多少个进程在等待值代表了有多少个进程在等待。在此题中的定义中,虽然你没有关于在此题中的定义中,虽然你没有关
22、于有有多少个进程在等待这个信息多少个进程在等待这个信息,但是这两个版本的函数是一样的。,但是这两个版本的函数是一样的。255.5.补充补充1 1假定一个阅览室最多可以容纳假定一个阅览室最多可以容纳100100人,读者进入和离开阅览室必须登人,读者进入和离开阅览室必须登记和去除登记。而且每次只允许一个人登记或者去除登记。用伪代码记和去除登记。而且每次只允许一个人登记或者去除登记。用伪代码描述读者的行为。描述读者的行为。26semaphoresemaphore seatseat =100;100;/表示表示还有多少空位还有多少空位semaphoresemaphore mutexmutex =1;1
23、;/用于对用于对登记表互斥访问登记表互斥访问Reader()Reader()while(1)while(1)semWait(seat);semWait(seat);semWait(mutex);semWait(mutex);登记登记;semSignal(mutex);semSignal(mutex);阅读阅读;semWait(mutex);semWait(mutex);注销注销;semSignal(mutex);semSignal(mutex);semSignal(seat);semSignal(seat);28 参考答案参考答案 semaphore semaphore S_AS_A =1 1
24、;/控制甲方车辆申请进入隧道(甲方优先)控制甲方车辆申请进入隧道(甲方优先)semaphore semaphore S_BS_B =0;0;/控制乙方车辆申请进入隧道控制乙方车辆申请进入隧道semaphore semaphore mutexmutex =1 1;/对计数量的互斥操作对计数量的互斥操作intint countcount =0;0;/隧道中车辆数隧道中车辆数intint n_an_a =0;0;/甲方排队等候进入隧道的车辆数甲方排队等候进入隧道的车辆数intint n_bn_b =0;0;/乙方排队等候进入隧道的车辆数乙方排队等候进入隧道的车辆数甲方车辆进程甲方车辆进程()()n_
25、a+;n_a+;semWait(S_A);semWait(S_A);count+;count+;if(n_b=0)if(n_b=0)semSignal(S_A);semSignal(S_A);进入隧道进入隧道;通过隧道通过隧道;semWait(mutex);semWait(mutex);n_a-;n_a-;count-;count-;semSignal(mutex);semSignal(mutex);elseelse 进入隧道进入隧道;通过隧道通过隧道;semWait(mutex);semWait(mutex);n_a-;n_a-;count-;count-;if(count=0)if(cou
26、nt=0)semSignal(S_B);semSignal(S_B);semSignal(mutex);semSignal(mutex);类似可得到乙方车辆进程过程。类似可得到乙方车辆进程过程。29 参考答案参考答案 semaphore semaphore S_AS_A =1 1;/控制甲方车辆申请进入隧道(甲方优先)控制甲方车辆申请进入隧道(甲方优先)semaphore semaphore S_BS_B =0;0;/控制乙方车辆申请进入隧道控制乙方车辆申请进入隧道semaphore semaphore mutex_amutex_a =1,mutex_b=1,mutex_count=11,mu
27、tex_b=1,mutex_count=1;/对计数量的互斥操作对计数量的互斥操作intint countcount =0;0;/隧道中车辆数隧道中车辆数intint n_an_a =0;0;/甲方排队等候进入隧道的车辆数甲方排队等候进入隧道的车辆数intint n_bn_b =0;0;/乙方排队等候进入隧道的车辆数乙方排队等候进入隧道的车辆数甲方车辆进程甲方车辆进程()()semWait(mutex_a);semWait(mutex_a);n_a+;n_a+;semSignal(mutex_a);semSignal(mutex_a);semWait(S_A);semWait(S_A);sem
28、Wait(mutex_count);semWait(mutex_count);count+;count+;semSignal(mutex_count);semSignal(mutex_count);if(n_b=0)if(n_b=0)semSignal(S_A);semSignal(S_A);进入隧道进入隧道;通过隧道通过隧道;semWait(mutex_a);semWait(mutex_a);n_a-;n_a-;semSignal(mutex_a);semSignal(mutex_a);semWait(mutex_count);semWait(mutex_count);count-;coun
29、t-;semSignal(mutex_count);semSignal(mutex_count);elseelse 进入隧道进入隧道;通过隧道通过隧道;semWait(mutex_a);semWait(mutex_a);n_a-;n_a-;semSignal(mutex_a);semSignal(mutex_a);semWait(mutex_count);semWait(mutex_count);count-;count-;if(count=0)if(count=0)semSignal(S_B);semSignal(S_B);semSignal(mutex_count);semSignal(m
30、utex_count);类似可得到乙方车辆进程过程。类似可得到乙方车辆进程过程。31读者进程读者进程()()while(1)while(1)semWait(z);semWait(z);semWait(rmutex);semWait(rmutex);semWait(x);semWait(x);readcount+;readcount+;if(readcountif(readcount =1)1)semWait(wmutex);semWait(wmutex);semSignal(x);semSignal(x);semSignal(rmutex);semSignal(rmutex);semSigna
31、l(z)semSignal(z)执行读操作执行读操作;semWait(x);semWait(x);readcount-;readcount-;if(readcountif(readcount =0)0)semSignal(wmutex);semSignal(wmutex);semSignal(x);semSignal(x);写者进程写者进程()()while(1)while(1)semWait(y);semWait(y);writecount+;writecount+;if(writecountif(writecount =1)1)semWait(rmutex);semWait(rmutex)
32、;semSignal(y);semSignal(y);semWait(wmutex);semWait(wmutex);执行写操作执行写操作;semSignal(wmutex);semSignal(wmutex);semWait(y);semWait(y);writecount-;writecount-;if(writecountif(writecount =0)0)semSignal(rmutex);semSignal(rmutex);semSignal(y);semSignal(y);6.6.补充补充1 1某寺庙,有小和尚,老和尚若干。有一水缸,有小和尚提水入缸供给某寺庙,有小和尚,老和尚若
33、干。有一水缸,有小和尚提水入缸供给老和尚用,老和尚也用水桶取水。水缸可容老和尚用,老和尚也用水桶取水。水缸可容1010桶水。水取自同一井中。桶水。水取自同一井中。水井径窄,每次只能容一个桶取水。水桶总数为水井径窄,每次只能容一个桶取水。水桶总数为3 3个。每次入缸取水个。每次入缸取水仅为一桶水,且不可同时进行。试用给出模拟小和尚和老和尚进程的仅为一桶水,且不可同时进行。试用给出模拟小和尚和老和尚进程的算法描述。同时请说明所使用信号量的含义算法描述。同时请说明所使用信号量的含义。32 参考答案参考答案 semaphore emptysemaphore empty =1 10;0;/表示缸中目前还
34、能装多少桶水,初始时能装表示缸中目前还能装多少桶水,初始时能装1 10 0桶水桶水semaphore fullsemaphore full =0;0;/表示缸中表示缸中目前目前有多少桶水,初始时缸中没有水有多少桶水,初始时缸中没有水semaphore bucketssemaphore buckets =3 3;/表示表示目前目前有多少有多少个个空桶可用,初始时有空桶可用,初始时有3 3个个桶可用桶可用semaphore mutex_wellsemaphore mutex_well =1;1;/用于实现对井的互斥操作用于实现对井的互斥操作semaphore mutex_jarsemaphore
35、mutex_jar =1;/1;/用于实现对缸的互斥操作用于实现对缸的互斥操作young_monk()young_monk()while(1)while(1)semWaitsemWait(empty);(empty);semWaitsemWait(buckets);(buckets);go to the well;go to the well;semWaitsemWait(mutex_well);(mutex_well);get water;get water;semSignalsemSignal(mutex_well);(mutex_well);go to the temple;go to
36、the temple;semSignalsemSignal(mutex_(mutex_j jar);ar);p pourour the water into the big the water into the big jar;jar;semSignalsemSignal(mutex_jar);(mutex_jar);semSignalsemSignal(buckets);(buckets);semSignalsemSignal(full);(full);33old_monk()old_monk()while(while(1 1)semWaitsemWait(full);(full);semW
37、aitsemWait(buckets);(buckets);semWaitsemWait(mutex_jar);(mutex_jar);get water;get water;semSignalsemSignal(mutex_jar);(mutex_jar);drink water;drink water;semSignalsemSignal(buckets);(buckets);semSignalsemSignal(empty);(empty);6.6.补充补充2 2有一个超市,最多可容纳有一个超市,最多可容纳N N个人进入购物,当个人进入购物,当N N个顾客满员时,后到的个顾客满员时,后到
38、的顾客在超市外等待;超市中只有一个收银员。可以把顾客和收银员看顾客在超市外等待;超市中只有一个收银员。可以把顾客和收银员看作两类进程,两类进程间存在同步关系。写用作两类进程,两类进程间存在同步关系。写用P;VP;V操作实现的两类进操作实现的两类进程的算法(程的算法(20032003年系统设计员考试的题目)年系统设计员考试的题目)3435 参考答案参考答案 semaphore semaphore SnSn =N N;/表示还可以允许多少顾客进入超市,初值为表示还可以允许多少顾客进入超市,初值为N Nsemaphore semaphore S_customerS_customer =0;0;/表示
39、有没有顾客要付款表示有没有顾客要付款semaphore semaphore S_cashierS_cashier =0 0;/表示有没有收银员在收费表示有没有收银员在收费Customer()Customer()while(1)while(1)P(Sn);P(Sn);进入超市进入超市;在超市购物在超市购物;V(S_customer);V(S_customer);P(S_cashier);P(S_cashier);付款付款;离开超市离开超市;V(Sn);V(Sn);Cashier()Cashier()while(1)while(1)P(S_customer);P(S_customer);收费收费;
40、V(S_cashier);V(S_cashier);6.6.补充补充3 3一家四人父、母、儿子、女儿围桌而坐;桌上有一个水果盘;当水果一家四人父、母、儿子、女儿围桌而坐;桌上有一个水果盘;当水果盘空时,父亲可以放香蕉或者母亲可以放苹果,但盘中已有水果时,盘空时,父亲可以放香蕉或者母亲可以放苹果,但盘中已有水果时,就不能放,父母等待。当盘中有香蕉时,女儿可吃香蕉,否则,女儿就不能放,父母等待。当盘中有香蕉时,女儿可吃香蕉,否则,女儿等待;当盘中有苹果时,儿子可吃,否则,儿子等待。等待;当盘中有苹果时,儿子可吃,否则,儿子等待。3637 参考答案参考答案 semaphore emptysemaph
41、ore empty =1 1;/盘子为空盘子为空semaphore semaphore bananabanana =0;0;/盘子里没有香蕉盘子里没有香蕉semaphore semaphore appleapple =0 0;/盘子里没有苹果盘子里没有苹果Father()Father()while(1)while(1)剥香蕉剥香蕉;semWait(empty);semWait(empty);把香蕉放入盘子把香蕉放入盘子;semSignal(banana);semSignal(banana);Mother()Mother()while(1)while(1)削苹果削苹果;semWait(empty);semWait(empty);把苹果放入盘子把苹果放入盘子;semSignal(apple);semSignal(apple);Daughter()Daughter()while(1)while(1)semSignal(banana);semSignal(banana);从盘子取香蕉从盘子取香蕉;semWait(empty);semWait(empty);吃香蕉吃香蕉;Son()Son()while(1)while(1)semSignal(apple);semSignal(apple);从盘子取苹果从盘子取苹果;semWait(empty);semWait(empty);吃苹果吃苹果;
限制150内