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

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。一共有三次复制。

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

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

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

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

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

节点至网络接口通信

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

8.2.3 用户层通信软件

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

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

1.发送和接受

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

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

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

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

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

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

发送端

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

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

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

解决方案:

  1. 让内核复制这个消息到内部的内核缓冲区,然后让进程继续。但是额外的复制会降低系统性能
  2. 然消息发送之后中断发送者,告知缓冲区可用,处理起来比较麻烦。
  3. 让缓冲区写时复制,在消息发送出去之前将其标记为只读,如果缓冲区被重用则进复制。复制导致性能降低

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

接收端

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

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

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

  • 中断,编程复杂
  • 使用一个过程poll轮询进来的消息。
  • 一个消息的到达自然的引起一个新线程的创建。(弹出式线程pop-up thread),这个线程运行一个预定义的过程,其参数是一个指向进来消息的指针。处理完这个线程后自动撤销线程。
  • 类似上一种,在中断程序中直接运行接受者代码。消息自身科研带有该处理程序的句柄(handler)。这样当消息到达时,只在少数几个指令中可以调用处理程序。这样做最大的好处是不用复制,称为(主动消息 active messages)。但是又有消息带有句柄,对安全性的要求高。

8.2.4 远程过程调用

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

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

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

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

基本步骤:

  1. 客户机调用客户端桩
  2. 客户端桩将有关参数打包成一条消息,并进行系统调用来发出消息,将参数打包的过程称为编排(marshaling)
  3. 内核将该消息从客户机发送给服务器。
  4. 内核将接受进来的消息传送给服务器端桩。
  5. 服务器端桩调用服务器过程。

实现相关的问题

  1. 关于指针参数的使用
  2. 对于弱类型的语言,没办法对参数进行编排, 因为没办法确定有多大。
  3. 参数类型并不是总是可以推到出的
  4. 全局变量无效。

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的算法结合在一起。

时间: 2025-01-02 17:37:19

读书笔记-现代操作系统-8多处理机系统-8.2多计算机的相关文章

[读书笔记]计算机组成原理-第一章系统概论

1.1 计算机么有软硬件构成,软件就程序之类的,硬件就看得见的之类的,硬盘等. 计算机系统是多层次的.大概就是 M4(高级语言翻译机) ↓ M3(汇编翻译机) ↓ M2(操作系统把) ↓ M1(机器语言机,就是2进制的东西在这个上运行) ↓ M0(微机,把M1中的一条指令拿过来,解释执行,好了再下一条.如此反复.看成是对M1的分解把) M4翻译高级语言,如C,js这些为汇编再到机器语言,要么直接翻译为机器语言.M4翻译成机器语言的程序有2种,编译程序和解释程序,编译么一次编译好,再执行机器语言,

《大型网站技术架构:核心原理与案例分析》-- 读书笔记 (5) :网购秒杀系统

