一、三级调度
1.高级调度
1)调度对象:作业
2)主要功能:决定将外存的哪些作业调入内存
3)在每次执行作业调度时,都必须做以下决定:
(1)接纳多少个作业
(2)接纳哪些作业
4)只用于批处理系统
5)作业调度运行频率低,几分钟一次
2.低级调度
1)调度对象:进程
2)主要功能:决定就绪队列中哪个进程获得处理机
3)是最基本的调度
3.中级调度
1)内外存的信息对换
内存->外存(挂起状态)
外存->内存(内存有空间,进程又具备运行条件)
2)目的:
便于内存管理扩充,提高内存利用率和系统吞吐量
- 中级调度的运行频率介于高级和低级调度之间
- 调度队列模型
- 仅有进程调度的调度队列模型
- 具有高级和低级调度的调度队列
- 同时具有三级调度的调度队列模型
- 处理机调度算法的目标
- 处理机调度算法的共同目标
- 资源利用率 CPU的利用率=CPU有效工作时间/(CPU有效工作时间+CPU空闲等待时间)
- 公平性
- 平衡型
- 策略强制执行
- 批处理系统的目标
- 平均周转时间短
周转时间是指从作业被提交系统(外存)开始,到作业完成为止的这段时间间隔
周转时间包括四部分:
- 等待作业调度时间
- 等待进程调度时间
- 进程在CPU上执行的时间
- 进程等待I/O操作完成时间(有阻塞)
平均周转时间:
带权周转时间:W=T/Ts
平均带权周转时间:
1)系统吞吐量高
吞吐量是指在单位时间内系统所完成的作业数
2)处理机利用率好
- 分时系统的目标 1)响应时间快
响应时间是指偶从用户通过键盘提交一个请求开始,直至系统首次产生响应为止的时间
计算公式:响应时间=从键盘输入的请求信息传送到处理机的时间+处理机对请求信息进行处理的时间+将所形成的响应信息回送到终端显示器的时间。
2)均衡性
均衡性是指系统响应时间的快慢与用户所请求服务的复杂性相适应
- 实时系统的目标 1)截止时间的保证
截止时间是指某任务必须开始执行的最迟时间,或必须完成的最迟时间
2)可预测性
- 作业调度 1.作业概念:
作业是一个比程序更为广泛的概念,它不仅包含了通常的程序和数据,而且还应配有一份作业说明书,系统根据该说明书来对程序的运行进行控制。在批处理系统中,是以作业为基本单位从外存调入内存的。
2.作业控制块(JCB)
为了管理和调度作业,在多道批处理系统中为每个作业设置了一个作业控制块,它是作业在系统中存在的标志(每当作业进入系统时创建),其中保存了系统对作业进行管理和调度所需的全部信息。
- 作业运行的三种状态 1)收容阶段 2)运行阶段 3)完成阶段
- 作业调度的主要任务
作业调度的主要任务是,根据JCB中的信息,检查系统中的资源能否满足作业对资源的需求,以及按照一定的调度算法,从外存的后备队列中选取某些作业调入内存,并为它们创建进程、分配必要的资源。然后再将新创建的进程排在就绪队列上等待调度
- 作业调度算法
- 先来先服务算法(FCFS)
基本思想:算法既可用于作业调度,也可用于进程调度。
当在作业调度中采用该算法时,系统将按照作业到达的先后次序来进行调度,或者说它是优先考虑在系统中等待时间最长的作业,从后备作业队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程。然后把它放入就绪队列
优缺点:有利于长作业(进程),不利于短作业(进程)
2.短作业(进程)优先调度算法(SJF)
基本思想:SJF算法是以作业的长短来计算优先级,作业越短,其优先级越高。作业的长短是以作业所要求的运行时间来衡量的。SJF算法可以分别用于作业调度和进程调度。在把短作业优先调度算法用于作业调度时,它将从外存的作业后备队列中选择若干个估计运行时间最短的作业,优先将它们调入内存运行
缺点:
1)该算法对长作业不利,长作业的周转时间会明显地增长。更严重的是,该算法完全忽视作业的等待时间,可能使作业等待时间过长,出现饥饿现象
2)该算法完全未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)会被及时处理
3)由于作业(进程)的长短只是根据用户所提供的估计执行时间而定的,而用户又可能会有意地缩短其作业的估计运行时间,致使该算法不一定能真正做到短作业优先调度
3.优先级调度算法(PSA)
基本思想:
(1)由用户自己根据作业的紧急程度输入一个适当的优先级。
为防止各用户都将自己的作业冠以高优先级,系统应对高优先级用户收取较高的费用。
(2)由系统或操作员根据作业类型指定优先级。
作业类型一般由用户约定或由操作员指定。例如:可将作业分为:
I/O繁忙的作业,CPU繁忙的作业,I/O与CPU均衡的作业,一般作业
(3)系统根据作业要求资源情况确定优先级。
与其他算法的比较:
FCFS 强调的在系统的等待时间
SJF 强调运行的时间
4.高响应比优先调度算法(HRRN)
基本思想:能为每个作业引入一个动态优先级,即优先级是可以改变的,令它随等待时间延长而增加,这将使长作业的优先级在等待期间不断地增加,等到足够的时间后,必然有机会获得处理机。该优先级的变化规律可描述为:由于等待时间与服务时间之和,就是系统对该作业的响应时间,故该优先级又相当于响应比Rp。据此,又可表示为:
优缺点:
该算法既照顾了短作业,又考虑了作业到达的先后次序,不会使长作业长期得不到服务。因此,该算法实现了一种较好的折衷。当然,在利用该算法时,每要进行调度之前,都须先做响应比的计算,会增加系统开销。
- 进程调度
- 进程调度的任务
- 保存处理机的现场信息。
2)按某种算法选取进程。
3)把处理器分配给进程。 - 进程调度机制:
为了实现进程调度,在进程调度机制中,应具有如下三个基本部分
(1) 排队器。
(2) 分派器。
(3) 上下文切换器。
- 进程调度方式:
- 非抢占方式
- 抢占方式
- 进程调度算法
- 先来先服务算法(FCFS)
- 短作业优先算法(SJF)
- 优先级调度算法(PSA)
- 高响应比优先调度算法(HRRN)
- 时间片轮转算法(RR)
基本思想:
所有就绪进程按FCFS原则进行调度,每次执行一个时间片。当时间片用完二进程未完,则插入就绪队列末尾。
优缺点:简单易行,平均响应时间短,不利于处理紧急任务
6.多级反馈队列调度算法(MFQ)
基本思想:
(1)设置多个就绪队列,赋予不同的优先级和不同长度的时间片
(2)每个队列都采用FCFS算法
(3)按队列优先级调度
优点:该算法能较好地满足各类型用户(进程)的需要
- 实时调度
- 基本条件:
- 提供详细的调度信息
- 系统处理能力强
- 具有快速切换机制
- 采用抢占式调度机制
- 实时调度的分类:
- 非抢占式轮转调度算法
- 非抢占式优先调度算法
- 基于时钟中断抢占式优先级调度算法
- 立即抢占的优先级调度算法
- 常用的几种实时调度算法
- 最早截止时间优先算法(EDF)
(1)思想:根据任务的开始截至时间来确定任务的优先级,即任务的开始截止时间越早,其优先级越高
(2)可采用非抢占式调度方式,也可采用抢占式调度方式
非抢占式调度方式用于非周期实时任务
抢占式调度方式用于周期实时任务
2.最低松弛度优先算法(LLF)
- 思想:根据实时任务的松弛度来确定任务的优先级
松弛度=任务必须完成的时间-任务本身的运行时间-当前时间
- 实现时按松弛度排序的实时任务就绪队列
- 当一任务的最低松弛度为0时,立即抢占CPU
- 优先级倒置
- 定义:
当前OS广泛采用优先级调度算法和抢占方式,然而在系统中存在着影响进程运行的资源而可能产生“优先级倒置”的现象,即高优先级进程(或线程)被低优先级进程(或线程)延迟或阻塞
- 解决方法:
一种简单的解决方法是规定:假如进程P3在进入临界区后P3所占用的处理机就不允许被抢占
七、死锁
- 概念:是指多个进程在运行时因争夺资源而造成的一种僵局,若无外力作用,它们都将无法再向前推进
- 产生原因:
- 竞争资源
消耗性资源
不可抢占性资源
- 进程推进顺序不当
- 必要条件(必须所有条件全部满足才会发生死锁):
- 互斥条件
- 请求与保持条件
- 不剥夺条件
- 环路等待条件
- 处理死锁的方法:
- 预防死锁
- 避免死锁
- 检测死锁
- 解除死锁
- 预防死锁的方法及定义
1)定义:
通过设置某些限制条件,破坏导致死锁的四个必要条件之一
“互斥条件”-由资源的性质决定,不可破坏且要保证
2)破坏“请求和保持”条件
目标:防止“保持时请求,请求时保持”
(1)第一种协议
方法:在进程开始运行前,一次性分配给它所需的“全部”资源
优点:简单易实现,安全性高
(2)第二种协议
方法:允许一个进程只获得运行初期所需的资源后,便开始运行。进程运行过程中再逐步释放已分配给自己的,且已用毕的全部资源,然后再请求新的所需资源
优点:资源利用率高,减少了饥饿现象
3)破坏“不可抢占”条件
目标:变不可剥夺为可剥夺
方法:在进程运行中,若新的资源请求得不到满足,必须适当已占有的资源,待以后重新申请
缺点:实现起来比较复杂,代价高
4)破坏“循环等待”条件
目标:避免出现请求环
方法:资源按类型排序,进程按照资源序号递增的次序提出自愿申请。(有序资源分配法)
优点:资源利用率高和系统吞吐量大
缺点:必须按顺序申请,显示新设备的增加和程序员的自主编程
- 死锁避免
- 定义:
并不需要事先采取各种限制措施去破坏产生死锁的四个必要条件,而是在资源动态分配过程中,用某种方法防止系统进入不安全状态,从而避免死锁。
- 安全状态及安全序列:
所谓安全状态,是指系统能按某种进程顺序(P1,P2,…,Pn)(称〈P1,P2,…,Pn〉序列为安全序列),来为每个进程Pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利地完成。
- 不安全状态:
不存在安全序列
- 安全性检测算法
- Work[0...m]=Available[0...m];
Finish[0...n]=false;
- 从进程集合中寻找满足下列条件的进程Pi;
Finish[i]=false;
Need[i,j]<=Work[j];
若找到,转(3);否则,转(4)
- 进程Pi可获得资源,然后执行完毕,并释放资源;
Work[j]=Work[j]+Allocation[i,j];
Finish[i]=true;
转(2)
- 判断:若对所有Pi,Finish[i]=true;
则系统处于安全状态,否则处于不安全状态。
- 银行家算法
- 算法描述:
(1进行资源预分配
(2实施安全检测
安全:真正资源分配
不安全:回到预分配前状态
- 数据结构:
(1) 可利用资源向量Available。
(2) 最大需求矩阵Max。
(3) 分配矩阵Allocation。
(4) 需求矩阵Need。
- 死锁检测
- 死锁定理
在资源分配图中,把分配的资源与进程连好,再看进程请求边,按照分配边分配好以后,剩余的资源就是空闲资源,此时再来分析进程Pi的请求边,如果空闲资源都能够满足Pi的请求,也就意味着Pi可以从这个纠缠的图中得到解脱。删除Pi的所有相关的资源:已分配的+请求的。
- 死锁检测算法
- 为了能对系统中是否已发生了死锁进行检测,在系统中必须:
(1保存有关资源的请求和分配信息;
(2提供一种算法,它利用这些信息来检测系统是否已进入死锁状态。 - 具体实现过程:
(1找出一个既不阻塞又非独立的进程结点Pi,Pi可获得所需资源直至运行完毕,再释放其所占有的全部资源,相当于消去Pi所有的请求边和分配边 ,使之成为孤立点
(2重复上述步骤,若能使所有的进程结点都成为孤立结点,则称该图是可完全简化的,否则,则称该图不可完全简化
(3)数据结构:
(1) 可利用资源向量Available,它表示了m类资源中每一类资源的可用数目。
(2) 把不占用资源的进程(向量Allocationi:=0)记入L表中,即Li∪L。
(3) 从进程集合中找到一个Requesti≤Work的进程,做如下处理:
① 将其资源分配图简化,释放出资源,增加工作向量Work:=Work + Allocation i。
② 将它记入L表中。
(4) 若不能把所有进程都记入L表中,便表明系统状态S的资源分配图是不可完全简化的。 因此,该系统状态将发生死锁。
Work:=Available;
L:={Li |Allocation i=0∩Request i=0}
for all Li L do
begin
for all Request i≤Work do
begin
Work :=Work + Allocation i;
Li∪L;
end
end
deadlock :=┓(L={p1,p2,…,pn});
- 死锁解除(实现上难度最大)
- 定义:
这是与检测死锁相配套的措施。常用的方法是撤消或挂起一些进程,以便回收一些资源,分配给已处于阻塞状态的进程,使之转为就绪状态,以继续运行。
- 常用方法:
- 撤销进程
- 按照某个顺序逐个撤销进程
3)剥夺资源