ACE之通信的设计空间

本篇文章主要介绍

.无连接的和面向连接的协议之间的对比

.同步的和异步的消息交换之间的对比。

.消息传递和共享内存之间的对比。

1:无连接和面向连接的协议对比

  协议(protocol)是指一组规则,这些规则指明控制和数据信息如何在通信实体之间进行交换,比如说网络计算机环境内部做交互的应用进程这样的通信实体之间进行交换,协议通常分为无连接和面向连接的,在这一空间中需要做权衡取舍的方面主要包括延迟、可伸缩性和可靠性。

  无连接的协议提供了一种面向消息的服务,在这一服务中,每个消息都可以独立做路由和派发。无连接的协议经常使用“尽力而为”的传送语义,这样的语义并不保证一系列的消息会以某个特定的顺序到达它们的目的地,甚至不能保证它们能够到达目的地。

  用户数据报协议(User Datagram Protocol,UDP)和网际协议(Internet Protocol,IP)是两个广泛使用的无连接协议的例子,这些协议可以由诸如IP语音或流式视频一类的多媒体应用直接使用,这些应用可以容忍某种程度的数据丢失,UDP/IP还支持不可靠的组播和广播功能,这些功能是一个发送方可以与一组接收方通信。

  面向连接的协议提供了一个可靠、有序、不重复的发送服务,对于不能容忍数据丢失的应用来说,这一协议很有用,为了提高性能并确保可靠性,面向连接的协议交换和维护发送方和/或(一个或多个)接收方的状态信息。传输控制协议(TCP)就是一个面向连接的协议,他被应用在许多诸如web服务和电子邮件一类的面向会话的互联网应用中。

  在使用面向连接的协议的时候,应用和中间件的开发者还需要从如下的可选设计方案中做出选择:

(1):面向连接的协议提供了不同类型的数据组帧策略,例如,面向消息的传递策略由诸如TP4和XTP这样的一些面向连接的协议提供支持,相比之下,TCP则是一个并不保留应用消息的边界的字节流(bytestream)协议,因此,如果一个应用做了四次send()调用来通过TCP传输四个不同的消息的话,那么将有一个或多个(有可能多于四个)TCP段被传送给接收方。如果应用为此要求的是面向消息的派发的话,则发送方和接收方必须执行额外的处理把经由TCP交换的四个消息组成帧。如果消息的长度总是相等的,且网络错误从未发生,那么组成帧过程就会相对简单,否则,这将会一个不可忽视的问题。

(2):连接的多路复用策略

  在一个面向连接的协议上传输数据的两种常见的策略如下:

  

.多路复用。在这种连接策略中,从单个进程的多个线程发出的所有客户端请求都通过一个TCP连接传给服务器端进程,如上图(1)连接多路复用的一个优点是:节省了OS(操作系统)的诸如socket句柄和连接控制块一类的通信资源。这一策略的缺点是,编程的难度更高一些,效率更低一些,且不确定性更大一些。这些问题源于同步和上下文切换机制,这些机制需要把一个多路复用连接上的请求和应答关联起来。

.非多路复用。在这种策略中,每个客户端使用一个不同的连接来与一个对等的服务通信,如图(2)所示,非多路复用的连接的一个主要优点是对通信的优先级能进行的更好的控制,在非多路复用的连接设计中,每个连接的优先级可以做单独设置,这样具有高优先级的通信就会被较快的传递出去,即使在其他的线程之间存在着大量的低优先级的通信也是如此,这种设计避免了优先级的倒置,在这种情况下,低优先级线程会独占单一的一个多路复用连接。此外由于连接是非共享的,因此这一策略会带来较低的同步开销,因为不需要额外的锁来发送和接收双向的请求,与多路复用连接策略相比,非多路复用策略使用了更多的OS资源,因此在诸如大规模的互联网电子商务服务器一类的环境中,其伸缩性不是太好。

2:同步和异步的消息交换对比

  在许多网络应用中,客户端给服务器端发送一个请求,服务器处理请求后往回发送一个响应,这些请求/响应协议既可以在无连接协议上实现,也可以在面向连接的协议上实现,安排请求/响应(request/response)协议做交换的两种可选策略分别是同步的和异步的

  如下图所示:

      (1)同步消息交换策略                  (2)异步消息交换策略

影响到是选异步还是同步的消息交换策略的两大元素是:

(1)请求之间的相互关联性

(2)底层协议或通信介质的延迟

同步的请求/响应协议是最简单的实现形式,在这类协议中,请求和响应是以一种锁步(lock-step)顺序进行交换的,每个请求在下一个请求发送之前都必须要同步接收到一个响应,如上图(1)所示,同步的请求/响应协议适用下列情况

  .当请求的结果决定决定了后续的请求时,例如,一个要求验证交换的应用必须要等到安全证书完全成功交换之后才会发送敏感信息请求。

  .当用户交换的信息需要在低延迟网络中做短时间处理时,例如,在高速局域网络中NFS(网络文件系统 Network File System)的read()和write()操作

