进程可以通过调用原语send()和receive()来通信。有不同的设计方案可供实现每一个原语。
消息传递可以是阻塞(blocking)或非阻塞(non-blocking)----------也称为同步(synchronous)和异步(asynchronous)。
- 阻塞发送(Blocking send):发送进程是阻塞的,直到消息被接收进程或者邮箱所接收了。
- 非阻塞发送(Nonblocking send):发送进程发送消息,并继续操作
- 阻塞接收(blocking receive):接收者是阻塞的,直到有消息可用为止。
- 非阻塞接收(Nonblocking receive):接收方检索一个有效的消息或一个NULL。
不同的send()和receive()可以自由组合。
当send()和receive()都是阻塞的,则在发送者和接收者之间就有一个集合点(rendezvous)。当使用阻塞的send()和receive(),如何解决生产者---消费者问题就不再重要了。生产者仅仅需要调用阻塞的send()系统调用,并等待,直到消息被发送到接收者或邮箱。
同样的,当消费者调用receive(),他也会阻塞直到有可用消息。
如下面代码所示:
message next_produced;
while(true){
//在next_produced中产生下一个条目
...
send(next_produced);
}
message next_consumed;
while(true){
receive(next_consumed);
//消费next_produced中的条目
...
}