处理机调度:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。
提高处理机的利用率、改善系统性能,很大程度上取决于处理机调度的性能。
处理机调度便成为OS设计的中心问题之一。分配的任务由处理机调度程序完成。
作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度。
1、高级调度(HighScheduling)
又称作业调度或长程调度(Long-TermScheduling),接纳调度(AdmissionScheduling)
主要在早期批处理阶段,处理在外存上的作业。
决定外存后备队列中的哪些作业调入内存;
为它们创建进程、分配必要的资源;
将新创建的进程排在就绪队列上,准备执行。
*管理的方面比较多。
作业调度决定的细节
在每次执行作业调度时,都须作出两个决定:
接纳多少作业——取决于多道程序度。应根据系统的规模和运行速度等情况综合考虑。
接纳哪些作业——取决于采用的调度算法。如先来先服务,短作业优先等(后面详细介绍)
系统运行并不一定存在高级调度
批处理系统:作业进入系统后先驻留外存,故需要有作业调度。
分时系统:为及时响应,作业由终端直接送入内存,故不需作业调度。
实时系统中,通常也不需作业调度。
2、低级调度(LowLevelScheduling)
也称为进程调度、微观调度或短程调度(Short-TermScheduling)
决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。
进程调度方式
1)非抢占方式(Non-preemptiveMode)
一旦处理机分配给某进程,该进程一直执行。决不允许其他进程抢占已分配运行进程的处理机。
2)抢占方式(PreemptiveMode)
允许调度程序根据某种原则,暂停某个正在执行的进程,将处理机重新分配给另一进程。
调度程序的任务职能:调度和分派。
(1)记录系统中所有进程的有关情况
(2)确定分配处理机的原则
(3)分配处理机给进程
(4)从进程收回处理机
3、中级调度(Intermediate-LevelScheduling)
又称交换调度或中程调度(Medium-TermScheduling)
引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。
三种调度的频率和复杂度
中级调度:运行频率基本上介于上述两种调度之间。
4、调度队列模型
不论高级、中级或者低级调度,都涉及到进程队列,由此形成了三类调度队列模型。从这三种方式中体验调度的过程。
1)仅有进程调度的调度队列模型
常见情况:
分时系统。
通常仅设置进程调度,用户键入的命令和数据,都直接送入内存。
调度对象:
处于就绪状态的进程。
组织形式:
栈、树或一个无序链表
进程调度过程如下图:
①完成工作,释放处理机进入完成状态
②未完成,将该任务再放入就绪队列末尾
③因某事件而被阻塞,被OS放入阻塞队列
2)具有高级和低级调度的调度队列模型
批处理系统中,还需要作业调度
3)同时具有三级调度的调度队列模型
引入中级调度后,进程的状态变化:
就绪状态:分为内存就绪和外存就绪。
阻塞状态:分为内存阻塞和外存阻塞。
中级调度使进程在上述状态间变化,并使数据在内外存间互换。
5.选择调度方式和调度算法的若干准则
什么算法是好算法?
不同的情况和对象需求不同,适用的方式和算法也不同。
1)面向用户的准则
CPU执行用时Ts
优先权准则:三大基本OS在调度算法的选择时都可遵循。可以使关键任务达到更好的指标。
2)面向系统的准则
系统吞吐量高:批处理系统的重要指标。
处理机利用率好(主要针对大中型主机)
各类资源的平衡利用(主要针对大中型主机)
不同系统需求各有侧重
批处理系统
系统吞吐量高
处理机利用率好
分时系统
均衡
实时系统
可预测性
二.常用调度算法
调度的实质就是一种资源分配。不同的系统和系统目标,通常采用不同的调度算法——适合自己的才是最好的。
如批处理系统为照顾为数众多的短作业,应采用短作业优先的调度算法;
目前存在的多种调度算法中,有的算法适用于作业调度,有的算法适用于进程调度;但有些算法作业调度和进程调度都可以采用。
1、先来先服务调度算法FCFS(FirstComeFirstService)
一种最简单的调度算法,按先后顺序进行调度。既可用于作业调度,也可用于进程调度。
按照作业提交,或进程变为就绪状态的先后次序分派CPU;
新作业只有当当前作业或进程执行完或阻塞才获得CPU运行
被唤醒的作业或进程不立即恢复执行,通常等到当前作业或进程出让CPU。(所以,默认即是非抢占方式)
关于应用:有利于CPU繁忙型的作业,而不利于I/O繁忙的作业(进程)。
从程序规模上看,一般I/O繁忙型作业CPU进行处理的用时相对比较短,CPU繁忙型的作业相对较长。而FCFS不利于短作业,I/O繁忙型作业一旦排队靠后就会处于劣势。
另一方面,I/O繁忙型作业需频繁的请求I/O,即使排队靠前,但由于I/O请求阻塞,重新排队可能就会排到队尾(这一情况在其他算法下也是普遍的,但不同的算法,排队情况不同,相对的在照顾公平性上也会有所不同)。
目前大多数事务处理都属于I/O繁忙型作业。
2.短作业(进程)优先调度算法SJF/SPF(ShortestJobFirst)OR(ShortestProcessFirst)
优点:
方式:
分抢占和非抢占两种方式,上例为简单的非抢占式。
SJF/SPF的不足:
1.对短作业有利,但同时造成了对长作业的不利。
2.由于作业(进程)的长短含主观因素,不一定能真正做到短作业优先。
3.未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)的及时处理。
3.高优先权优先调度算法HPFHighestPriorityFirst
照顾紧迫性作业,使其获得优先处理而引入调度算法。常用于批处理系统中的作业调度算法,以及多种操作系统中的进程调度算法
1)分两种方式:
非抢占式优先权算法
抢占式优先权算法关键点:新作业产生时
2)优先权的类型
静态优先权:创建进程时确定,整个运行期间保持不变。一般利用某一范围的一个整数来表示,又称为优先数。
关于进程优先权的确定?依据如下:
①进程类型:一般来,系统进程高于用户进程。
③用户要求:由用户进程的紧迫程度及用户所付费用的多少来确定优先权的。
3)高响应比优先调度算法HRRNHighestResponseRaitoNext
短作业优先算法是一种比较好的算法(相当于根据作业长度设定的静态优先权算法),适用于短作业较多的批处理系统中,其主要不足是长作业的运行得不到保证。
*对不同作业都有照顾*
①同时到达的作业优先权相同。
什么时候计算各进程的响应比优先权?
需要进行调度选择的时候比较各自优先权
作业完成时
新作业产生时(抢占、非抢占)
进程阻塞时
①将系统中所有的就绪进程按照FCFS原则,排成一个队列。
④调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。
能够及时响应,但没有考虑作业长短等问题。
过长会怎样?——FCFS
过短会怎样?——频繁切换
做题时给出统一的假设:
若设新进程就绪比较快,就统一按BA的顺序排入就绪队列。
若设旧进程该为就绪比较快,则统一按AB排序
(2)多级反馈队列算法FB(Multiple-levelFeedBackQueue)
①设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。
③当一个新进程进入内存,引发的调度过程
a.准备调度:先将它放入第一个队列的末尾,按FCFS原则排队等待调度。
注意:
仅当优先权高的队列(如第一队列)空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。
高优先级抢占问题:
第i队列中为某进程正占有CPU,又有新进程进入优先权较高的队列(第1~i-1队中);
被抢占的进程放回原就绪队列末尾;
*多级反馈队列调度算法的性能*
多级反馈队列调度算法具有较好的性能,能较好的满足各种类型用户的需要。
长批处理作业用户。将依次在1~n级队列中轮转执行,不必担心作业长期得不到处理。
基于公平原则的更多算法
①保证调度算法
处理机分配的公平性:
针对用户考虑,如根据a(4个进程),b(2个进程)用户所拥有进程数目,决定一个比率
a1,a2,b1,a3,a4,b2……
优先级倒置问题的讨论
有人罩着就是好^_^
p1,p2,p3优先级从高到低
p3(运行)先占有一互斥信号mutex
p2(运行)可以抢p3(就绪)
p1来申请mutex,即使优先级高,但信号量拿不到只能阻塞,又回到p2
p2来了,p3
三.实时调度
什么是实时系统?
实时系统的任务往往带有某种程度的紧迫性,因而实时系统的调度有某些特殊要求。
为此引入适合的实时调度算法
为保证系统正常工作,调度应具备下列条件
1.实现实时调度的基本条件
1)提供必要的信息
为了实现实时调度,系统应向调度程序提供有关任务的下述信息:
资源要求。任务执行时所需的一组资源。
优先级。根据任务性质赋予不同优先级。
2)系统处理能力足够强
处理能力不足可能会出现某些实时任务不能得到及时处理,导致难以预料的后果。
如:
提高系统处理能力的方法
增强单机系统的处理能力
采用多处理机系统
此情况下需满足
∑(Ci/Pi)≤N,N为处理机数
3)采用抢占式调度机制
硬实时任务:广泛采用抢占机制。
4)具有快速切换机制
①对外部中断的快速响应能力。
利用快速硬件中断机构,可在紧迫的外部事件请求中及时响应。
②快速的任务分派能力。
使系统中的运行功能单位适当的小,提高切换速度。类如线程的思想
2.实时调度算法的分类
硬实时调度算法静态调度算法
软实时调度算法;动态调度算法。
按调度方式多处理机环境下
非抢占调度算法集中式调度
抢占调度算法;分布式调度
1)非抢占调度算法
该算法较简单,用于一些小型实时系统或要求不太严格的实时系统中,又可分为:
①非抢占式轮转调度算法。常用于工业生产的群控系统中,要求不太严格。
2)抢占式调度算法
①基于时钟:某高优先级任务到达后并不立即抢占,而等下一个时钟中断时抢占。
②立即抢占:一旦出现外部中断,只要当前任务未处于临界区,就立即抢占处理机。
3.常用的几种实时调度算法
目前有许多实时调度算法,在常用的算法中简单介绍两种实时调度算法:
系统保持一个实时任务就绪队列
调度程序总是选择就绪队列中的第一个任务,分配处理机使之投入运行。
新任务产生时,是否等当前程序执行完:
抢占式/非抢占式
可能会使作业错过,但可适用于软实时系统
2)最低松弛度优先LLF(LeastLaxityFirst)
根据任务紧急(或松弛)的程度,来确定任务的优先级。任务的紧急程度越高(松弛度值越小),优先级就越高。
进程切换发生的时机
进程执行完
进程I/O阻塞
新进程出现时可能的抢占
某进程松弛度为0时发生抢占
有的时刻,其他并发的实时任务下一周期未到来,会出现只有一个任务的情况。
多处理机系统中的调度
提高计算机系统性能的途径:
提高计算机元器件速度
改进计算机系统体系结构
20世纪70年代出现多处理器系统MPS(MultiProcessorSystem)。90年代中后期,功能较强的主机或服务器都采用了MPS。
1.多处理器系统的类型
不同角度分类
1)紧密耦合MPS和松弛耦合MPS
紧密耦合(TightlyCoupted)
高速总线或高速交叉开关来实现多个处理器之间的互连。
共享主存储器系统和I/O设备。系统中所有进程和资源由OS统一控制管理。
松散耦合(LooselyCoupted)
通过通道或通信线路来实现多台计算机之间互连。
每台计算机都有自己的存储器和I/O设备,可以独立工作。
2)对称MPS和非对称MPS
对称多处理系统SMPS(SymmetricMultiProcessorSystem)平等型:在系统中所包含的各处理器单元在功能上和结构上都相同。当前的绝大多数MPS属于此类。
非对称多处理器系统。主从型:系统中有多种类型的处理单元,它们的功能和结构各不相同,其中只有一个主处理器,其余为从处理器。
2.进程分配方式
在多处理器系统中,进程的调度与系统结构有关。
同构性系统中,所有处理器都相同,可将进程分配到任一处理器上运行;
非对称MPS,对任一进程而言,都只能将其分配到某一适合于其运行的处理机上去执行。下面分别介绍对称MPS和非对称MPS中的进程分配方式。
1)对称MPS中的进程分配方式
①静态分配(StaticAssignment)方式:
进程从开始至完成被固定分配到一个处理器上。
优点是进程调度开销小,缺点是各处理器可能出现忙闲不均。
②动态分配(DynamicAssignment)方式:
系统中仅设置一个公共的就绪队列,分配进程总是给空闲处理器。某一进程的执行可能曾在不同的处理器上。
优点是消除忙闲不均现象。但松散耦合系统增大调度开销。
2)非对称MPS中的进程分配方式
OS的核心部分驻留在一台主机上,而从机上只是用户程序,进程调度只由主机执行。主机中保持有一个就绪队列。
每当从机空闲时向主机发一索求进程信号,然后等待主机分配进程。
优点是系统处理比较简单,缺点是处理靠一台主机导致不可靠。(克服缺点的方法是利用多台而非一台管理系统)
3.进程(线程)调度方式
MPS已广为流行多年,存在着多种调度方式,许多都是以线程作为基本调度单位的,比较有代表的如下:
1)自调度(Self-Scheduling)方式
自调度机制,最简单的一种调度方式。
系统中设置一个公共的进程或线程就绪队列,所有的处理器空闲时,都可自己到该队列中取得一进程(线程)来运行。
调度算法:可采用FCFS、FPF和抢占式最高优先权优先调度算法等。经实验证明FCFS算法在多处理器环境下简单开销小,目前成为较好的调度算法。
自调度方式的特点
1)易将单机环境下的调度机制移植到MPS中;
2)不会发生处理器忙闲不均的现象,有利于提高处理器的利用率。
缺点:
1)瓶颈问题。多处理器互斥访问唯一就绪队列。
2)低效性。高速缓存的使用效率很低。
2)成组调度(GangScheduling)方式
为解决自调度方式中线程频繁切换的问题
相互合作的进程或线程能并行执行,可有效的减少阻塞,减少切换使系统性能得到改善;
每次调度都可以解决一组线程的处理器分配问题,故可显著减少调度频率,减少了调度开销。
3)专用处理器(DedicatedProcessorAssignment)方式
1989年Tucker提出该方式。在一个应用程序的执行期间,专为该应用程序分配一组处理器,每一个线程一个处理器。
这种方式很浪费。但仍有利用市场,适用于并发程度相当高的多处理机环境:
对系统的性能和效率来讲,单个处理器的利用率已不太重要。
“专用”完全避免了切换,从而大大加速了程序运行。
同时加工的应用程序,线程总和不应超过系统处理机的数目。