2. 计算进程 PC和打印进程P01、 P02共享一个单缓冲区,计算进程负责计算,并把计算结果放入单缓冲中;打印进程 P01、P02 则负责从单缓冲中取出计算结果进行打印,而且对每个计算结果, P01和P02 都需分别打印一次。请用记录型信号量描述上述进程间的同步关系。
wait(s) 就是s减1; 如果原来是0; 那么就是wait(0);
与C语言中的while很像, while(0)就是不进入循环 ,一直等到while(1)再进入循环可以这么理解,但实际while直接不执行循环里的语句,跳过去了) 如果原来>0;
直接减1,s的资源少了一个; 如果原来<0;
那么跟0一样还要等,等到大于0,继续执行。 signal(s)就是s加1;
原理同上。
【 11分】
可设置四个信号量: full1表示缓冲中是否有可供P01打印的计算结果, full2表示缓冲中是否有可给P02打印的计算结果; emptypl、empty2 则表示计算结果是否已被 P01l、P02 取走,只有当一个结果被两个打印进程都取走后,缓冲区才变空,计算进程才可将下一个计算结果放入单缓冲。
Var empty1, empty2, full1, full2: semaphore:=1,1,0,0; Begin Parbegin PC:begin Repeat
computrt next number; wait(empty1) : wait (empty2) ;
add the number to bufer; signal(full1); signal (full2); Until false; end
P01: begin repeat
wait (full1) ; take from bufer; signal (emptyl) : print last number; until flase; end
P02 :begin Repeat
wait (full2) ; take from buffer; signal (empty2); print last number; until false end parend end
3. 设有三个进程,输入进程 (input)、计算进程(compute)和输出进程 (output),它们通过共享两个缓冲区 buf1和buf2 协作完成任务。如下图所示
三个进程之间的合作关系如下:
(1 )输入进程使用 put()函数把数据送到buf1,供计算进程调用 calculate()函数计算; (2 )计算进程每次调用 get()函数从buf1 取出已输入的可计算的数据进行计算,并把计算结果使用 put()函数把数据送到buf2送入 buf供输出进程打印;
(3 )输出进程调用 get()函数把buf2 中的数据使用 print()函数输出。 定义合适的信号量,并用伪代码完成实现过程。
4. 设系统中有三类资源 A、B 和C,又设系统中有 5个进程P1 ,P2, P3,P4 和P5。在 T0时刻系统状态如下: 最大需求量 已分配资源量 剩余资源量
A B C A B C A B C P1 P2 P3 P4 P5 1 2 10 0 0 3 1 6 3 1 7 5 1 0 0 2 3 5 1 3 5 0 6 4 0 0 2 0 6 5 0 0 1 (1 )系统是否处于安全状态?(请给出详细的判断过程)如是,则给出进程安全序列。 (2 )如果进程 P5申请1 个资源类 A和1 个资源类 C,能否实施分配?为什么? 5. 设有五道作业,它们的提交时间和运行时间见下表,试给出在如下表所示的三种调度算法下,作业的执行顺序,以及平均周转时间和带权平均周转时间:
(1) 先来先服务调度算法; (2) 短作业优先调度算法; (3) 响应比高优先调度算法。
作业提交和运行时间表
作业名 J1 J2 J3 J4 J5 提交时间 /h 10.1 10.3 10.5 10.6 10.7 需执行时间 /h 0.8 0.5 0.4 0.3 0.2 6. 假设系统有同类资源 10个,供P ,Q、 R三个进程共享,P、 Q、R 所需资源总数分别为 8、4 、9,它们申请资源的次序和数量如下表所示。
进程资源申请表 次序 1 2 3 4 5 6 … 进程 R P Q P R Q … 申请量 2 4 2 2 1 2 … 按银行家算法为它们分配资源: (1) 写出执行完序号为 6的申请时,各进程的状态和已占的资源数。 (2) 请估计系统是否会出现死锁,并简要说明理由。 7.下面给出的两个进程互斥的算法是安全的吗?为什么?