引言

之前我们所学习的操作系统进程调度策略的前提条件是单处理器系统下的CPU调度程序。如果系统中存在多个CPU,那么负载分配就成为可能,但是相应的调度问题就会更加复杂。

多处理器调度方法

  1. 对于多处理器,CPU调度的一种方法是让一个处理器(主处理器)处理所有调度决定、I/O处理以及其他系统活动,其他处理器只执行用户代码。这个方称为非对称多处理(asymmetric multiprocessing),这种方法只有一个处理器访问系统数据结构,减少了数据共享的需要。

  2. 另外一种方法是使用对称多处理(sysmmetric multiprocessing, SMP),即每个处理器自我调度。所有进程可能处在一个共同的就绪队列中,也可能每个处理器都有自己私有的就绪队列。无论怎样,每个处理器的调度程序都检查共同就绪队列,以便选择执行一个进程。

处理器的亲和性

当一个进程运行在一个特定的处理器上时会缓存以该进程的一些数据和上下文,如果进程被迁移到另外一个处理器上,那么上一个处理器上缓存的数据设为无效,第二个处理器缓存应重新填充。由于缓存的无效或重新填充的代价很高,所以大多数SMP系统试图拍避免进程从一个处理器移到另一个处理器,而是试图让一个进程运行在同一个处理器上。这叫做处理器亲和性。亲和性具备多种形式:

当一个操作系统试图保持进程运行在同一处理器上,但是这个进程也可以迁移到其他进程上,这种亲和性叫做软亲和性

有的操作系统提供系统调用来支持硬亲和性,从而使某个进程运行在某个处理器子集中。(比如Linux实现软亲和性,但是也提供系统调用sched_setaffinity()来支持硬亲和性)。

系统的负载平衡

负载平衡设法将负载平均分配到SMP系统的所有处理器,这个概念很好理解。

需要注意的是,对于有些系统他们的处理器具有私有的可执行进程的队列,负载平衡是必须的,如何将一个进程分配到哪一个处理器的私有队列。对于另外一些系统具有公共队列,那么负载平衡就没有必要了,因为处理器一旦空闲,就会从公共就绪队列中取走一个就绪进程。

负载平衡具有两种方法:

  • 推迁移:如果发现不平衡,将进程从超载处理器推到空闲或不太忙的处理器
  • 拉迁移:空闲处理器从忙的处理器上拉一个等待任务,发生拉迁移

多核处理器

传统SMP系统具有多个物理处理器,但是当前的SMP系统将多个处理器放置在同一个物理芯片上,产生多核处理器。

许多硬件设计都采用多线程的处理器核,即每个核会分配到两个或多个硬件线程,这样如果一个线程停顿而等待内存时,该核可以切换到另一个线程。从操作系统角度来看,每一个硬件线程可以作为一个逻辑处理器,以便运行软件线程。

处理器核的多线程有两种方法:

  • 粗粒度:粗粒度的多线程值在处理器上运行,直到一个长延迟时间发生,线程切换,且切换成本高
  • 细粒度:线程在更细的粒度级别切换,切换成本低

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

    另一个级别的调度指定每个核如何决定运行哪个硬件线程,在这种情况下,有多种策略可以采用。比如Intel Itanium为双核处理器,而且每个核有两个硬件线程,每个硬件线程有一个动态的紧迫值,它的取值范围是0-7,用0表示最低的紧迫性,而7表示最高的,Itanium具有5个不同的事件,用于触发线程切换,当这些时间发生时,线程切换逻辑会比较两个线程的紧迫性,并选择紧迫性较高的线程在处理器核上执行。

