现代操作系统: 第八章 多处理机系统

多处理机系统模型主要有三类:分别是共享存储器多处理机、消息传递多计算机、广域分布式系统

  • 共享存储器多处理机:获得高速的一种处理方式就是使用并行处理机。这些机器使用许多CPU, 每一个都以“通常”的速度运行,但是总体上会比单个CPU强大得多的计算能力。
  • 消息传递多处理机系统:许多CPU-存储器通过某种高速互联网络连接在一起。这种系统称为消息传递型多计算机。
  • 广域分布式系统:所有计算机通过一个广域网连接起来,如因特网构成了一个分布式系统。

在这里插入图片描述

8.1 多处理机

共享存储器多处理机是有两个或更多的CPU全部共享访问的一个公用的RAM,运行在任何一个CPU上的程序都看到一个普通的(通常是分页)的虚拟地址空间。这个系统唯一特别的性质是,CPU可对存储器字写入某个值,然后读会这个字,得到一个不同的值(因为另一个CPU改写了它)。

8.1.1 多处理机硬件

所有多处理机都具有每个CPU可访问全部存储器的性质,而有些多处理机仍有一些其它的性质,即读出每个存储器字的速度是一样快的。这种及其称为UMA(统一存储器访问)多处理机,而另一种则称为NUMA(非一致存储器访问)多处理机。

1. 基于总线的UMA多处理机体系结构

通过给每个CPU添加一个高速缓存(cache),这个高速缓存可以位于CPU芯片内部,CPU附近,处理器板上或所有三种方式的组合。因为许多读操作可以在高速缓存中得到满足,总线流量被大大减少了,这样系统就能支持更多的CPU。

在这里插入图片描述

高速缓存一致性协议:每一个高速缓存块或者被标记为只读(此时可以存在与多个告诉缓存中),或者被标记为读写(不能出现在多个高速缓存)。如果CPU试图在一个或多个远程高速缓存中写入一个字,总线硬件检测到写,并把一个信号放到总线上通知所有其它的高速缓存。如果其他高速缓存有个"干净"的副本,也就是同存储器内容完全一样的副本,那么它们就可以丢弃该副本并让写在修改之前从存储器中取出高速缓存块。如果某些其它高速缓存中有“脏”副本(被修改的副本),它必须在处理写之前把数据写回存储器或者它通过总线直接传送到写者上。高速缓存这一套规则被称为高速缓存一致性协议。

2.使用交叉开关的UMA处理机

连接n个CPU到k个存储器的最简单的电路就是交叉开关。

在这里插入图片描述

交叉开关最好的一个特性是它是一个非阻塞网络,即不会因有些交叉点或连线已经被占据而拒绝连接。

3.使用多级交换网络的UMA多处理机

在这里插入图片描述

有一种完全不同的、基于简单2X2开关的多处理机的设计。这个开关有两个输入和两个输出。到达任意一个输入线的消息可以被交换至另一个输出线上去。就我们的目标而言,消息可用由四个部分组成。Module(模块)域指明使用哪个存储器。Address(地址)域指定在模块中的地址。Opcode(操作码)给定了操作,如READ或者WRITE。最后一个可选的Value(值)域中可包含一个操作数。

这个2X2开关有多种使用方式,用于构建大型的多级交换网络。

在这里插入图片描述

4. NUMA多处理机

这种机器为所有CPu提供一个统一的地址空间,但是访问本地存储器模块快于访问远程存储器模块。因此,在NUMA机器运行的所有NUMA程序无须做任何改变,但是相同的时钟速率下其性能不如UMA机器的性能。

所有NUMA机器都具有以下三种关键特性:

  1. 就有对所有CPU都可见的的单个地址空间。
  2. 通过LOAD和STORE指令访问远程存储器。
  3. 访问远程存储器慢于访问本地存储器。

5.多核芯片

将两个或者多个完整的CPU。通常称为核(Core),放到同一个芯片上(技术上来说是同一个小硅片)。双核、四核和八核的芯片已经很普及了。

6.众核芯片

