处理机调度的层次
- 高级调度 :又称作业调度,决定后备作业中谁调入内存运行
- 低级调度 : 又称进程调度,决定就绪队列中哪个进程获得CPU
- 中级调度 : 又称在虚拟存储器中引入,在内、外存对换区进行进程对换
作业控制块
JCB是作业在系统中存在的标志保存系统对作业进行管理和调度所需的全部信息。
- 作业标识
- 资源需要
a) 作业进入系统时,系统为其建立JCB,并根据作业类型将它插入相应的后备队列中。
b) 作业调度程序依据一定的调度算法调度它们,被调度到的作业将会装入内存。
c) 在作业运行期间,系统按照JCB中的信息对作业进行控制。
d) 当作业执行结束,进入完成状态时,系统负责回收分配给它的资源,撤消相应的JCB。
作业调度主要功能
根据作业控制块中信息,审查系统用户作业的资源需求,按一定算法,从外存的后备队列中选取作业调入内存,并创建进程、分配必要资源,再将新创建进程插入就绪队列,准备执行。
低级调度主要功能
- 保存处理机的现场信息
- 按某种算法选取进程
- 把处理器分配给进程
中级调度主要功能
-
把那些暂时不能运行的进程调至外存上去等待(不占用内存资源),即变成挂起状态(静止就绪/驻外存状态)。
-
当进程具备运行条件且内存有空闲时,由中级调度决定把外存上哪些具备运行条件的静止就绪进程重新调入内存,并修改其状态为活动就绪,等待进程调度。
调度队列模型
仅有低级(进程)调度的调度队列模型
具有高级和低级调度的调度队列模型
具有三级调度的调度队列模型
处理机调度算法共同目标
- 资源利用率高
- 公平性
- 各资源的平衡利用
- 策略强制执行
批处理系统的目标
- 周转时间短
- 作业周转时间 = 等待时间+运行时间 = 作业完成时刻 - 作业提交时刻
- 系统吞吐量高
- 处理机利用率高
分时系统的目标
- 响应时间快
- 均衡性
实时系统的目标
- 截止时间的保证
- 可预测性
作业与作业调度
进程调度人物
- 保存处理机的现场信息
- 按某种算法选取进程
- 把处理机分配给进程
相应机制
- 排队器
- 分派器
- 上下文切换器
进程调度方式
- 非抢占式
- 实现简单,系统开销小,但难以满足紧急任务的要求——立即执行
- 抢占式
- 能满足对响应时间有严格要求的实时任务的需求,但调度所需付出的开销较大
- 抢占原则
- 优先权原则
- 短作业(进程)优先原则
- 时间片原则
先来先服务(FCFS)算法
每次选择最先进入队列的作业
- 比较有利于长作业(进程),而不利于短作业(进程)
- 有利于CPU繁忙的作业,而不利于I/O繁忙的作业
短作业(进程)优先调度算法
选择一个估计运行时间最短的运行
- 对长作业(进程)不利
- 没有考虑紧迫程度
- 运行时间难以估计
高优先权优先调度算法
为照顾紧迫型作业,使之在进入系统后便获得优先处理
-
优先权的类型
-
静态优先权
优先权在创建进程时确定,整个运行期间不变
-
动态优先权
基于某种原则,使进程的优先权随时间改变而改变
-
-
高响应比优先调度算法
确定进程优先权的依据
- 进程类型
- 进程对资源的要求
- 用户要求
基于时间片的轮转调度算法
所有就绪进程按先来先服务(FCFS)的原则排成一个队列,每次调度时,把CPU分配给队首进程,并令其执行一个时间片后停止执行,进行进程调度
时间片大小的确定
- 对响应时间的要求
- 就绪队列中进程的数目
- 系统的处理能力
多级反馈队列调度算法
时间片轮转算法和优先级算法的综合和发展
原理
- 设置多个就绪队列
- 各队列中执行时间片的大小各不相同
- 新进程进入第一队列的末尾
- 当第一队列空闲时,才调度第二队列
实时调度
必要条件
- 提供必要的调度信息
- 系统处理能力强
- 采用抢占式调度机制
- 具有快速切换机制
算法分类
- 非抢占式调度算法
- 非抢占式轮转调度算法
- 非抢占式优先调度算法
- 抢占式调度算法
- 基于时钟中断的抢占式优先权调度算法
- 立即抢占的优先权调度算法
常见的实时调度算法
- 最早截至时间优先算法(EDF)
- 最低松弛度优先算法(LLF)
死锁
多个进程在运行过程中,因争夺资源而造成的一种僵局,若无外力作用,它们都将无法推进下去。
产生死锁的原因
- 竞争资源
- 进程间推进顺序非法
产生死锁的必要条件
- 互斥条件
- 请求和保持条件
- 不剥夺条件
- 环路等待条件
处理死锁的基本方法
- 预防死锁 : 通过设置某些限定条件,破坏死锁四个必要条件之一,来预防死锁发生
- 避免死锁 : 通过某些方法防止系统进入不安全状态
- 检测死锁 : 允许发生死锁,通过措施清除
- 解除死锁 : 与检测死锁配套的措施
预防死锁的方法
- 破坏“请求和保持”条件
- 破坏“不可抢占”条件
- 破坏“循环等待”条件
避免死锁
基本思想:让系统处于安全状态
- 允许进程动态的申请资源,一次申请一部分资源
- 系统在进行资源分配之前,先计算资源分配的安全性
- 若分配不会导致系统进入不安全状态,便将资源分配给进程,否则,进程必须等待
银行家算法
数据结构
- 可用资源向量Available
- 最大需求矩阵Max
- 分配矩阵Allocation
- 需求矩阵Need
算法描述
Requesti为进程Pi的请求向量,Requestsi[j] = K 表示进程Pi需要K个Rj类型的资源
- 如果Requesti[j] ≤ Need[i,j],转向步骤2,否则出错
- 如果Requesti[j] ≤ Available[j],转向步骤3,否则表示尚无足够资源,Pi需等待
- 系统尝试把资源分配给进程Pi,并修改相关数据结构的数值
- Available[j] = Available[j] - Availablei[j]
- Allocation[i,j] = Allocation[i,j] + Requesti[j]
- Need[i,j] = Need[i,j] - Requesti[j]
- 系统执行安全性算法,检查分配完资源后系统时候处于安全状态。若安全,完成分配,否则,本次分配作废,恢复原来的资源分配状态。
安全性算法
-
定义两个向量
-
Work表示系统可提供给进程继续运行所需的各类资源数目,初始Work = Available
-
Finish表示系统是否有足够的资源分配给进程,是指完成运行。初始Finish[i] = false,但有足够的资源是再令Finish[i] = true
-
-
从进程中找出一个满足条件的进程
- Finish[i] = false
- Need[i,j] ≤ Work[j]
若找到,执行步骤3,否则执行步骤4
-
当进程Pi获得资源后,可顺利执行,直至完成并释放资源,故应执行
- Work[j] = Work[j] + Allocation[i,j]
- Finish[i] = true
跳转步骤2
-
若所有进程的Finish[i] = true都满足。则表示系统处于安全状态,否则系统处于不安全状态。