内容发布更新时间 : 2024/11/18 18:45:03星期一 下面是文章的全部内容请认真阅读。
一组消费者B1 , B2 ,? Bn2 共用m 个缓冲区,每个缓冲区只要写一次,但需要读n2 次。因此,可以把这一组缓冲区看成n2 组缓冲区,每个发送者需要同时写n2 组缓冲区中相应的n2 个缓冲区,而每一个接收者只需读它自己对应的那组缓冲区中的对应单元。
应设置一个信号量mutex 实现诸进程对缓冲区的互斥访问;两个信号量数组empty[n2]和full[n2]描述n2 组缓冲区的使用情况.其同步关系描述如下: var mutex , empty[n2],full[n2]:semaphore ; i :integer ; mutex=1 ; for(i=0;i<=n2-1;i++) {
empty[i]=m; Full[i]=0; }
main ( ) {
cobegin A1 ( ) ; A2 ( ) ; ?
An1 ( ) ; B1 ( ) ; B2 ( ) ; ?
Bn2 ( ) ; coend
send ( ) / *进程Ai 发送消息*/ { int i ;
for (i=0;i<=n2-1;i++); P(empty[i]); P (mutex ) ;
将消息放入缓冲区; V (mutex ) ;
for(i=0;i<=n2-1;i++) V(full[i]); }
receive (i) /*进程Bi 接收消息*/
{
P(full[i]);
P(mutex);
将消息从缓冲区取出; v (mutex ) ; v ( empy[i]) ;
Ai ( ) / *发送进程A1 , A2 ,? An1 的程序类似,这里给出进程Ai 的描述*l { {
While(1) { ?
send ( ) ; ? } }
Bi ( ) /*接收进程Bl , B2 ,? BnZ 的程序类似,这里给出进程Bi 描述*/ {
while(i) ( ?
receive ( i ) ; ? } }
某系统有R1 设备3 台,R2 设备4 台,它们被Pl 、PZ 、P3 和P4 进程共享,且己知这4 个进程均按以下顺序使用设备:
一申请Rl 一申请R2 一申请RI ~释放Rl 一释放R2 一释放Rl ( 1 )系统运行中可能产生死锁吗?为什么?
( 2 )若可能的话,请举出一种情况,并画出表示该死锁状态的进程一资源图. 答:( l )系统四个进程需要使用的资源数为Rl 各2 台,R2 各1 台。可见资源数不足,同时各进程申请资源在先,有可能产生死锁发生的四个条件,故系统可能产生死锁。( 2 )当三个进程执行完申请资源Rl ,开始执行申请资源R2 时,第四个进程会因没有资源Rl 而被阻塞。当三个进程执行完申请资源R2 后,系
统还剩1 个R2 资源。而这三个进程因执行申请第二个资源Rl 而全部被阻塞,系统进入死锁。
34 如图所示,左右两队杂技演员过独木桥,为了保证安全,请用PV 操作和信号量来解决过独木桥问题。只要桥上无人,则允许一方的人过桥,待一方的人全部过完后,另一方的人才允许过桥。
答:
var wait ,mutex1 ,mutex2 , bridge1 , bridge2 : semaphore ; mutex1:=mutex2:=bridgel:=bridge2:=1;wait:=0; counter1 , counter2 : integer ; cobegin {
process P 左 process P 右 begin begin
P ( mutex1 ) ; P ( mutex2 ) ; Count1 ++; count2 ++;
if count1 = 1 then P( wait ) ; if count2 = 1 then P( wait ) ; V ( mutex1 ) ; V( mutex2) ; P(bridge1) ; P ( bridge2 ) ; 过独木桥; 过独木桥;
V ( bridge1) ; V( bridge2 ) ; P ( mutex1) ; P ( mutex2 ) ; Count1-- ; count2--;
if count1 = 0 then V(wait) ; if count2 = 0 then P (wait) ;
V ( mutex1) ; V (mutex2) ; end ; end ; } coend
35 修改读者一写者的同步算法,使它对写者优先,即一旦有写者到达,后续的读者必须等待,而无论是否有读者在读文件。(1 )用信号量和P 、v 操作实现;( 2 )用管程实现。
答:(1)用信号量和P、V操作实现
为了提高写者的优先级,增加了一个信号量S,用于在写进程到达后封锁后续的读者。其控制流程如下:
Var rmutex,wmutex,s:semaphore; Rmutex=1;wmutex=1;s=1; Count:integer:=0; Main() {cobegin Reader(); Writer(); Coend } Reader() Begin While(1)
{ P(s); P(rmutex);
If(count==0) P(wmutex); Count++; V(rmutex); V(s); 读文件; P(rmutex); Count--;
If (count==0) v(wmutex); V(rmutex); } Writer() Begin While(1) { P(s); P(wmutex); 写文件; V(wmutex); V(s); } End.
(2)用管程实现