众核芯片是指包括几十、几百甚至成千上万个核心的多核处理器。

7.异构多核

一些芯片会把异构GPU和一些通用的处理器核心放在一起。在一块芯片上封装了不同的处理器的系统被统称为异构多核处理器。

8.在多核心上编程

8.1.2 多处理机操作系统类型

1.每个CPU都有自己的操作系统

静态地把存储器划分成和CPU一样多的各个部分,为每个CPU提供其素有存储器以及操作系统的各自私有副本。这样的明显优点是,允许所有CPu共享操作系统的代码,而且只需要提供数据的私有副本。

在这里插入图片描述

2.主从多处理机

在这种模型下,操作系统的一个副本机器数据表都在一个CPU上,所有的系统调用都重定向到CPU1上。如果有剩余的CPu时间,还可以在CPU1上运行用户进程。这种模型称为主从模型。

当某个CPU空闲下来时,它向CPU1上的操作系统请求一个进程运行,并被分配一个进程。这个模型的问题是,如果有很多CPU,那么出CPU会称为瓶颈。

在这里插入图片描述

3.对称多处理机

在存储器中有操作系统的一个副本,但任何CPU都可以运行它。在有系统调用时,进行系统调用但CPU陷入内核并处理系统调用。

在这里插入图片描述

当一个CPU要运行操作系统时,它必须首先获得互斥信号量。如果互斥信号量被锁住。就得等待。按照这种方式,任何CPu都可以运行操作系统,但任意时刻只有一个CPU可运行操作系统。这样就需要把操作系统分割成互不影响但临界区。每个临界区由其互斥信号量保护,所以一次只能有一个CPU运行它。

由于这一事实,可以将操作系统分割成不同的互不影响的临界区。每个临界区由其互斥信号量保护,所以一次只有一个CPU可以执行它。采用这种方式,可以实现更多的并行操作。而某些表格,如进程表,可能恰巧被多个临界区使用。

大多数但现代多处理机都采用这种安排。更进一步,要尽量避免死锁。

8.1.3 多处理机同步

我们仔细讨论一下指令TSL(Test and Set Lock)是如果实现临界区的。这条指令的做法:读出一个存储器字并把它存储到一个寄存器中。同时,它对该寄存器字写入一个1.当然这需要两个总线周期来完成存储器的读写。在单处理机中,只要该指令不被中途中断,TSL指令就如实正常运行。

在这里插入图片描述

TSL指令必须首先锁住总线,阻止其它CPU访问他,然后进行存储器的读写访问,再解锁总线。对总线枷锁的典型做法是,先使用通风的总线协议请求总线,然后申明已拥有某些特定的总线线路,直到两个周期全部完成。只要始终保持拥有这一特性的总线线路,那么其他CPU就不会得到总线的访问权。这个指令只有在拥有必要的线路和使用它们的协议上才能实现。

如果正确的实现和使用TSL,就能保证互斥机制正常工作。但是这种互斥方法使用了自旋锁。因为请求的CPU只是在原地尽可能快得对锁进行循环测试

高速缓存的实现也许能够消除总线竞争的问题,但事实并非如此。理论上,只要提出CPU已经读取了锁字(Lock word),它就可以在其高速缓存中得到一个副本。只要没有其他CPU试图使用该锁,提出请求的CPU就能够用完其高速缓存,当拥有锁的CPU写入一个0高速缓存并释放它时,搞缓存会自动将它在远程高速缓存中的所有副本失效,要求再次读取正确的值。

问题:通常,拥有锁的CPU也需要这个锁周围的字。由于TSL指令是一个写指令(因为它修改了锁),所以它需要互斥地访问含有锁的高速缓存块。这样每一个TSL指令都使锁持有者的高速缓存中的块失效,并且为请求的CPU取一个私有的、唯一的副本。只要锁拥有者访问到该锁的邻接字,该高速缓存块就被送到其机器。这样一来,整个包含锁的高速缓冲块就会不断地在锁的拥有者和锁的请求者之间来回穿梭,导致了比单个读取一个锁字更大的总线流量。

