一 丶调度的层次与作用;
处理机调度:多道程序环境下,动态的把处理机分配给就绪队列中的一个进程使之执行。
提高处理机的利用率、改善系统性能,很大程度上取决于处理机调度的性能
作业进入系统驻留在外存的后备队列上,再至调入内存运行完毕,可能要经历下述三级调度。
•高级调度(High Scheduling)
•中级调度(Intermediate-Level Scheduling)
•低级调度(Low Level Scheduling)
1、高级调度(High Scheduling)
又称作业调度或长程调度,接纳调度(Admission
Scheduling)
主要在早期批处理阶段,处理在外存上的作业。
�决定外存后备队列中的哪些作业调入内存;
�为它们创建进程、分配必要的资源;
�将新创建的进程排在就绪队列上,准备执行。
* 管理的方面比较多。
2、低级调度(Low Level Scheduling)
也称为进程调度、微观调度或短程调度(Short-Term Scheduling)
决定内存就绪队列中的哪个进程获得处理机,进行分配工作。是最基本的一种调度,在三种基本OS中都有。
3、中级调度(Intermediate-Level Scheduling)
又称交换调度或中程调度(Medium-Term Scheduling)
引入目的:提高内存利用率和系统吞吐量。根据条件将一些进程调出或再调入内存。
二、常用调度算法及计算;
1、先来先服务调度算法FCFS
(First Come First Service)
一种最简单的调度算法,按先后顺序进行调度。既可用于作业调度,也可用于进程调度。
v按照作业提交,或进程变为就绪状态的先后次序分派CPU;
v新作业只有当当前作业或进程执行完或阻塞才获得CPU运行
v被唤醒的作业或进程不立即恢复执行,通常等到当前作业或进程出让CPU。
(所以,默认即是非抢占方式)
2.短作业优先
优点:
v通过上表可见采用SJF/SPF算法,平均周转时间、平均带权周转时间都有明显改善。SJF/SPF调度算法能有效的降低作业的平均等待时间,提高系统吞吐量。
方式:
v分抢占和非抢占两种方式,上例为简单的非抢占式。
vSJF/SPF的不足:
1. 对短作业有利,但同时造成了对长作业的不利。
2.由于作业(进程)的长短含主观因素,不一定能真正做到短作业优先。
3.未考虑作业的紧迫程度,因而不能保证紧迫性作业(进程)的及时处理。
3. 高优先权优先调度算法HPF
vHRRN为每个作业引入动态优先权,使作业的优先级随着等待时间的增加而以速率a提高:
优先权 =(等待时间+要求服务时间)/要求服务时间 = 响应时间 / 要求服务时间
什么时候计算各进程的响应比优先权?
v需要进行调度选择的时候比较各自优先权
�作业完成时
�新作业产生时(抢占、非抢占)
�时间片完成时
�进程阻塞时
3. 基于时间片的轮转调度算法RR
(1)时间片轮转算法
1.将系统中所有的就绪进程按照FCFS原则,排成一个队列。
2.每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms。
3.在一个时间片结束时,发生时钟中断。
4.调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过上下文切换执行当前就绪的队首进程。
v进程阻塞情况发生时,未用完时间片也要出让CPU
能够及时响应,但没有考虑作业长短等问题。
(2)多级反馈队列算法FB
1)设置多个就绪队列,各队列有不同的优先级,优先级从第一个队列依次降低。
2)赋予各队列进程执行时间片大小不同,优先权越高,时间片越短。
3)当一个新进程进入内存,引发的调度过程
1.准备调度:先将它放入第一个队列的末尾,按FCFS原则排队等待调度。
2.IF时间片内完成,便可准备撤离系统;
3.IF时间片内未能完成,调度程序便将该进程转入第二队列的末尾等待再次被调度执行。
4.当第一队列中的进程都执行完,系统再按FCFS原则调度第二队列。在第二队列的稍放长些的时间片内仍未完成,再依次将它放入第三队列。
5.依次降到第n队列后,在第n队列中便采取按时间片轮转的方式运行。
注意:
v各队列的时间片逐渐增大。优先级逐渐降低
v仅当优先权高的队列(如第一队列)空闲时,调度程序才调度第二队列中的进程运行;仅当第1~(i-1)队列均空时,才会调度第i队列中的进程运行。
v高优先级抢占问题:
�第i队列中为某进程正占有CPU,又有新进程进入优先权较高的队列(第1~i-1队中);
被抢占的进程放回原就绪队列末尾;
三、死锁的概念、产生的原因及必要条件;
死锁(Deadlock):指多个进程在运行过程中,因争夺资源而造成的一种僵局。当进程处于这种状态时,若无外力作用,它们都将无法再向前推进。
v产生死锁的原因可归结为如下两点:
1.竞争资源。系统中供多个进程共享的资源如打印机、公用队列等的数目不满足需要时,会引起资源竞争而产生死锁。
2.进程间推进顺序非法。进程在运行过程中,请求和释放资源的顺序不当,同样会导致死锁。
3、 产生死锁的必要条件
①互斥条件:进程对所分配到的资源进行排他性使用
②请求和保持条件:进程已经保持了至少一个资源,又提出新的资源请求,而新请求资源被其他进程占有只能造成自身进程阻塞,但对自己已获得的其他资源保持不放,必然影响其他进程。
③不剥夺条件:进程已获得的资源未使用完之前不能被剥夺,只能在使用完时由自己释放。
④环路等待条件
四、处理死锁的基本方法;
事先预防:
①预防死锁
v设置限制条件,破坏四个必要条件的一个或几个,预防发生死锁。
v较易实现。限制条件的严格也会导致系统资源利用率和系统吞吐量降低。
②避免死锁
v不须事先限制,破坏四个必要条件,而是在资源的动态分配过程中,用某种方法去防止系统进入不安全状态,从而避免发生死锁。
v这种事先加以较弱限制的方法,实现上有一定难度,但可获较高的资源利用率及系统吞吐量,目前在较完善的系统中,常用此方法来避免发生死锁。
事后处理:
③检测死锁。
v允许系统运行过程中发生死锁,但通过系统检测机构可及时的检测出,能精确确定与死锁有关的进程和资源;然后采取适当的措施,从系统中将已发生的死锁清除掉。
④解除死锁。
v与死锁检测配套的一种措施。
v常用的实施方法:撤销或挂起一些进程,以便回收一些资源并将他们分配给已阻塞进程,使之转为就绪以继续运行。
v死锁的检测与解除措施,有可能使系统获得较好的资源利用率和吞吐量(死锁几率不一定很高),但在实现上难度也最大。
五、银行家算法及计算;
最有代表性的避免死锁的算法,是Dijkstra的银行家算法。由于该算法能用于银行系统现金贷款的发放而得名。
【思路描述】:随时对系统中的所有资源信息进行统计,包括每种资源的数量、已分配给各进程的数量;每当进程提出某种资源请求时判断该请求分配后是否安全,如果安全才分配。对每个资源请求的处理都要保证系统始终从一个安全状态到另一个安全状态1)银行家算法中的数据结构
(1)各类可利用资源的数量
u向量Available:(i1,i2,…,im),含m个元素,每个元素代表一类可利用的资源数目。
u动态变化的,初始值是系统配置的该类资源的全部数目,值随资源的分配与回收而动态的改变。
u实现:一维数组。Available【j】=K,表示系统中Rj类资源现有可用数量为K个。
②已分配矩阵Allocation。
un*m,定义系统中每一进程已获得的每类资源数量。
uAllocation【i,j】=K,表示进程i当前已分得Rj类资源数为K。
③还需求的矩阵Need。
un*m,表示每一进程尚需的各类资源数。
uNeed【i,j】=K,表示进程i还需要Rj类资源K个,方能完成任务。
|上述三个矩阵存在关系:
Max【i,j】=Allocation【i,j】+Need【i,j】
|每次,给进程 i 分配资源的动作,影响上述数据结构的取值:
Available【µ】,Allocation【i,µ】,Need【i,µ】
算法过程:
就是对各进程的Request向量及资源数量进行一系列判断及值操作。
进程Pi发出资源请求后,系统按下述步骤进行检查:
首先是两个基本判断:
(1)IF Requesti[j]<= Need[i,j]
THEN转向步骤2;
ELSE认为出错,所需资源数超过宣布的最大值(自我矛盾)
(2)IF Requesti[j]<= Available[j]
THEN转向步骤3;
ELSE表示尚无足够资源,Pi需等待(现实不满足)
如果上面两步判断都通过了,进入实质的资源分析
(3)系统试探着把资源分配给进程Pi
,并修改相应数据结构的值(假设性操作):
Available【j】 =
Allocation【i,j】=
Need【i,j】=
(4)系统执行安全性算法,判断新的资源分配状态是否是安全的。
即:找一个安全序列,使这些进程按顺序执行完)如果能够找到,则将假设操作真正实施完成资源分配。