OS之进程管理---多处理器调度的更多相关文章

  1. Linux进程管理与调度-之-目录导航【转】

    转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...

  2. [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】

     作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...

  3. OS之进程管理---进程调度和多线程调度

    进程调度基本概念 多道程序的目标就是始终允许某个进程运行以最大化CPU利用率,多个进程通时存在于内存中,操作系统通过进程调度程序按特定的调度算法来调度就绪队列中的进程到CPU,从而最大限度的利用CPU ...

  4. 深入Linux内核架构——进程管理和调度(下)

    五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...

  5. 深入Linux内核架构——进程管理和调度(上)

    如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...

  6. Python::OS 模块 -- 进程管理

    os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...

  7. Linux内核——进程管理与调度

    进程的管理与调度 进程管理 进程描写叙述符及任务结构 进程存放在叫做任务队列(tasklist)的双向循环链表中.链表中的每一项包括一个详细进程的全部信息,类型为task_struct,称为进程描写叙 ...

  8. Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记

    进程优先级 硬实时进程 软实时进程 普通进程 O(1)调度.完全公平调度器 抢占式多任务处理(preemptive multitasking):各个进程都分配到一定的时间段可以执行.时间段到期后,内核 ...

  9. Linux高级调试与优化——进程管理和调度

    进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...

随机推荐

  1. 2018.09.15 秘密的牛奶管道SECRET(次小生成树)

    描述 约翰叔叔希望能够廉价连接他的供水系统,但是他不希望他的竞争对手知道他选择的路线.一般这样的问题需要选择最便宜的方式,所以他决定避免这种情况而采用第二便宜的方式. 现在有W(3 <= W & ...

  2. UVa 11167 Monkeys in the Emei Mountain (最大流)

    题意:雪雪是一只猴子.它在每天的 2:00 —— 9:00之间非常渴,所以在这个期间它必须喝掉2个单位的水.它可以多次喝水,只要它喝水的总量是2.它从不多喝,在一小时内他只能喝一个单位的水.所以它喝水 ...

  3. java中的实例化

    java中的new用于实例化一个对象 T1 a= new T1(); T2 b= new T1(); 区别: 问题1:不是实例化一个a,是实例化一个T1 T1 的一个 对象的引用 a 指向了堆空间里的 ...

  4. AQS详解(AbstractQueuedSynchronizer)

    Intrinsic VS explicity 1. 不一定保证公平              1. 提供公平和非公平的选择 2. 无                          2. 提供超时的 ...

  5. HDU1237 简单计算器 2016-07-24 13:34 193人阅读 评论(0) 收藏

    简单计算器 Problem Description 读入一个只包含 +, -, *, / 的非负整数计算表达式,计算该表达式的值. Input 测试输入包含若干测试用例,每个测试用例占一行,每行不超过 ...

  6. H3C交换机流量镜像

    今天需要对交换机进行本地流量镜像,在此记录: 交换机:H3C S5120 配置本地端口镜像时,用户首先要创建一个本地镜像组,然后为本地镜像组配置源端口和目的端口. 表1-1 配置本地端口镜像 操作 命 ...

  7. jvm 中的 ”永生代“

    “方法区” 主要存储的信息包括:常量信息,类信息,方法信息,而且是全局共享的(多线程共享): jvm 有多种实现方式(不同的厂商): 并不是所有的jvm 都有永生代的概念: 通常情况下, 很多人把 “ ...

  8. 【Win10】一些零碎不好归档的小总结(原谅我这个该死的标题吧)

    一.同步方式获取设备的屏幕分辨率 public static class ScreenResolution { /// <summary> /// 获取屏幕高度. /// </sum ...

  9. 更改GeoServer的端口号

    更改GeoServer的端口号,这一问题在不同的GeoServer版本上的解决办法不禁相同.本文记录GeoServer2.7.6(独立安装)版本更改其端口号的办法. GeoServer默认端口为808 ...

  10. DBCC--EXTENTINFO/IND/PAGE--显示数据页信息

    DBCC EXTENTINFO得到对象分配的区DBCC EXTENTINFO(<dbname|dbid>,<tabelname|tableid>[,{indexname|ind ...