您的位置:首页 > 理论基础

读书笔记-现代操作系统-8多处理机系统-8.2多计算机

2016-07-22 14:24 253 查看

8.2 多计算机

为了避免多处理机的构造困难,造价高昂的问题,多计算机(multicomputes)成为一个更加容易构建的系统。因为其基本部件只是一台配有高性能网络接口卡的PC裸机。获得高性能的设计互联网络以及接口卡。这与多处理机中构造共享储存器是完全类似的。

8.2.1 多计算机硬件

1.互联技术

也就网络拓扑有多种连接方式主要的有:



两种交换机制:

包交换:每个消息首先被分解成为有最大长度限制的块,称为包。储存转发包交换(store-and-forward packet switching)。

电路交换(circuit switching):包括由第一个交换机建立的,通过所有交换机而到达目标交换机的一条路径。一旦路径建立比特流就可以从源到目的地通过整个路径不断地尽快输送。

2.网络接口

在所有的多计算机中,接口板上都有一些用来储存进出包的RAM。因为通常互联网都是同步的,因此需要源源不断的按照恒定的比特速率来进行发送数据,如果使用主RAM,则无法做到这一点。因此需要使用专门的RAM。接受端也同样需要专门的RAM接受。

接口板上可以有一个或多个DMA通道。通过请求在系统总线上的块传送(block transfer),DMA通道可以在接口板和主RAM之间以非常高的速率复制包,因而可以一次性传送若干字而不需要为每个字节分别请求总线。

很多接口板上有cpu和DMA,它们被称为网络处理器(network processor),并且其功能日趋强大。

8.2.2 底层通信软件

多计算机系统中高性能通信的最大障碍是对包的过度复制。

最好的情况下,源节点从RAM复制到接口板,从发送端的接口板复制到接收端的接口板,最后从接收端的接口板发送到接收端的RAM。一共有三次复制。

但是如果接口板被映射到内核虚拟地址,那还需要用户进程发送一个陷入到内核的系统调用的方式来完成一次从内核虚拟地址道内存虚拟地址的复制。加上之前的三次复制,一共需要五次复制。

因此很多计算机将接口卡直接映射到用户虚拟地址,但是这样带来两个问题:

如果在节点上有若干进程运行而且需要访问网络以发送包,哪一个进程应该获得接口卡?

一个解决方案是,把接口卡的映射到所有需要它的进程中去,但是这样做就需要有一个机制用以避免竞争。需要某种同步机制。

内核本身会经常需要访问互连网络。最简单的设计是使用两块网络接口板,一块映射到内核空间,另一块映射到用户空间。

节点至网络接口通信

如何将包发送到接口卡板上,最快的方法是使用板上的DMA芯片直接将他们从RAM复制到板上。但是DMA使用物理地址而非虚拟地址,并且其独立于CPU运行。(个人认为原书中并没有解释清楚如何解决这个问题)

8.2.3 用户层通信软件

简单的情形:将消息传送暴露给用户进程。操作系统提供一种发送和接受消息的途径,而库过程使得这些底层的调用对用户进程可用。

复制的情形:通过使得远程通信看起来像过程调用的方法,将实际的消息传递对用户隐藏起来。

1.发送和接受

发送一条消息的调用:send(dest,&mptr),由mptr参数所指向的消息发送给由dest参数所标识的进程,并且引起调用者的阻塞,直到该消息被发出。

接受一条消息的调用:receive(addr,&mptr),引起调用者的阻塞,直到消息到达。消息到达后,被复制到有mptr参数所指向的缓冲区,并撤销对调用者的阻塞。addr参数指定了接受者要监听的地址。

编址:使用两部分编码一部分是cpu编号,另一部分在这个已编址的cpu上的一个进程或者端口的编号。

2.阻塞调用和非阻塞调用

以上内容为阻塞调用(同步调用)。

非阻塞调用(异步调用):

发送端

send是非阻塞的,在消息发送之前,它立即将控制返回给调用者。

优点是发送进程可以继续运算,与消息传送并行,而不是让cpu空闲。

缺点是直到消息被送出发送者才能修改消息缓冲区,更糟糕的是进程不知道何时传递会结束。

解决方案:

让内核复制这个消息到内部的内核缓冲区,然后让进程继续。但是额外的复制会降低系统性能

然消息发送之后中断发送者,告知缓冲区可用,处理起来比较麻烦。

让缓冲区写时复制,在消息发送出去之前将其标记为只读,如果缓冲区被重用则进复制。复制导致性能降低

正常情况下依然是阻塞式最好,特别是在有多线程的情况下。

接收端

阻塞调用就是挂起调用者直到消息到达为止。如果有多线程可用这是一种有效而简单的方式。

非阻塞receive只是通知内核缓冲区所在的位置,并几乎立即返回控制。

多种方通知程序已经接收到消息:

中断,编程复杂

使用一个过程poll轮询进来的消息。

一个消息的到达自然的引起一个新线程的创建。(弹出式线程pop-up thread),这个线程运行一个预定义的过程,其参数是一个指向进来消息的指针。处理完这个线程后自动撤销线程。

类似上一种,在中断程序中直接运行接受者代码。消息自身科研带有该处理程序的句柄(handler)。这样当消息到达时,只在少数几个指令中可以调用处理程序。这样做最大的好处是不用复制,称为(主动消息 active messages)。但是又有消息带有句柄,对安全性的要求高。

