一.处理机调度的层次及调度算法的目标
1.高级调度:
作业调度,多用于多道批处理系统,分时系统和实时系统不设置高级调度2.中级调度:
内存调度,即内存管理中的对换(swap),以后会专门讲解swap,这篇主要是进程调度及作业调度3.低级调度:
进程调度,多用于多处理、分时、实时等多种操作系统4.目标:
1)提高资源利用率:主要是提高处理机的利用率
2)公平性:是对于进程来讲的
3)平衡性:是对于系统资源来讲的
4)策略强制实行:未达到一定目的进行强制性措施,如为保护安全问题
二.作业与作业调度
1.概念:
作业是比程序更广泛的一个概念,作业不仅包含程序和数据,还包含一份作业说明书,系统根据该说明书对程序进行运行控制,批处理系统中,操作系统是以作业作为基本单位从外存调入内存的2.作业控制块(JCB):
进行调度时,需为每个作业分配一个JCB,在其中存储了系统对作业进行管理和调度的全部信息3.作业的三个阶段和三种状态:
1)后备阶段:操作员将作业提交到硬盘上,由操作系统为其建立JCB,将它放入后备队列中,此时的状态为“后备状态”;
2)运行阶段:将作业被选中时,先为其分配必要的资源并建立进程,将其放入就绪队列,从其进入就绪队列到它运行结束是都处于“运行状态”;
3)完成阶段:当作业运行完成或因发生异常等提前结束时,系统会回收其占用的资源和控制块,其处于“完成状态”。
4.调度算法
1)先来先服务(FCFS)和短作业优先(SJF)算法
这两种都是适用于作业调度也适用于进程调度的算法
- 先来先服务:系统根据作业到达的先后进行调度,先来的先调度后来的等待,只与作业到达的时间有关。利于长作业而不利于短作业
- 短作业优先:系统优先为耗时短的作业(进程)分配资源使其运行。利于短作业而不利于长作业
2)优先级调度算法和高响应比优先调度算法
- 优先级调度算法:该算法是基于作业的紧迫程度进行调度的,由外部赋予的优先级是该调度算法所考虑的
- 高响应比优先调度算法:根据作业的运行时间和其到达后等待的时间计算出一个动态的优先级,根据动态优先级进行调度
优先级(响应比Rp)=(等待时间+要求服务时间)/ 要求服务时间 = 响应时间 / 要求服务时间
三.进程调度
1.进程调度的任务和方式
1)任务
保存处理机的现场信息、按某种算法选取进程、把处理器分配给进程2)进程调度方式:抢占式和非抢占式
- 非抢占式:将处理机分配给某个进程后,必须等待该进程运行完毕主动放弃处理机或出现异常后被迫放弃处理机时才将处理机分配给其他进程
- 抢占式:当一个进程正在执行时,系统可以基于某种策略剥夺CPU给其它进程。剥夺的原则有:优先权原则、短进程优先原则和时间片原则。(多用于分时系统和实时系统中)
2.轮转调度算法:(主要用于分时系统)
通过时间片轮转,提高进程并发性和响应时间特性,从而提高资源利用率。
将系统中所有的就绪进程按照FCFS原则,排成一个队列,每次调度时将CPU分派给队首进程,让其执行一个时间片。时间片的长度从几个ms到几百ms,在一个时间片结束时,发生时钟中断。调度程序据此暂停当前进程的执行,将其送到就绪队列的末尾,并通过CPU现场切换执行当前的队首进程。
进程可以未使用完一个时间片,就出让CPU(如阻塞)
3.多级反馈队列调度算法
- 将系统中的就绪队列从一个拆分为若干个,将不同类型或性质的进程固定分配在不同的就绪队列,不同的队列采取不同的调度算法。
- 新进程就绪后,先投入队列1的末尾,按FCFS算法调度。若一个时间片未能执行完,则降低投入到队列2的末尾;依此类推,降低到最后的队列,则按“时间片轮转”算法调度直到完成。
- 进程由于等待事件而放弃CPU后, 进入等待队列, 一旦等待的事件发生, 则回到原来的就绪队列。
- 仅当较高优先级的队列为空,才调度较低优先级的队列中的进程执行。如果进程执行时有新进程进入较高优先级的队列,则抢先执行新进程,并把被抢先的进程投入原队列的末尾。
四.死锁以及产生死锁的原因
1.什么是死锁?
两个或两个以上并发进程,如果每个进程持有某种资源,而又等待着别的进程释放它或它们现在保持着的资源,否则就不能向前推进。此时,每个进程都占用了一定的资源,但又都不能向前推进。这种现象称为死锁。
2.产生死锁的原因:
1)竞争资源
2)进程推进顺序不当
3.产生死锁的必要条件(同时具备):
1)互斥条件
2)请求和保持条件
3)不可抢占条件
4)循环等待条件
4.处理死锁的方法:
1)预防死锁:
通过破坏四个必要条件中的一个(或多个)2)避免死锁:
精心的分配资源,动态的回避死锁 该方法允许进程动态地申请资源,系统在进行资源分配之前,先计算资源分配的安全性。若此次分配不会导致系统从安全状态向不安全状态转换,便可将资源分配给进程;否则不分配资源,进程必须阻塞等待。从而避免发生死锁。 安全状态是指系统的一种状态,在此状态开始系统能按某种顺序(例如P1,P2,…,Pn)来为各个进程分配其所需资源,直至最大需求,使每个进程都可顺序地一个个地完成。这个序列(P1,P2,….,Pn)称为安全序列。若系统此状态不存在一个安全序列,则称系统处于不安全状态。3)检测死锁:
发生死锁后及时能检测出 可以通过系统资源分配图进行判断4)解除死锁:
检测出后进行解除5.银行家算法
1)算法思想
保证银行家状态从一个安全状态转向另一个安全状态——不死锁2)银行家算法的数据结构
- 可用资源向量 Available[m]:m为系统中资源种类数,Available[j]= k 表示系统中第j类资源数为k个。
- 最大需求矩阵 Max[n,m]:n为系统中进程数,Max[i,j]=k表示进程i对j类资源的最大需求数为中k。
- 分配矩阵 Allocation[n,m]:定义了系统中每一类资源当前已分配给每一进程资源数,Allocation[i , j]=k表示进程i已分得j类资源的数目为k个。
- 需求矩阵 Need[n , m]: Needij=Maxij-Allocationij:表示每个进程尚需的各类资源数,Need[i , j]=k表示进程i还需要j类资源k个。
3)当进程pi提出资源申请时, 系统执行下列步骤:
S1:若Request[i]≤Need[i],转S2否则错误返回
S2:若Request[i]≤Available, 转S3否则进程等待
S3:假设系统分配资源, 则有:
Available:=Available-Request[i];
Allocation[i]:=Allocation[i]+Request[i];
Need[i]:=Need[i]-Request[i];
若系统新状态是安全的,则分配完成。
若系统新状态是不安全的,则恢复原状态,进程Pi阻塞。
4)安全性检测
工作向量Work[m]:表示系统可提供的各类资源数目
标志向量Finish[n]:系统是否有足够资源分配给进程
算法步骤:
S1:Work:=Available; Finish:=false;
S2:寻找满足条件的i,满足
Finish[i]=false; Need[i]≤Work;
如果不存在,则转S4
S3: Work:=Work+Allocation[i];
Finish[i]:=true; 转S1
S4:若对所有i , Finish[i]=true,则系统处于安全状态, 否则处于不安全状态
例题:
系统中有五个进程{P0, P1, P2, P3, P4 }和三种资源{A, B, C},每一种资源的数量分别为10、5、7。各进程的最大需求、T0时刻资源分配如下所示:
进程 Max Allocation Need Available
A B C A B C A B C A B C
P0 7 5 3 0 1 0 7 4 3 3 3 2
P1 3 2 2 2 0 0 1 2 2
P2 9 0 2 3 0 2 6 0 0
P3 2 2 2 2 1 1 0 1 1
P4 4 3 3 0 0 2 4 3 1
试问:
①T0时刻是否安全?
由题,我们可以找到一个安全序列:{P1、P3、P0、P2、P4},故T0时刻是安全的
②P1请求资源Request1(1,0,2)是否允许?
当出现请求资源Request(i,j,k)时,需要进行更改的有以下几个值:
Allocation+=Request;
Need-=Request;
因Request1(1,0,2)小于等于Need(1,2,2)且Request(1,0,2)小于等于Available(3,3,2)
此时查看是否存在一个安全序列从而判断是否允许,我们可以找到一个安全序列{P1、P3、P4、P2、P0},故允许
③P4请求资源Request4(3,3,0)是否允许?
思路同第二问,在进行安全性检查时未找到一个安全序列,使其处于不安全状态,所以不允许