在UNIX系统中,消息传递是沿着通道与连接传送的,而不是直接的从线程到线程。一个线程要接收消息就先要创建一个通道,另外一个线程如果想要向这个线程传递消息就需要创建一个连接附加到该通道上。
通道是消息内核调用所必须的,服务器线程在调用MsgReceive()函数就是使用这个通道来接收消息的。连接由客户线程创建并用于“连接”服务器线程创建的可用通道。一旦连接确定,客户线程就可以使用MsgSend()函数发送消息了。如果一个进程中有多个线程连接到同一个通道,为了效率所有的连接就被映射到同一个内核对象。在一个进程中的通道与连接是使用一个小整数进行命名的。客户连接直接映射为文件描述符。
从架构上来说,这是一个关键点。通过将客户连接直接映射为文件描述符,就消除了使用另一层变换的必要。我们不必“指出”根据文件描述符向哪里发送消息。相反,我们可以很简单的将消息直接发送给“文件描述符”(也就是连接ID)。
这里可以使用的函数如下:
阅读全文…
在UNIX中,消息服务直接从一个线程的地址空间复制消息到另一个线程的地址空间,没有也不通过中间的缓存,这样的话消息传递的性能就接近了底层硬件所支持的最大内存带宽了。对于消息的内容,系统内核没有赋予其特别的含义,只有发送者与接收者才相互的为其约定了特殊的意义。尽管如此,系统也提供了“良好定义”的消息类型以便用户编写的进程或线程可以用来扩充或替换系统提供的服务。
消息原(message primitives)支持多段传输,也就是说从一个线程的地址空间传送到另一个线程的消息不必一定位于单独、连续的缓存上。发送与接收线程都可以指定一个向量表来记录发送以及接收的消息片断在内存中的地址。发送与接收者的消息的每个片断的大小可以是不同的。
消息的多段传输可以让消息头块与消息数据块分离的消息在传输时没有必要执行数据拷贝操作以使其变为一个连续的消息,从而就避免了浪费性能的拷贝操作。另外,如果底层数据结构是环形缓存的话,指定为三段的消息就能够让在这个环形缓存中一个头与两个不相交范围的数据可以在一个元消息(atomic message)中完成传输。硬件上与其等同的就是DMA的发散/聚集功能。
多段传送的示意图如下: 阅读全文…
近期评论