8.2.4 远程过程调用

以上讨论的均是采用消息传递模型。其缺点是所有通信的泛型均是输入/输出,过程send和receive基本上都是在做IO。

另一种完全不同的技术:远程过程调用(Remote Procedure Call,RPC)运行cpu调用位于其他cpu中的过程,已经成为大量多计算机的软件的基础。

基本思想是尽可能使远程过程调用想本地调用。

最简单的情形:客户程序必须绑定在一个称为客户端桩(client stub)的小型库过程上,它在客户机地址空间中代表服务器过程。类似的服务器也绑定一个称为服务器端桩(server stub)的过程上。

基本步骤:

客户机调用客户端桩

客户端桩将有关参数打包成一条消息,并进行系统调用来发出消息,将参数打包的过程称为编排(marshaling)

内核将该消息从客户机发送给服务器。

内核将接受进来的消息传送给服务器端桩。

服务器端桩调用服务器过程。

实现相关的问题

关于指针参数的使用

对于弱类型的语言,没办法对参数进行编排, 因为没办法确定有多大。

参数类型并不是总是可以推到出的

全局变量无效。

RPC虽然比较复杂,但是其实还是被广泛使用了的。

8.2.5 分布式共享储存器

分布式共享储存器(Distributed Shared Memory,DSM)很好的保留共享储存的幻觉,尽管这个共享储存实际上并不存在。

实现的共享的方式分成两种:

由操作系统实现:共享储存介于运行时系统和操作系统之间。

由上层软件实现:介于运行时系统和操作系统之间。

实际上物理实现的共享内存处于操作系统和硬件之间

在DSM系统中,地址空间被划分为页面(page),这些页面分布在系统中的所有节点上。当一个cpu引用了一个非本地的地址时?就产生了一个陷阱,DSM软件调取包含改地址的页面并重新开始执行中断的指令

1.复制

基本的改进是只复制只读的页面。

另一种改进是不仅复制只读页面,而且复制所有的页面。如果复制的页面被修改了需要额外的机制保持一致性。

2.伪共享

DSM与多处理机的一个不同是,多处理可以使用高速缓存,高速缓存块的大小通常是32字节或64字节,这是为了避免占用总线过程时间,而DSM块必须是页面大小的整数倍,因此大了很多。

大的页面优点是:网络传输的启动时间很长,传输长页面和传输短页面时间差不多。

缺点是:

大页面传输长期占用网络,阻塞了其他进程。

还会引起伪共享(false sharing),两个进程的变量存放在同一个块中,且两个进程分别属于不同cpu,这样就要去这个块在两个进程分别所属的cpu直接不断的交换传递。

3.实现顺序一致性

如何解决对复制的块进行了修改并保持了一致性的问题:

DSM在对一个共享页面进行写入之前,先向所有持有该页面副本的cpu发出一条消息,通知他们解除并丢弃该页面。等其所有解除映射完成之后,该cpu再进行写操作。

如果有更详细的约束,也可以允许写页面的多个副本,

一种方法运行一个进程获得在部分虚拟地址空间上的一把锁,然后在被锁住的空间中进行多个读写操作,在该锁释放的时候再将其修改内容传播的其他页面上,只有在一个给定的时刻只有一个cpu能锁住某个页面。

另一种方法当一个潜在的可写页面被第一次真正写入时,制作一个干净的副本并保存在发出写操作的cpu上。然后可在该页上加锁,更新页面,并释放锁。稍后当一个远程机器上的进程试图获得该页面上的锁时,先前进行写操作的cpu将该页面的当前状态与干净的副本进行比较并构造一个有关所有已修改的字的列表。该列表接着被送往获得锁的cpu。这样它就可以更新其副本页面而不用废弃它。

8.2.6 多计算机调度

在多计算机中,每个节点由自己的储存器和进程集合,因此如何将工作分配到节点上更为重要。

多计算机调度和多处理机类似,但是不是所有算法都相同,比如维护进程就绪的中心链表就不可以,因为每个进程只在当前的cpu上运行。

可以采用群调度,但是需要额外的协议保证同时性。

8.2.7 负载平衡

处理器分配算法(processor allocation algorithm),通常

可知的进程属性:包括cpu需求、储存器使用以及每个进程与其他进程的通信量

可能的目标:由于缺少工作而浪费的cpu时间、最小化总的通信带宽、以及确保用户和进程公平性。

1.图论确定算法:

以最小的网络流量完成分配。每个顶点是一个进程,每条弧表示两个进程之间的通信量。寻找一个将图分割(切割)为k个互不连接的子图的方法。

2.发送者发起的分布式启发算法

当进程创建时,它就运行在创建它的节点上,除非该节点过载了,过载节点的度量可能涉及太多的进程,过大的工作量,或者其他度量。如果过载了,该节点随机选择另一个节点并询问其负载情况。如果其负载低于一定情况则将其新进程送到该空闲询问节点上运行。如果其负载不低于某个阈值则选择另一机器,在N次探查内,如果没有找到合适的主机,算法终止。

缺点是在重负载的情下,太多的询问降低效率

3.接受者发出的分布式启发算法

基本同上,区别是由空闲者发出请求。

实际中可以将2和3的算法结合在一起。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息