⑤当接收进程执行到receive系统调用命令时,也产生自愿性中断,进入操作系统核心;
& H# p, y* F1 D) G2 l⑥操作系统将载有消息的缓冲区从消息队列中取出,并将消息内容拷贝到接收进程空间中,然后收回空闲缓冲区;接收进程完成了消息接收,返回到用户态继续执行;
6 L3 a+ F# i. I- X5 L(①、②、④、⑥为2分;③、⑤为1分), d- T5 T% u/ d0 W2 y5 ]
(3)要点:①消息缓冲区的数据结构为:7 t" W6 j }% j5 R
TypeMessage=Recoud* L- j i+ `, |% f! E
Sender(消息发送者)4 _. g- s3 Q+ G/ P# p5 Y
Size(消息长度)
3 ~4 Q9 `9 Z$ C$ M5 {6 dtext(消息正文)
: P5 X9 |* d" f, x) ^" _pointer(消息队列指针), g) `# v/ ~! m& z; X
End,
' f. Q' X* P- u$ [% h②设置信号如下:
( u, y5 T1 s! E- l2 y# r( o& M! n*每个接收进程有一个m-mutex:互诉对消息队列的操作,初值为1;
- ~, X& R1 f" l2 ]3 o# n*buffe:管理空闲缓冲区,初值为空闲缓冲区个数;
/ m; J. |( u) J) l3 z' O/ P*b-mutex:互诉操作空闲缓冲区,初值为为1;8 j& n' a; T8 p6 d9 W
*message:管理接收进程消息,初值为0;
3 p+ M( Z+ h7 H: q9 e③Send(receiver,a)
! p3 P' [$ M6 E9 N# ?* \2 x3 c2 X5 TBegin8 R/ y8 l' y3 q$ C
根据参数R寻找接收进程,如果未找到,则出错返回;
5 U6 r. V* [, w' o1 P0 w$ BP(buffer);
" Q2 F- w0 g! H: @& AP(b-mutex);4 `' d& q* C0 a$ j
从消息缓冲区链上摘取一个空闲消息缓冲区;
) y$ |0 Z8 R! w6 \9 A0 wV(b-mutex);' t6 Y; a3 J$ [7 C) F* f
将消息长度及消息正文由a指示由发送区拷贝到消息缓冲区中;
5 F3 v# q/ V) b, F; `将发送进程的名字也记录在该缓冲区中;
0 X& A5 t3 Q' g) qP(m-mutex);
5 }2 F+ w4 N; I1 ^/ M+ ]2 _6 Y将消息缓冲区挂到接收进程消息链的尾部; |