异步的请求/响应协议的请求持续地从客户端发向服务器而无须同步等待响应,在任何来自服务器端的响应到达之前,多个客户端请求就可以传送出去,如上图(2),因此,异步的请求/响应协议往往要求有一种检测请求丢失或失败,并在之后重新发送它们的策略。异步的请求/响应适用于下列情况:

  .在决定后续的请求之前不需要响应的时候,例如,Web浏览器可以使用异步策略从同一服务器提取多个内嵌的图像,由于每个请求都是独立的,因此它们都可以做异步的发送而无须等待响应,每个响应都包含了浏览器可用来把它与之相应的请求做匹配的信息,即便是响应的顺序与请求发送的顺序不一致也不会出现问题。

  .当通信延迟与请求所要求的处理时间高度相关的时候,异步请求策略有助于高效地使用网络,减少高延迟的影响。与关联响应和请求,以及正确实现重试策略所带来的额外复杂性相比,由此产生的性能改善更加有价值。

3:消息传递和共享内存的对比

  以上讨论的都是假设消息是在驻留与不同计算机上的对等端(peer)之间做传输的,这种交换方式被称作消息传递。当通信的对等端访问某个共享内存区域时,就会出现另一种类型的消息交换。

  消息传递是IPC(进程间通信)机制来显示地交换字节流和面向记录的数据。应用开发者通常会定义这些消息的格式和内容,以及参与者必须遵循的用于交换消息的应用协议。相应应用协议还定义了每个交换【如点对点(点播,组播或广播】的可能参与者的个数,以及参与者开始、进行以及结束每个消息传递会话的方式。

  

  消息传递IPC机制通过一个IPC通道把数据以消息的方式从一个进程或线程传递到另一个进程或线程中,如上图(1)所示,如果有大量的数据要做传输的话,数据可能会做分段处理,然后在消息序列中进行发送。如果有多于一个进程在接收数据的话,每个消息可能都要发送多次,每次发给一个接收者。许多流行的中间件框架,如RPC以及面向消息的中间件(Message-Oriented Minddleware, MOM)等,其内部都是基于消息传递这一通信模型的。

  共享内存(shared memory)允许位于同一或不同主机上的多个进程访问和交换数据,就像数据本身就位于每个进程的本地地址空间中一样,当网络应用拥有需要由多个进程来查看和/或操纵的数据时,共享内存的措施可能是比消息传递更有效的通信机制。使用了本地的OS共享内存机制的应用需要定义的是,定位和映射共享内存区域的方式,以及放置在共享内存中的数据结构,而不是定义在实体之间传输消息的方法。

  共享内存可分为本地的和分布式的,具体介绍如下:

  

  本地的共享内存

  本地的共享内存允许位于同一计算机上的多个进程把一个或多个共享内存区域映射到不同的虚拟地址空间上,两种常见的共享内存机制如下:

  (1)System V UNIX 共享内存:  在这种情况下,shmget()系统函数创建一个新的共享内存区域或返回一个现有的,进程使用shmat()系统函数把共享内存区域挂接到它们的虚拟地址空间上。

  (2)内存映射文件:  在这种情况下,某个文件的部分或者全部都可以被映射到虚拟内存的某一块上,这部分虚拟内存跨多进程共享。映射到内存文件的内容可被刷新到永久存储器中,这种做法提供了一种便捷地保存和恢复跨程序执行的信息的途径。

在这两种机制中,OS都能够让多个进程把共享内存区域映射到它们的地址空间中,如上图(2),所有映射了共享内存区域的进程都能够直接对共享内存进行读写操作。

尽管共享内存很灵活,但通过共享内存在多个进程间进行通信的编程要非常小心,例如,应用开发者必须确保被共享的数据不会被竞争条件所破坏。

分布式的共享内存

   分布式的共享内存(distributed shared Memory,DSM)是一种编程抽象,它为应用提供了OS虚拟机制的一个扩展。虚拟内存提供了一组根据需要来提取、放置和取代一组页面的策略,以给程序这样一种错觉,即它们拥有比物理内存多得多的可用地址空间。DSM把虚拟内存概念扩展到了整个网络上,使得经由全局/共享内存中的数据进行透明化的进程化的进程间通信成为可能。它代表了两种计算范式的一个混合模式,这两种计算范式分别是:共享内存的多处理器和分布式系统。

  例如,存在这样的硬件/软件平台,这些平台把多台计算机集群成一个逻辑系统,在一系统中,内存是横跨集群共享的,参与其中的应用通过托管在整个网络的计算机上的共享内存来进行通信。DSM系统提供了横跨进程和网络节点的协调更新机制,这一通信模型通常在其较低的层面中采用消息传递机制来协调数据的交换及同步数据的读取和写入者。

本节完毕!!!!

原文地址:https://www.cnblogs.com/cxq0017/p/6426595.html