标签:
为了避免多处理机的构造困难,造价高昂的问题,多计算机(multicomputes)成为一个更加容易构建的系统。因为其基本部件只是一台配有高性能网络接口卡的PC裸机。获得高性能的设计互联网络以及接口卡。这与多处理机中构造共享储存器是完全类似的。
1.互联技术
也就网络拓扑有多种连接方式主要的有:
两种交换机制:
包交换:每个消息首先被分解成为有最大长度限制的块,称为包。储存转发包交换(store-and-forward packet switching)。
电路交换(circuit switching):包括由第一个交换机建立的,通过所有交换机而到达目标交换机的一条路径。一旦路径建立比特流就可以从源到目的地通过整个路径不断地尽快输送。
2.网络接口
在所有的多计算机中,接口板上都有一些用来储存进出包的RAM。因为通常互联网都是同步的,因此需要源源不断的按照恒定的比特速率来进行发送数据,如果使用主RAM,则无法做到这一点。因此需要使用专门的RAM。接受端也同样需要专门的RAM接受。
接口板上可以有一个或多个DMA通道。通过请求在系统总线上的块传送(block transfer),DMA通道可以在接口板和主RAM之间以非常高的速率复制包,因而可以一次性传送若干字而不需要为每个字节分别请求总线。
很多接口板上有cpu和DMA,它们被称为网络处理器(network processor),并且其功能日趋强大。
多计算机系统中高性能通信的最大障碍是对包的过度复制。
最好的情况下,源节点从RAM复制到接口板,从发送端的接口板复制到接收端的接口板,最后从接收端的接口板发送到接收端的RAM。一共有三次复制。
但是如果接口板被映射到内核虚拟地址,那还需要用户进程发送一个陷入到内核的系统调用的方式来完成一次从内核虚拟地址道内存虚拟地址的复制。加上之前的三次复制,一共需要五次复制。
因此很多计算机将接口卡直接映射到用户虚拟地址,但是这样带来两个问题:
节点至网络接口通信
如何将包发送到接口卡板上,最快的方法是使用板上的DMA芯片直接将他们从RAM复制到板上。但是DMA使用物理地址而非虚拟地址,并且其独立于CPU运行。(个人认为原书中并没有解释清楚如何解决这个问题)
简单的情形:将消息传送暴露给用户进程。操作系统提供一种发送和接受消息的途径,而库过程使得这些底层的调用对用户进程可用。
复制的情形:通过使得远程通信看起来像过程调用的方法,将实际的消息传递对用户隐藏起来。
1.发送和接受
发送一条消息的调用:send(dest,&mptr),由mptr参数所指向的消息发送给由dest参数所标识的进程,并且引起调用者的阻塞,直到该消息被发出。
接受一条消息的调用:receive(addr,&mptr),引起调用者的阻塞,直到消息到达。消息到达后,被复制到有mptr参数所指向的缓冲区,并撤销对调用者的阻塞。addr参数指定了接受者要监听的地址。
编址:使用两部分编码一部分是cpu编号,另一部分在这个已编址的cpu上的一个进程或者端口的编号。
2.阻塞调用和非阻塞调用
以上内容为阻塞调用(同步调用)。
非阻塞调用(异步调用):
发送端
send是非阻塞的,在消息发送之前,它立即将控制返回给调用者。
优点是发送进程可以继续运算,与消息传送并行,而不是让cpu空闲。
缺点是直到消息被送出发送者才能修改消息缓冲区,更糟糕的是进程不知道何时传递会结束。
解决方案:
正常情况下依然是阻塞式最好,特别是在有多线程的情况下。
接收端
阻塞调用就是挂起调用者直到消息到达为止。如果有多线程可用这是一种有效而简单的方式。
非阻塞receive只是通知内核缓冲区所在的位置,并几乎立即返回控制。
多种方通知程序已经接收到消息:
以上讨论的均是采用消息传递模型。其缺点是所有通信的泛型均是输入/输出,过程send和receive基本上都是在做IO。
另一种完全不同的技术:远程过程调用(Remote Procedure Call,RPC)运行cpu调用位于其他cpu中的过程,已经成为大量多计算机的软件的基础。
基本思想是尽可能使远程过程调用想本地调用。
最简单的情形:客户程序必须绑定在一个称为客户端桩(client stub)的小型库过程上,它在客户机地址空间中代表服务器过程。类似的服务器也绑定一个称为服务器端桩(server stub)的过程上。
基本步骤:
实现相关的问题
RPC虽然比较复杂,但是其实还是被广泛使用了的。
分布式共享储存器(Distributed Shared Memory,DSM)很好的保留共享储存的幻觉,尽管这个共享储存实际上并不存在。
实现的共享的方式分成两种:
实际上物理实现的共享内存处于操作系统和硬件之间
在DSM系统中,地址空间被划分为页面(page),这些页面分布在系统中的所有节点上。当一个cpu引用了一个非本地的地址时?就产生了一个陷阱,DSM软件调取包含改地址的页面并重新开始执行中断的指令
1.复制
基本的改进是只复制只读的页面。
另一种改进是不仅复制只读页面,而且复制所有的页面。如果复制的页面被修改了需要额外的机制保持一致性。
2.伪共享
DSM与多处理机的一个不同是,多处理可以使用高速缓存,高速缓存块的大小通常是32字节或64字节,这是为了避免占用总线过程时间,而DSM块必须是页面大小的整数倍,因此大了很多。
大的页面优点是:网络传输的启动时间很长,传输长页面和传输短页面时间差不多。
缺点是:
大页面传输长期占用网络,阻塞了其他进程。
还会引起伪共享(false sharing),两个进程的变量存放在同一个块中,且两个进程分别属于不同cpu,这样就要去这个块在两个进程分别所属的cpu直接不断的交换传递。
3.实现顺序一致性
如何解决对复制的块进行了修改并保持了一致性的问题:
DSM在对一个共享页面进行写入之前,先向所有持有该页面副本的cpu发出一条消息,通知他们解除并丢弃该页面。等其所有解除映射完成之后,该cpu再进行写操作。
如果有更详细的约束,也可以允许写页面的多个副本,
在多计算机中,每个节点由自己的储存器和进程集合,因此如何将工作分配到节点上更为重要。
多计算机调度和多处理机类似,但是不是所有算法都相同,比如维护进程就绪的中心链表就不可以,因为每个进程只在当前的cpu上运行。
可以采用群调度,但是需要额外的协议保证同时性。
处理器分配算法(processor allocation algorithm),通常
可知的进程属性:包括cpu需求、储存器使用以及每个进程与其他进程的通信量
可能的目标:由于缺少工作而浪费的cpu时间、最小化总的通信带宽、以及确保用户和进程公平性。
1.图论确定算法:
以最小的网络流量完成分配。每个顶点是一个进程,每条弧表示两个进程之间的通信量。寻找一个将图分割(切割)为k个互不连接的子图的方法。
2.发送者发起的分布式启发算法
当进程创建时,它就运行在创建它的节点上,除非该节点过载了,过载节点的度量可能涉及太多的进程,过大的工作量,或者其他度量。如果过载了,该节点随机选择另一个节点并询问其负载情况。如果其负载低于一定情况则将其新进程送到该空闲询问节点上运行。如果其负载不低于某个阈值则选择另一机器,在N次探查内,如果没有找到合适的主机,算法终止。
缺点是在重负载的情下,太多的询问降低效率
3.接受者发出的分布式启发算法
基本同上,区别是由空闲者发出请求。
实际中可以将2和3的算法结合在一起。
标签:
原文地址:http://blog.csdn.net/u011518120/article/details/51990776