处理机调度与死锁
处理机调度的层次:
①高层调度(长程调度、作业调度)
对象:作业
将【外存】上处于【后备队列】的作业调入【内存】,并放入【就绪队列】
②低级调度(短程调度、进程调度)
对象:进程
决定【就绪队列】中哪个进程获得处理机
③中级调度(内存调度)
目的:提高【内存利用率】和【系统吞吐量】
过程:内存->外存(挂起状态)->内存(对换)
处理机调度算法
为清晰表述等待时间和执行时间分配情况引入:
平均带权周期:
作业周转时间(Ti):作业被提交给系统开始到作业完成为止的时间间隔
提供的服务时间(Tsi)
调度算法:
①先来先服务调度算法(FCFS,first come first serve)
②短作业优先调度算法(SJF, short job first)
③优先级调度算法
1、非抢占式优先级调度算法
2、抢占式优先级调度算法
只有当新作业到达时,才会触发抢占判断
3、高响应比优先(HRRN,highest response ratio next)
既考虑了作业的等待时间,又考虑了作业的运行时间
Rp(响应比) = 动态优先级 =(等待时间+要求服务时间)/要求服务时间)= 响应时间比/要求服务时间
等待时间:当前时间 — 作业到达时间
不会发生抢占式优先级调度,因为抢占判断出现在作业到达,而作业到达时刻的等待时间是0,即:Rp = 1,一定比其他已经到达的作业优先级低
轮转调度算法(RR,round robin)
系统先将就绪进程按FCFS排成一个就绪队列,队头的进程开始运行,如果进程在一个时间片内运行完毕,则后续的进程跟上,依次同上进行;若没运行完毕,则该程序会被送到队尾(比下一个进程慢一个运行)
最早截止时间优先算法(EDF,earliest deadline first)
1、非抢占式调度方式用于非周期实时任务
2、抢占式调度方式用于周期实时任务
最低松弛度优先算法(LLF,least laxity first)
松弛度=必须完成时间 - 本身运行时长 - 当前时间
死锁预防
产生死锁的必要条件: ①互斥条件;②请求和保持条件;③不可抢占条件;④循环等待条件
1、破坏“请求和保持”条件
2、破坏“不可抢占”条件
3、破坏“循环等待”条件
系统安全状态
安全状态:系统能按某种进程推进顺序(P1,P2,…,Pn)(安全序列),为每一个进程Pi分配其所需的资源,直至满足每一个进程对资源的最大需求,进而使每个进程都可以顺利完成一种系统状态
银行家算法避免死锁
可利用资源向量Available
最大需求矩阵Max
已分配矩阵Allocation
需求矩阵Need
Need[i, j] = Max[i, j] - Allocation[i, j]
设Requesti
是进程Pi的请求向量,Requesit[j] = K
表示Pi需要K个Rj类型的资源
当Pi
发出资源请求后:
①if Requesti[j] ≤ Need[i, j]
(申请的不大于需要的),转向②;否则,出错;
②if Requesti[j] ≤ Available[j]
(申请的不大于可用的),转向③;否则,无资源,等待;
③试探分配资源,修改数据:
Available[j] = Available[j] - Requesti[j];
Allocation[i, j] = Allocation[i, j] + Requesti[j];
Need[i, j] = Need[i, j] - Requesti[j];
④执行安全性算法,安全就正式分配,否则,本次试探分配作废,Pi等待;
安全性算法
工作向量Work
: 系统可提供给进程继续运行所需的各类资源数目
完成向量Finish
:表示系统是否又足够的资源继续分配给进程(判断系统是否安全)
①设Work = Available
,Finish[i] = FALSE
;
②从进程集合寻找出Finish[i] = FALSE
,Need[i, j] ≤ Work[j]
的进程,IF 有,跳③;否则,跳④;
③Pi获得资源后,顺利完成后,释放分配的资源
Work[j]+= Allocation[i, j]
(加上释放的资源,此时的Work[j]就是下一次可利用的资源)
Finish[i] = TRUE
go to step2
④IF 所有进程都Finish[i] = TRUE
,则表示系统处于安全状态;否则,不处于。