为什么说什么是进程调度度程序把一台物理处理器变成了多台逻辑处理器

VIP专享文档是百度文库认证用户/机構上传的专业性文档文库VIP用户或购买VIP专享文档下载特权礼包的其他会员用户可用VIP专享文档下载特权免费下载VIP专享文档。只要带有以下“VIP專享文档”标识的文档便是该类文档

VIP免费文档是特定的一类共享文档,会员用户可以免费随意获取非会员用户需要消耗下载券/积分获取。只要带有以下“VIP免费文档”标识的文档便是该类文档

VIP专享8折文档是特定的一类付费文档,会员用户可以通过设定价的8折获取非会員用户需要原价获取。只要带有以下“VIP专享8折优惠”标识的文档便是该类文档

付费文档是百度文库认证用户/机构上传的专业性文档,需偠文库用户支付人民币获取具体价格由上传人自由设定。只要带有以下“付费文档”标识的文档便是该类文档

共享文档是百度文库用戶免费上传的可与其他用户免费共享的文档,具体共享方式由上传人自由设定只要带有以下“共享文档”标识的文档便是该类文档。

}

迄今为止我们主要集中讨论单處理器系统的 CPU 调度问题。如果有多个 CPU则负载分配成为可能,但是调度问题就相应地更为复杂许多可能的方法都已试过,但与单处理器調度一样没有最好的解决方案。


对于多处理器系统CPU 调度的一种方法是让一个处理器(主服务器)处理所有调度决定、I/O 处理以及其他系統活动,其他的处理器只执行用户代码这种非对称多处理很简单,因为只有一个处理器访问系统

减少了数据共享的需要。

第二种方法昰使用对称多处理(SMP)即每个处理器自我调度。所有进程可能处于一个共同的就绪队列中或每个处理器都有它自己的私有就绪进程队列。不管如何调度这样进行:每个处理器的调度程序都检查共同就绪队列,以便选择执行一个进程如果多个处理器试图访问和更新一個共同的数据结构,那么每个处理器必须仔细编程必须确保两个处理器不会选择同一进程,而且进程不会从队列中丢失

几乎所有现代操作系统,包括 Windows、 和 Mac OSX都支持 SMP。本节余下部分讨论有关 SMP 系统的多个问题


考虑一下,当一个进程运行在一个特定处理器上时缓存会发生些什么进程最近访问的数据更新了处理器的缓存。结果进程的后续内存访问通常通过缓存来满足。

现在考虑一下如果进程移到其他处悝器上则会发生什么。第一个处理器缓存的内容应设为无效第二个处理器缓存应重新填充。由于缓存的无效或重新填充的代价高大多數 SMP 系统试图避免将进程从一个处理器移到另一个处理器,而是试图让一个进程运行在同一个处理器上这称为处理器亲和性,即一个进程對它运行的处理器具有亲和性

处理器的亲和性具有多种形式。当一个操作系统试图保持进程运行在同一处理器上时(但不保证它会这么莋)这种情况称为软亲和性。这里操作系统试图保持一个进程在某个处理器上,但是这个进程也可迁移到其他处理器相反,有的系統提供系统调用以便支持硬亲和性从而允许某个进程运行在某个处理器子集上。

许多系统提供软的和硬的亲和性例如,Linux 实现软亲和性但是它也提供系统调用 sched_setaffinity() 以支持硬亲和性。


系统的内存架构可以影响处理器的亲和性图 1 为采用非统一内存访问的一种架构,其中一个 CPU 访問内存的某些部分会比其他部分更快通常情况下,这类系统包括组合 CPU 和内存的板卡每个板的 CPU 访问本板内存快于访问其他板的内存。

如果操作系统的 CPU 调度和内存分配算法一起工作那么当一个进程分配到一个特定的亲和处理器时,它应分配到同板上的内存这个例子还说奣操作系统通常不按教科书描述的那样清楚地定义与实现。实际上操作系统的各个部分的“实线”通常应是“虚线”,因为有些算法创建连接以便优化性能和可靠性


对于 SMP 系统,重要的是保持所有处理器的负载平衡以便充分利用多处理器的优点。否则一个或多个处理器会空闲,而其他处理器会处于高负载状态且有一系列进程处于等待状态。

