OS之进程管理---多处理器调度
引言
之前我们所学习的操作系统进程调度策略的前提条件是单处理器系统下的CPU调度程序。如果系统中存在多个CPU,那么负载分配就成为可能,但是相应的调度问题就会更加复杂。
多处理器调度方法
对于多处理器,CPU调度的一种方法是让一个处理器(主处理器)处理所有调度决定、I/O处理以及其他系统活动,其他处理器只执行用户代码。这个方称为非对称多处理(asymmetric multiprocessing),这种方法只有一个处理器访问系统数据结构,减少了数据共享的需要。
另外一种方法是使用对称多处理(sysmmetric multiprocessing, SMP),即每个处理器自我调度。所有进程可能处在一个共同的就绪队列中,也可能每个处理器都有自己私有的就绪队列。无论怎样,每个处理器的调度程序都检查共同就绪队列,以便选择执行一个进程。
处理器的亲和性
当一个进程运行在一个特定的处理器上时会缓存以该进程的一些数据和上下文,如果进程被迁移到另外一个处理器上,那么上一个处理器上缓存的数据设为无效,第二个处理器缓存应重新填充。由于缓存的无效或重新填充的代价很高,所以大多数SMP系统试图拍避免进程从一个处理器移到另一个处理器,而是试图让一个进程运行在同一个处理器上。这叫做处理器亲和性。亲和性具备多种形式:
当一个操作系统试图保持进程运行在同一处理器上,但是这个进程也可以迁移到其他进程上,这种亲和性叫做软亲和性
有的操作系统提供系统调用来支持硬亲和性,从而使某个进程运行在某个处理器子集中。(比如Linux实现软亲和性,但是也提供系统调用sched_setaffinity()来支持硬亲和性)。
系统的负载平衡
负载平衡设法将负载平均分配到SMP系统的所有处理器,这个概念很好理解。
需要注意的是,对于有些系统他们的处理器具有私有的可执行进程的队列,负载平衡是必须的,如何将一个进程分配到哪一个处理器的私有队列。对于另外一些系统具有公共队列,那么负载平衡就没有必要了,因为处理器一旦空闲,就会从公共就绪队列中取走一个就绪进程。
负载平衡具有两种方法:
- 推迁移:如果发现不平衡,将进程从超载处理器推到空闲或不太忙的处理器
- 拉迁移:空闲处理器从忙的处理器上拉一个等待任务,发生拉迁移
多核处理器
传统SMP系统具有多个物理处理器,但是当前的SMP系统将多个处理器放置在同一个物理芯片上,产生多核处理器。
许多硬件设计都采用多线程的处理器核,即每个核会分配到两个或多个硬件线程,这样如果一个线程停顿而等待内存时,该核可以切换到另一个线程。从操作系统角度来看,每一个硬件线程可以作为一个逻辑处理器,以便运行软件线程。
处理器核的多线程有两种方法:
- 粗粒度:粗粒度的多线程值在处理器上运行,直到一个长延迟时间发生,线程切换,且切换成本高
- 细粒度:线程在更细的粒度级别切换,切换成本低
一般情况下,一个多线程多核处理器实际上需要两个(或多个)不同级别的调度。一个级别的调度决策由操作系统做出,用于选择哪个软件线程运行在哪个硬件线程上(逻辑处理器),对于这个级别的调度,操作系统可以选择任何调度算法。
另一个级别的调度指定每个核如何决定运行哪个硬件线程,在这种情况下,有多种策略可以采用。比如Intel Itanium为双核处理器,而且每个核有两个硬件线程,每个硬件线程有一个动态的紧迫值,它的取值范围是0-7,用0表示最低的紧迫性,而7表示最高的,Itanium具有5个不同的事件,用于触发线程切换,当这些时间发生时,线程切换逻辑会比较两个线程的紧迫性,并选择紧迫性较高的线程在处理器核上执行。
OS之进程管理---多处理器调度的更多相关文章
- Linux进程管理与调度-之-目录导航【转】
转自:http://blog.csdn.net/gatieme/article/details/51456569 版权声明:本文为博主原创文章 && 转载请著名出处 @ http:// ...
- [Wolfgang Mauerer] 深入linux 内核架构 第二章 进程管理与调度【未完】
作为Linux开发爱好者,从事linux 开发有三年多时间.做过bsp移植,熟悉u-boot代码执行流程:看过几遍<linux 设备驱动程序开发>,分析过kernel启动流程,写过驱动, ...
- OS之进程管理---进程调度和多线程调度
进程调度基本概念 多道程序的目标就是始终允许某个进程运行以最大化CPU利用率,多个进程通时存在于内存中,操作系统通过进程调度程序按特定的调度算法来调度就绪队列中的进程到CPU,从而最大限度的利用CPU ...
- 深入Linux内核架构——进程管理和调度(下)
五.调度器的实现 调度器的任务是在程序之间共享CPU时间,创造并行执行的错觉.该任务可分为调度策略和上下文切换两个不同部分. 1.概观 暂时不考虑实时进程,只考虑CFS调度器.经典的调度器对系统中的进 ...
- 深入Linux内核架构——进程管理和调度(上)
如果系统只有一个处理器,那么给定时刻只有一个程序可以运行.在多处理器系统中,真正并行运行的进程数目取决于物理CPU的数目.内核和处理器建立了多任务的错觉,是通过以很短的间隔在系统运行的应用程序之间不停 ...
- Python::OS 模块 -- 进程管理
os模块的简介参看 Python::OS 模块 -- 简介 os模块的文件相关操作参看 Python::OS 模块 -- 文件和目录操作 os模块的进程参数 Python::OS 模块 -- 进程参数 ...
- Linux内核——进程管理与调度
进程的管理与调度 进程管理 进程描写叙述符及任务结构 进程存放在叫做任务队列(tasklist)的双向循环链表中.链表中的每一项包括一个详细进程的全部信息,类型为task_struct,称为进程描写叙 ...
- Linux内核入门到放弃-进程管理和调度-《深入Linux内核架构》笔记
进程优先级 硬实时进程 软实时进程 普通进程 O(1)调度.完全公平调度器 抢占式多任务处理(preemptive multitasking):各个进程都分配到一定的时间段可以执行.时间段到期后,内核 ...
- Linux高级调试与优化——进程管理和调度
进程管理 进程和文件是Linux操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...
随机推荐
- FTP中各文件目录的说明
DirectAdmin:FTP中各文件目录的说明 当您使用FTP连上空间后,FTP列表会出现以下文件和目录: domains目录:网站文件存放目录:public_html目录:快捷目录,可以快 ...
- hive 学习之异常篇
一.刚装上hive在执行hive启动的过程中出现 [hadoop@localhost hive-0.6.0]$ hive Invalid maximum heap size: -Xmx4096m Th ...
- 超全table功能Datatables使用的填坑之旅--1: 无法渲染表格数据: ajax调用了参数 : success
问题:Datatables: 无法渲染表格数据 原因:datatables的ajax 传了"success":function(){},导致无法渲染数据. ajax 删掉" ...
- HDU 2844 Coins (多重背包问题DP)
题意:给定n种硬币,每种价值是a,数量是c,让你求不大于给定V的不同的价值数,就是说让你用这些硬币来组成多少种不同的价格,并且价格不大于V. 析:一看就应该知道是一个动态规划的背包问题,只不过是变形, ...
- 关于linux下/srv、/var和/tmp的职责区分
转载自:https://blog.csdn.net/u012107143/article/details/54972544?utm_source=itdadao&utm_medium=refe ...
- Python中的replace方法
replace 方法:返回根据正则表达式进行文字替换后的字符串的复制. stringObj.replace(rgExp, replaceText) 参数 stringObj必选项.要执行该替换的 St ...
- 【转】Android贪吃蛇源代码
/*TileView:tile有瓦片的意思,用一个个tile拼接起来的就是地图.TileView就是用来呈现地图的类*/ public class TileView extends View { /* ...
- Hdu2612 Find a way 2017-01-18 14:52 59人阅读 评论(0) 收藏
Find a way Time Limit : 3000/1000ms (Java/Other) Memory Limit : 32768/32768K (Java/Other) Total Su ...
- Dalvik虚拟机java方法执行流程和Method结构体分析
Method结构体是啥? 在Dalvik虚拟机内部,每个Java方法都有一个对应的Method结构体,虚拟机根据此结构体获取方法的所有信息. Method结构体是怎样定义的? 此结构体在不同的andr ...
- OpenGL中的矩阵相乘
OpenGL中的矩阵相乘 1, 在OpenGL中所有的视图变换,模型变换 都是4×4矩阵,每个后续的glMultiMatrix*(N),或者变换函数,glTranslate* (),glRotate* ...