1. 秒杀活动的技术挑战及应对策略 1.1 对现有网站业务造成冲击 秒杀活动具有时间短,并发访问量大的特点,必然会对现有业务造成冲击.对策:秒杀系统独立部署 1.2 高并发下的应用.数据库负载 用户会在秒杀开始前不停的刷新网页,访问量会很大.对策:秒杀商品页面静态化.这样就不需要经过服务器的业务逻辑处理,也不需要访问数据库 1.3 突然增加的网络及服务器带宽 如果一个页面大小200K,如果有10000个请求,那么需要的网络和服务器带宽大约是2G.对策:租借秒杀活动网络带宽(网络运营商及CDN服务

《计算机组成原理》-读书笔记(六)总线系统

数字计算机室由若干系统部件构成的,这些系统功能部件在一起工作才能形成一个完整的计算机系统.   总线:构成计算机系统的互联机构,是多个系统功能部件之间进行数据传送的公共通路.       借助于总线连接,计算机在各系统功能部件之间实现地址.数据和控制信息的交换,并在争用资源的基础上进行工作.   总线分类: 内部总线:CPU内部连接各寄存器及运算器部件之间的总线 系统总线:外部总线.CPU和计算机系统中其他高速功能部件相互连接的总线 I/O总线:中低速I/O设备相互连接的总线   总线标准:PC

《计算机组成原理》-读书笔记(八)输入输出系统

外设种类繁多,传输速率差别很大.高速的CPU如与这些设备在时间上同步的方法: 在CPU和外设之间数据传送时加以定时. 速度极慢或简单的外设     CPU只需要接受或者发送数据即可 慢速或者中速的设备     可以采用异步定时的方式 高级外设     采用同步定时方式   CPU对外围设备的管理方式有:程序查询方式.程序中断方式.DMA方式.通道方式   中断:指CPU暂时中止现行程序,转去处理随机发生的紧急事件,处理完后自动返回原程序的功能和技术.中断系统是计算机实现中断功能的软硬件总称,一般

《第一行代码:Android》读书笔记——第1章 Android系统

(一)Android系统架构 1.Linux内核层:各种底层驱动,如显示驱动.音频驱动.电源管理等. 2.系统运行库层:各种库支持,如3D绘图.浏览器内核.数据库等. 3.应用框架层:各种API,各种Manager. 4.应用层:所有的应用程序. (二)安卓系统级功能 1.四大组件:Activity,Service,Broadcast,Content Provider. 2.系统控件:用于写界面,也可以自己定制界面. 3.SQLite数据库:轻量级.快速的嵌入式关系型数据库. 4.地理位置定位:

大话重构读书笔记——保险索下的系统重构

1. 保险索是什么? 保险索就是每次重构后正确的测试方法. 2. 什么是程序代码正确的测试方法? 在不同的场景标准是不一样的.但与其他测试不同,系统重构在测试代码正确性方面有自己独特的方法,那就是不改变软件外部行为. 3. Mock 在测试过程中,对于某些不容易构造或不容易获取的对象,用一个虚拟对象来替代以使测试得以继续的方法 4. 自动化测试不是银弹,不是所有代码都适合自动化测试: a. 与web容器或其他设备驱动相关的代码是不适合自动化测试的,因为我们在测试的时候不希望去启动web容器或其他

【读书笔记】《大型网站系统与Java中间件实践》第一章1.2.2.3 同步陷阱

这一小节给了一段代码, 1 public class TestClass { 2 private HashMap<String, Integer> map = new HashMap<String, Integer>(); 3 public synchronized void add(String key){ 4 Integer value = map.get(key); 5 if(value == null){ 6 map.put(key,1); 7 }else{ 8 map.p

读书笔记-现代操作系统-7多媒体操作系统-7.6多媒体文件系统泛型7.7文件存放

7.6 多媒体文件系统泛型 多媒体系统和传统的文件系统有很大的不同,采用的是类似VCR工作方式一样的拉取型服务器(pull server): 用户进程发出start系统调用,指定要读取的文件和其他各种参数,然后用户进程以帧进来的速率对他们进行处理.直到用户发出stop停止命令停止数据退给用户. 7.6.1 VCR控制功能 视频服务通常也需要实现VCR控制功能,包括暂停.快进和倒带. 暂停:用户发送一个消息给视频服务器,告诉他停止,然后视频服务器记住当前帧就可以了. 但是这中间有一个问题是,为了保

Linux/Unix系统编程手册--SOCKET章节读书笔记

SOCKET章节读书笔记 强烈推荐Linux/Unix系统编程手册,号称超越APUE的神书. backlog含义 #include <sys/socket.h> int listen(int socketfd, int backlog) backlog参数限制未决连接(未accept)的数量,在这个数量之内,connect会立刻成功. Linux上上限为128,定义在 udp已连接socket udp socket也是可以调用connect()的,这种叫已连接socket,内核会记录这个soc