根据发送者和接收者采取的不同行为,可以把进程之间的通信分为单向通信和双向通信。单向通信发送者发送完消息后不等消息被接收者接收就继续前进,接收者接收到信息后也不给发送者发送回答消息;双向通信发送者发送完消息后阻塞等待直到收到接收者的回答消息才继续前进,接收者接收到信息前也阻塞等待直到收到发送者发来的消息,并且给发送者发送一个回答消息。可见,双向通信可用于进程之间需要紧密同步的情况。
消息缓冲机制除了发送者和接收者外,*重要的就是消息缓冲区了。消息缓冲区是指内存中暂存消息的缓冲区。这样就可以描述消息缓冲机制的一次成功的通信过程了。
**步,发送者在发送消息前,先在自己的内存空间设置一个发送区,把欲发送的消息填入其中。
第二步,发送者申请一个消息缓冲区,将已准备好的消息从发送区送到缓冲区,并将发送者进程的名字、消息的开始地址以及消息的长度(一般以字节或者字为单位)等信息填人缓冲区中,然后把该消息缓冲区挂到接收进程的消息链上。
第三步,接收者在接收消息前,在自己的内存空间设置相应的接收区。
第四步,接收者摘下消息链上的**条信息,将消息从缓冲区复制到接收区,并释放该消息缓冲区。
当然,以上的过程只是一个理想的成功过程。实际上,还需要考虑到以下几个问题。
**,接收进程的消息链是临界资源,即对消息队列的操作是临界区,应保证操作满足互斥性。
第二,通信过程的第四步要求接收者摘下消息链上的**条信息,而此时缓冲区中可能没有消息存在。
第三,消息链上也可能挂有多条消息,如何管理消息链上的多条消息。
第四,可能同时存在多个发送者申请缓冲区,也就是说缓冲区也是临界资源。
……