进程可以通过调用原语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中的条目
    ...
}

results matching ""

    No results matching ""