解决方案:

  • CPU首先进行一个存读操作来观察锁是否是空闲的,就可以实现这个目标。只有在锁是空闲的,TSL指令才去真正获取它。这种小小的变化,导致的是大多的行为变成读而不是写。
  • 减少总线流量的方式是泗洪柱面的以太网二进制指数补偿算法。不采用轮询,而将一个延迟插入轮询之间,每次延迟时间加倍。
  • 一个更好的思想是,让每个打算获得互斥信号量的CPU都拥有歌词用于测试的私有锁变量。

在这里插入图片描述

自旋与切换

需要加锁的互斥信号量的CPU只是保持等待。有时对于提出请求的CPU而言,只有等待,不存在其他等待的办法。

自旋直接浪费了CPU周期,重复地测试锁并不是搞笑的工作。不过,切换也浪费了CPU周期,因为必须保存当前线程的状态,必须获得保护就绪链表的锁,还必须选择一个线程,必须装入其状态,并且使其开始运行。

多数研究工作是用来一种新的模型:一个未能获得互斥信号量的线程先自旋一段时间,若时间超过某个阙值,则切换。

8.1.4 多处理机调度

对于多线程的调度,可以分为两类:分别是用户线程的调度和内核线程的调度。

  • 用户线程的调度:,如果线程是由用户空间库维护,而对内核不可见。那么调度一如既往的基于单个进程。如果内核并不知道线程的存在,它就不能调度线程。
  • 内核线程的调度:而对内核线程,是内核选择线程作为调度单位,内核可以选择任意一个进程的任一线程。

1.分时

处理独立线程的最简单的算法是,为就绪线程维护一个系统级的数据结构,它可能只是一个链表,但更多但情况下可能是对应不同优先级但一个链表集合。

在这里插入图片描述

使用单一数据结构调度一个多处理机,存在的缺点:

  • 随着CPU数量增加引起但对调度数据结构对潜在竞争
  • 线程由于IO阻塞而因为对上下文切换对开销。

当线程时间片用完时,也可能会发生上下文切换。

为了避免这种情况,一些系统采用智能调度算法。获得自旋锁的进程设置一个进程范围的标志表示它目前拥有自旋锁,当释放时,就清除该标志。这样调度程序就不会停止拥有自旋锁的线程,相反,还会给更多的时间。

为了预装缓冲块将提高高速缓存的命中率,从而提高线程的速度。有些多处理机使用了亲和调度。其基本思想是,尽量使一个线程在前一次运行过的同一个CPU上运行。创建这种请合理的一个途径是采用一种两级调度算法。

两级调度算法:在一个线程创建的时候,他被分给了一个CPU,列如,可以基于哪个CPU在此刻有最小的负载。这种把线程分给CPU的工作在算法的顶层进行,其结果是每个CPU获得了自己的线程集。

两级调度算法有三个优点:

  • 将负载大致平均的分配在可用的CPU上。
  • 尽可能发挥了高速缓存亲和力的优势
  • 每个CPU提供一个私有的就绪线程链表,使得对就绪线程链表的竞争见到最小,因为试图使用另一个CPU就绪线程链表的机会相对较小。

2.空间共享

当线程之间以某种方式彼此相关联的时候,可以使用多处理机调度方法。在多个CPU同时调度多个线程称为空间共享

最简单的空间共享算法的基本思想:

假设一组相关的线程时一次性创建的。在其创建的时刻,调度程序检查是否有同线程数量一样多的空闲CPU存在。如果有,每个线程获得各自的CPU并且都开始运行。如果没有足够的CPU,就没有现车开始运行,直到有足够的CPU开运行。

8.2 多计算机

多计算机是紧耦合CPU,不共享存储器。每台计算机中有自己的存储器。

在这里插入图片描述

8.2.1 多计算机硬件

一个多计算机系统的基本节点包括一个CPU、存储器、一个网络接口、有时候还有一个硬盘。

1. 互联技术

在每个节点上有一个网卡,带有一根或两根网卡上接出的电缆。这些电缆或者连接到其他节点上去,或者链接到交换机上。

