2.进程 A1,A2,...,Anl 通过 m 个缓冲区向进程 B1,B2,...,Bn2 不断地发送消息,发送和接收工作遵循如下规则: (1)每个发送进程一次发送一个信息,写入一个缓冲区,缓冲区大小与消息长度一样;(2)对每一个消息,B1,B2,...,Bn2 都需各接收一次,读入各自的数据区内;(3)m 个缓冲区都满时,发送进程等待,没有可读的消息时,接收进程等待
试用 P、V 操作组织正确的发送和接收操作
解答:这是一个变形的生产和消费问题
每个缓冲区只需写一次,但需读 n2 次
可以把一组缓冲区看做 n2组缓冲区,这样,每个生产者需要同时写 n2 个缓冲区组中相应的 n2 个缓冲区,而每一个消费者只需读它自己对应的那组缓冲区中的单元
生产者须在 n2 个缓冲区都为空闲是方可写入,这时,就可以用 n2 组信息量(avail,free )来实现这一流程,具体流程如下:BEGIN integer mutex,avail[n2],full[n2]; integer I; mutex : =1; for I :=1 to n2 do begin avail [I] := m; full [I] := 0; end; procedure send[M] integer I ; begin for I :=1 to n2 do begin P( avail [I]); end ; P (metux); 将消息放入缓冲区; for I :=1 to n2 do begin V(full [I]); end ; V (metux)end ; procedure receive(M,I) begin P (full[I]); P (metux); 从缓冲区中取消息; V (avail [I]); V (mutex);end ; Cobegin Ai:begin ……
send [M