负载平衡设法将负载平均分配到 SMP 系统的所有处理器需要注意的是,对于有些系统(它们的处理器具有私有的可执行进程的队列)负载平衡是必需的;而对于具有公共队列的系统,负载平衡通常没囿必要因为一旦处理器空闲,它立刻从公共队列中取走一个可执行进程同时,要注意对于大多数支持SMP的现代操作系统每个处理器都囿一个可执行进程的私有队列。

负载平衡通常有两种方法:推迁移和拉迁移

  • 对于推迁移一个特定的任务周期性地检查每个处理器的负載,如果发现不平衡那么通过将进程从超载处理器推到空闲或不太忙的处理器,从而平均分配负载
  • 当空闲处理器从一个忙的处理器上拉一个等待任务时,发生拉迁移
推迁移和拉迁移不必相互排斥,事实上在负载平衡系统中它们常被并行实现。例如Linux 调度程序和用于 FreeBSD 系统的 ULE 调度程序实现了这两种技术。

有趣的是负载平衡往往会抵消处理器亲和性的好处。也就是说保持一个进程运行在同一处理器上嘚好处是进程可以利用它在该处理器缓存内的数据。无论是从一个处理器向另一处理器推或拉进程都会失去这个好处。

与通常的系统工程情况一样关于何种方式是最好的,没有绝对规则因此,在某些系统中空闲的处理器总是会从非空闲的处理器中拉进程;而在其他系统中,只有当不平衡达到一定程度后才会移动进程


传统上,SMP 系统具有多个物理处理器以便允许多个线程并行运行。然而计算机硬件的最近做法是,将多个处理器放置在同一个物理芯片上从而产生多核处理器。每个核都保持架构的状态因此对操作系统而言它似乎昰一个单独的物理处理器。

采用多核处理器的 SMP 系统与采用单核处理器的 SMP 系统相比速度更快,功耗更低多核处理器的调度问题可能更为複杂。下面我们来分析一下原因

研究人员发现,当一个处理器访问内存时它花费大量时间等待所需数据。这种情况称为内存停顿它嘚发生原因多种多样,如高速缓存未命中(访问数据不在高速缓冲里)图 2 显示了内存停顿。


在这种情况下处理器可能花费高达 50% 的时间等待内存数据变得可用。为了弥补这种情况许多最近的硬件设计都采用了多线程的处理器核,即每个核会分配到两个(或多个)硬件线程这样,如果一个线程停顿而等待内存该核可以切换到另一个线程。图 3 显示了一个双线程的处理器核这里线程 0 和线程 1 的执行是交错嘚。


图 3 多线程多核系统

从操作系统的角度来看每一个硬件线程似乎作为一个逻辑处理器,以便运行软件线程因此,在双线程双核系统Φ操作系统会有 4 个逻辑处理器。UltraSPARC T3 CPU 具有 16 个处理器核而每个核有 8 个硬件线程,从操作系统的角度就有 128 个逻辑处理器。

一般来说处理器核的多线程有两种方法:粗粒度细粒度的多线程。

对于粗粒度的多线程线程一直在处理器上执行,直到一个长延迟事件(如内存停顿)发生由于长延迟事件造成的延迟,处理器应切换到另一个线程来开始执行然而,线程之间的切换成本是高的因为在另一个线程可鉯在处理器核上开始执行之前,应刷新指令流水线一旦这个新的线程开始执行,它会开始用指令来填充流水线

细粒度(或交错)的多線程在更细的粒度级别上(通常在指令周期的边界上)切换线程。而且细粒度系统的架构设计有线程切换的逻辑。因此线程之间的切換成本很小。

注意一个多线程多核处理器实际需要两个不同级别的调度。一个级别的调度决策由操作系统做出用于选择哪个软件线程運行在哪个硬件线程(逻辑处理器)。对于这个级别的调度操作系统可以选择任何调度算法。

另一个级别的调度指定每个核如何决定运荇哪个硬件线程在这种情况下,有多种策略可以采用前面提到的 UltraSparc T3 采用一个简单的轮转算法,安排 8 个硬件线程到每个核

再比如,Intel Itanium 为双核处理器而且每个核有两个硬件线程。每个硬件线程有一个动态的紧迫值它的取值范围为 0?7,用 0 表示最低的紧迫性而 7 表示最高的。Itanium 囿 5 个不同的事件用于触发线程切换。当这些事件发生时线程切换逻辑会比较两个线程的紧迫性,并选择紧迫性较高的线程在处理器核仩执行


}

我要回帖

更多关于 什么是进程调度 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信