直接通信

一个进程直接发送消息给接受者进程的进程通信方式称为「直接通信」,要求发送进程和接收进程都以显示的方式提供对方的标识符。通常系统提供两条通信原语

  • 原语 send(P,消息):把一个消息发送给进程 P
  • 原语 receive(Q,消息):从进程 Q 接收一个消息

通常一个进程可以与多个进程通信, 即可以向多个进程发送消息,也可以接收来自多个进程的消息。为了便于进程接收和处理这些消息,一般采用「消息队列」通信机制,将消息组织成消息队列,用链指针链接起来,头指针放在进程的 PCB 中。

消息记录体可以表示为

type Msg = record
	MsgSend;
	MsgSize;
	MsgText;
	MsgNext;
end

PCB 中部分数据可以表示为

type PCB = record
	......
	Msgmq;  // 首指针 
	MsgMutex;  // 互斥信号量
	MsgSm;  // 资源信号量
	......
end
  • 发送进程在自己地址空间设置一发送区,将发送的消息正文,发送者进程标示符,消息长度填入其中,然后调用发送原语。
  • 发送原语根据发送区的消息长度,申请一缓冲区,将发送区的消息复制到缓冲区中。并获得接收进程的内部标识符,然后将缓冲区挂在接收进程的消息队列上。
  • 接收进程调用接收原语,从自己的消息队列中摘下消息队列中的消息,并将其中的数据复制到指定的消息接收区。

用图像可以表示为

img-2024-04-10 19-37-46.png

由于消息本身是临界资源,因此必然涉及到同步互斥信号量

  • 互斥信号量(mutex):对消息对列指针的操作
  • 等待信号量(swait):消息资源数

具体来说,发送时

wait(mutex);
将消息链入队列; 
signal(mutex);
signal(swait);

接受时

wait(swait);
wait(mutex);
从队列中摘取消息; 
signal(mutex);