在多计算机中可采用两种交换机制:

  • 存储转发包交换:每个消息首先被分解(由用户软件或网络接口进行)称为有最大长度限制的快,称为报。该交换机制称为存储转换包交换,由源节点的网络接口卡注入到第一个交换机的报组成。
  • 电路交换:它包括由第一个交换机建立的,通过所有交换机而到达目标交换机的一条路径。一旦电路建立,比特流就从源到目的地通过整个线路不停的传输。在所设计的交换机汇总,没有中间缓存,电路交换需要有一个建立阶段,它需要一点时间。但是一旦建立完成,速度就很快。在包发送结束后,该路径必须被删除。

在这里插入图片描述

2. 网络接口

在多计算机中,所有节点里都有一块插卡板,它包含节点与互连网络的连接,这使得多计算机连城一体。

很多接口板上有一个完整的CPU,可能另外还有一个或多个DMA通道。它们被称为网络处理器,并且其功能日趋强大。这种设计一位这主CPU将一些工作分给网卡。

8.2.2 底层通信软件

问题:如果说进出RAM的复制是性能瓶颈,那么进出内核的额外复制会将端到端的延迟加倍 ,并把吞吐量降低一半。为了避免进出RAM的复制称为系统性能瓶颈。我们有以下三种解决方案:

  1. 将接口板映射到所有需要它的进程中去,但是这样做就需要有一个机制来避免竞争。
  2. 需要某种同步机制,如注入一些同步互斥信号量。

1. 节点至网络接口通信

最快的方法是使用板上的DMA芯片直接将他们从RMA复制到板上,这种方法的问题上,DMA使用物理地址。而用户进程通常不知道有关的物理地址,并且独立于CPU运行,除非存大I/O MMU。

2. 远程直接内存访问

在上述情况下,降低数据的复制量都需要很大的代价。为了应对这个问题,一些网络接口支持远程直接内存访问技术,允许一台机器直接访问另一台机器的内存。RDMA不需要操作系统地参与,直接从应用的内存空间中读取或者写入数据。

8.2.3 用户层通信软件

1.发送和接受

发送一条消息的系统调用:

send(dest,&mptr); 

接受消息的调用:

receive(addr,&mptr)

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

阻塞调用:当一个进程调用send时,它指定一个目标以及发送消息到该目标的缓冲区。当消息发送时,发送进程被阻塞(挂起)。在消息已经完成发送出去之前,不会执行跟随在调用send后面的指令。

非阻塞调用:如果send是非阻塞的,在消息发出之前,它立即将控制返回给调用者。这种机制的

在这里插入图片描述

通常是由系统设计者作出在阻塞原语和非阻塞原语之间的选择。当然少数系统两种都可以使用。

问题:非阻塞原语的性能优点被其缺点抵消了——直到消息被送出发送者才能修改消息缓冲区。进程在传输过程中重写消息的后果十分严重,更糟的是,发送进程不知道传输何时结束,所以根本不知道什么时候重用缓冲区是安全的。

解决方案:

  1. 让内核复制消息到内核缓冲区,然后让进程继续。
  2. 当消息发送之后中断发送,告知缓冲区又可以使用了(用户级中断引发编程问题,而且可能引发竞争条件)
  3. 让缓冲区写时复制。在消息发送出去之前,若有修改,则进行复制(会引发不必要的复制)

这样在发送端的选择是:

  1. 阻塞发送(CPU在消息传输期间空闲)
  2. 待有复制操作的非阻塞发送(CPU时间浪费在额外的复制上)。
  3. 带有中断操作的非阻塞发送(造成编程困难)。
  4. 写时复制(最终可能造成额外的复制)

8.2.4 远程过程调用

尽管消息传递模型提供了一种构造多计算机操作系统的便利,但是它也有不可救药的缺陷:构造所有相同通信的泛型都是输入/输出。

远程过程调用:运行程序调用其他CPU的过程。当机器1的进程调用机器2的过程时,在机器1中的调用进程被挂起,在机器2中被调用的过程被执行。可以在参数中传递从调用者到调用者的信息,并且可以在过程的处理结果中返回消息。根本不存在对程序可见的消息传递或者I/O。这种技术成为远程过程调用(RPC)。

