处理机调度和死锁
处理机调度的层次
处理机调度是对处理机资源进行分配。处理机调度算法是指根据处理机分配策略所规定的处理机分配算法。
(1)高级调度:作业调度
(2)低级调度:进程调度
(3)中级调度:内存调度
在上述三种调度中,进程调度的运行频率最高,因此把它称为短程调度(低级调度);作业调度往往是一批作业已运行完毕并退出系统,又需要新调入一批作业进入内存时,作业调度的周期较长,因此称为长程调度(高级调度);中级调度的运行频率基本介于上述两种之间,因此称为中程调度。
作业调度
在每次执行作业调度时,都需要做出以下两个决定:
1、接纳多少作业;
2、接纳哪些作业。
先来先服务FCFS(First-Come-First-Served)
FCFS是最简单的调度算法,该算法既可用于作业调度,也可用于进程调度。
从后备队列中选择几个最先进入该队列的作业,将它们调入内存,为它们分配资源和创建进程,然后把它们放入就绪队列。
经常把它与其他调度算法相结合,形成一种更有效的调度算法。例如,可以在系统中按进程的优先级设置多个队列,每个优先级一个队列,其中每一个队列的调度都基于FCFS算法。
短作业优先SJF(Short Job First)
SLF算法是以作业的长度来计算优先级,作业越短,其优先级越高。
SJF算法可以分别用于作业调度和进程调度。
缺点:
- 必须预知作业的运行时间
- 对长作业不利
- 未考虑作业的紧迫程度
优先级调度算法PSA(Priority Scheduling Algorithm)
在优先级调度算法中,基于作业的紧迫程度,由外部赋予作业的优先级。
优先级调度算法,既可以作为作业调度算法,也可作为进程调度算法。
高响应比优先调度算法HRRN(Highest Response Ratio Next)
高响应比优先调度算法,既考虑了作业的等待时间,又考虑作业运行时间的调度算法。
进程调度
1、进程调度的任务
- 保存处理机的现场信息
- 按某种算法选取进程
- 把处理器分配给进程
2、进程调度方式
- 非抢占方式
- 抢占方式
- 允许调度程序根据某种规则去暂停某个正在执行的进程,在现代OS中广泛采用抢占式
- 原则
- 优先权原则(优先级高的进程)
- 短进程优先原则
- 时间片原则
3、轮转调度算法
基于时间片的轮转(round robin,RR)调度算法。
在轮转算法中,系统根据FCFS策略,将所有就绪进程排成一个就绪队列,并可设置每隔一定时间间隔即产生一次中断,**系统中的进程调度程序,完成一次调度,将CPU分配给队首进程。当该进程的时间片耗尽或者运行完毕时,系统再次将CPU分配给新的队首进程。
进程切换时机:
- 一个时间片尚未用完,正在运行的进程便已完成,就立即**调度程序,调度就绪队列中的队首进程,并启动一个新的时间片;
- 在一个时间片用完时,计时器中断处理程序被**,如果进程尚未运行完毕,调度程序将把它送往就绪队列的尾部。
时间片大小的确定:
到达时间 | 服务时间 | 完成时间 | 周转时间 | 带权周转时间
周转时间 = 完成时间 - 到达时间
带权周转时间 = 周转时间 / 服务时间
4、优先级调度算法
把处理机分配给就绪队列中优先级最高的进程,这时,又可进一步把该算法分成如下两种:
- 非抢占式优先级调度算法
- 抢占式优先级调度算法
5、多队列调度算法
6、多级反馈队列调度算法
死锁
1、资源问题
- 可抢占性资源:指进程在获得这类资源后,该资源可以再被其他进程或系统抢占。对于这类资源,是不会引起死锁的;
- 不可抢占性资源:一旦系统把某资源分配给该进程后,就不能将它强行回收,只能在进程用完后自行释放。
2、计算机系统中的死锁
- 竞争不可抢占性资源引起死锁
通常系统中所拥有的不可抢占式资源其数量不足以满足多个进程运行的需要,使得进程在运行过程中,会因为争夺资源而陷入僵局。
- 竞争可消耗资源引起死锁
- 进程推进顺序不当引起死锁
3、死锁的定义
如果一组进程中的每一个进程都在等待仅由该组进程中的其他进程才能引发的事件,那么该组进程是死锁的。
4、产生死锁的必要条件
- 互斥条件:进程对所分配到的资源进行排他性使用,即在一段时间内,某资源只能被一个进程使用。如果还有其他进程请求该资源,则请求进程只能等待,直到占有该资源的进程使用完毕释放;
- 请求和保持条件:进程已经保持了至少一个资源,但有提出了新的资源请求,而该资源已被其他进程占有,此时请求进程被阻塞,但对自己已获得的资源保持不放;
- 不可抢占条件:进程已获得的资源在未使用完之前不能被抢占,只能在进程使用完毕后由自己释放;
- 循环等待条件:在发生死锁时,必然存在一个进程—资源的循环链,即进程集合{P0,P1,P2,…Pn}中的P0正在等待一个P1占用的资源,P1正在等待P2占用的资源,…,Pn正在等待已被P0占用的资源。
5、处理死锁的方法
目前处理死锁的方法可归为四种:
- 预防死锁,设置限制条件去破坏产生死锁四个必要条件中的一个或几个来预防死锁,已被广泛使用;
- 避免死锁,同样是事先预防策略,但它不是破坏产生死锁的四个必要条件,而是在资源的动态分配过程中,用某种方法防止系统进入不安全状态;
- 检测死锁,允许进程在运行过程中发生死锁,但可通过检测机构及时检测,然后采取适当的措施;
- 解除死锁,常用的方法是:撤销一些线程,回收它们的资源,将资源分配给已处于阻塞状态的进程。
6、预防死锁
主要是破坏产生死锁的后三个条件。
7、避免死锁
系统安全状态:所谓安全状态,是指系统能按某种进程推进顺序(p1,p2,p3,…pn)为每个进程pi分配其所需资源,直至满足每个进程对资源的最大需求,使每个进程都可顺利的完成。此时称(p1,p2,p3,…pn)为安全序列。
如果系统无法找到这样一个安全序列,则称系统处于不安全状态。
8、安全状态之例
假定系统中有三个进程P1,P2,P3,共有12台磁带机,进程P1总共要求10台磁带机,P2和P3分别要求4台和9台。
假设在T0时刻,进程P1,P2,P3已分别获得5台、2台和2台磁带机,尚有3台未分配。
经分析,在T0时刻系统是安全的,因为这是存在一个安全序列<P2,P1,P3>。
将剩余的磁带机取2台分配给P2,待P2完成便可释放出4台,于是可用资源增至5台,以后再将这些全部分配给进程P1,待P1完成后,可用资源来到10台,P3便可以获得其所需的7台磁带机。
9、利用银行家算法避免死锁
9.1、银行家算法中的数据结构
- 可利用资源向量Available,这是一个含有m个元素的数组,其中每一个元素代表一类可利用的资源数目
- 最大需求矩阵Max,这是一个N * M的矩阵,定义了系统中n个进程中的每一个进程对m类资源的最大需求;
- 分配矩阵Allocation,这也是一个N * M的矩阵,定义了系统中每一类资源当前已分配给每一进程的资源数;
- 需求矩阵Need,这也是一个N * M的矩阵,用以表示每一个进程尚需的各类资源数
Need[i,j] = Max[i,j] - Allocation[i,j]
工作向量,Work,表示系统可提供给进程继续运行所需的各类资源,它含有m个元素,在执行安全算法开始时,Work = Available。Finish,表示系统是否含有足够的资源分配给进程,使之运行完成。