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操作系统的两个最基本的抽象. 进程是处于执行期的程序,进程不仅仅局限于一段可执行程序代码,通常还包含其他资源,如打开的文件.挂起的信号.内核内部数据.处理器状态.进程地 ...
随机推荐
- ubuntu系统下安装pyspider:使用supervisord启动并管理pyspider进程配置及说明
首先感谢segmentfault.com的“imperat0r_”用户的文章和新浪的“小菜一碟”用户的文章.这是他们的配置文件.我参考也写了一个,在最后呢. 重点说明写在前面.本人用superviso ...
- eclipse代码自动提示,eclipse设置代码自动提示
eclipse代码自动提示,eclipse设置代码自动提示 eclipse是很多JAVA开发者基本上都用的工具,用它可以很方便的开发JAVA代码,当编写JAVA代码时,大部分人都是按组合键[Alt+/ ...
- 2018.08.27 rollcall(非旋treap)
描述 初始有一个空集,依次插入N个数Ai.有M次询问Bj,表示询问第Bj个数加入集合后的排名为j的数是多少 输入 第一行是两个整数N,M 接下来一行有N个整数,Ai 接下来一行有M个整数Bj,保证数据 ...
- 经典的SQL语句面试题(转)
Student(S#,Sname,Sage,Ssex) 学生表Course(C#,Cname,T#) 课程表SC(S#,C#,score) 成绩表Teacher(T#,Tname) 教师表 问题:1. ...
- mysql date_sub用法
查询一天: select * from table where to_days(column_time) = to_days(now()); select * from table where dat ...
- 1) Spring_HelloWorld
1. Spring Tool Suite™ 方式一:下载对应eclipse版本的文件,离线安装 4.4.2 springsource-tool-suite-3.6.4.RELEASE-e4.4.2-u ...
- stdafx.h、stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编
sstdafx.h.stdafx.cpp是干什么用的?为什么我的每一个cpp文件都必须包含stdafx.h? Windows和MFC的include文件都非常大,即使有一个快速的处理程序,编译程序也要 ...
- 老刘 Yii2 源码学习笔记之 Action 类
Action 的概述 InlineAction 就是内联动作,所谓的内联动作就是放到controller 里面的 actionXXX 这种 Action.customAction 就是独立动作,就是直 ...
- 团队项目(第四周冲刺之二)—GG队
项目冲刺: 队员 学号 叶尚文(队长) 3116008802 蔡晓晴 3216008808 杜婷萱 3216008809 龙剑初 3116004647 于泽浩 3116004661 (先把帅气的合照不 ...
- 关于单例的DCL方式分析
public class Singleton { /** * 单例对象实例 */ private volatile static Singleton instance = null; public s ...