在这里插入图片描述

8.2.6 多计算机调度

将进程分配到工作节点的工作十分重要。

因为每个节点都拥有自己的进程,因此可以应用任何本地调度算法,但是仍有可能使用多处理机调度。

8.2.7 负载均衡

1.图论确定算法

将节点分为子网,寻找子网之间流量最小的组合

在这里插入图片描述

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

在这里插入图片描述

当进程创建时,他就运行在创建它的节点上,除非该节点过载了。如果该节点过载了,该节点则随机选择一个节点并询问其负载情况。探查工作不会永远进行,在N次探查之后,如果没有合适的主机,算法就终止。且进程继续在原有机器上运行。

在负载重的情况下,所有机器都会持续得对其他机器进行探查,徒劳地试图找到一台愿意接收工作的机器,这样的尝试会导致巨大的开销。

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

由接受者要求更多的工作

8.3 分布式系统

分布式系统的每一个节点都是一台完整的计算机,带有全部的外部设备。其次一台多计算机的所有节点一般分布在一个房间内,这样他们就可以通过专门的网络进行高速网络通信。而分布式系统中的节点则可能分散在全世界范文内。

8.3.1 网络硬件

网络主要有两种——覆盖一栋建筑物的LAN(局域网)和更大范围的WAN(广域网)

LAN最重要的类型是以太网

在这里插入图片描述

1.以太网

以太网有其最大电缆长度限制,以及可连接的最多的计算机台数限制。要想超过其中一个限制,就要在一座大建筑物或校园中连接多个以太网,然后用一种成为桥接器的设备把这些意外网连接起来。

为了避免碰撞问题,现代以太网使用交换机。如果能人后较大的交换机成本,可以使每台机器都拥有自己的端口,从而消除所有的碰撞。作为一种妥协方案,每个端口上连接少量计算机还是可能的。

2.因特网

Internet包括了两类计算机,主机和路由器。主机有PC机,路由器是专用的交换计算机,它在许多进线中的一条线上接收进来的包,并在许多个出口线中的一条线傻姑娘按照其路径发送包。

当一个包到达某个路由器使,该路由器抽取目的地地址并在一个表格进行查询,以找出用哪根出口线发送该包以及传送哪个路由器。路由表是高度动态的,并且随着路由器和链路维护,恢复以及通信条件的变坏在连续不断的更新。

8.3.2 网络服务和协议

1.网络服务

计算机网络为使用网络的主机和进程提供服务。面向连接的服务是对电话系统的一种模仿,而无连接服务则是对邮政系统的一种模仿。

可靠的,面向连接的服务有两种变种——消息序列和字节流

不可靠的(意味着没有确认)无连接服务,常常称作是数据报服务。

2. 网络协议

用于特定计算机通信的这些规则的集合称为协议。

所有的现代网络都使用所谓的协议栈把不同的协议一层层叠加起来。每一层解决不同的问题。

大多数分布式系统都使用Internet 作为基础,因为这些系统使用的关键协议是IP和TCP协议。IP协议是数据报协议,发送者可以向网络上发出长达64kb的数据报并且网它们到达。TCP使用IO来提供面向连接的数据流。为了使用TCP,进程需要首先与一个远程进程建立连接。被请求的进程需要通过机器的IP地址和机器的端口号确定,而对进入的连接感兴趣的进程监听端口。这些工作完成之后,只需要把字节流放入连接。

DNS作为一个数据库把主机的ASCII名称名称映射为对应的IP地址。

8.3.4 基于文件系统的中间件

分布式系统采用一个文件系统模型意味着只存在一个全局文件系统,全世界的用户都能够读写他们各自具有授权的文件。通过一个进程将数据写入文件而另一个进程把数据读出的办法可以实现通信。

8.3.5 基于对象的中间件

8.3.6 基于协作的中间件

猜你喜欢

转载自blog.csdn.net/qq_21125183/article/details/84033243
今日推荐