目录
先来先服务策略(FCFS, First Come First Serve)
短作业优先策略(SJF, Shortest Job First)
高响应比优先算法( HRRN, Highest Response Ratio Next)
进程调度
调度:当作业任务太多而资源有限,为了是这些作业能够同步的完成,就需要按照某种规则来处理这些任务的顺序,做到一视同仁,全盘兼顾。这就称之为调度。
上面的"某种规则"就是非常重要的调度算法。
作业:操作系统中的作业是指计算机要完成的任务,通过程序实现。
调度的三个层次
高级调度:也称作业调度。由于内存的有限(我的才8G),有时无法将作业全部放入内存,一部分要放到外存。高级调度会从外存的后备队列中选一个或多个作业,调入内存中,创建PCB。(使进程处于创建态)
高级调度是对作业的调度,选中的作业将会为其创建进程.
中级调度:也称内存调度。还是由于内存不足的原因,当进程过多,内存无法支撑所有进程同时执行,就可以将一部分不重要不紧急的进程挂起(原语操作),放至外存中。等待进程重新具备了运行条件时并且内存有空闲时再重新调入内存。
暂时调入外存的进程处于挂起状。挂起时,进程的程序段和数据段会被放至外存中,而PCB加入挂起队列中(依旧在内存中),记录着进程的各种信息包括进程在外存的位置。(使进程处于挂起态)
低级调度:也称进程调度。按照某种策略选取就绪队列中的进程,将处理机的资源分配给它。使进程从就绪态处于运行态。
三层调度对比
要做什么 | 调度发生在... | 发生频率 | 对进程的影响 | |
---|---|---|---|---|
高级调度(作业调度) | 按照某种规则,选择后备队列中的作业,调入内存中为其创建进程。 | 外存--->内存(面向作业) | 只调入一次,调出一次,比较低 | 作业--->创建态--->就绪态 |
中级调度(内存调度) | 按照某种规则,从挂起队列中选择合适的进程调入内存中。 | 外存--->内存(面向进程) | 多次调度调出,较高 | 挂起态--->就绪态 |
低级调度(进程调度) | 按照某种规则,从就绪队列中选择合适的进程,为其分配处理机资源。 | 内存--->CPU | 频率最高 | 就绪态--->运行态 |
进程调度的时机
需要进行调度的时机:
进程主动放弃资源的情况:
-
进程正常执行完毕
-
进程遇到异常导致终止
-
进程主动请求阻塞(等待I/O)
进程被迫放弃资源:
-
进程时间片用完
-
被优先级更高的进程抢占
不能进行进程切换的情况:
-
进程处理中断时
-
进程在进行原语操作时
-
进程在访问操作系统内核临界资源时
进程调度的方式
非剥夺式(非抢占式):等待正在进行的进程运行直到它主动放弃资源,才会进行调度。这种方式实现简单,开销较小。但是无法及时的处理紧急任务。适合早期的批处理系统。
非剥夺式(非抢占式):当一个进程正在执行时,有一个紧急任务需要完成,则操作系统会将当前进程阻塞,立刻执行紧急进程。这种方式可以处理紧急任务,也可以实现时间片轮转,适合分时系统或者实时系统。
调度算法
调度算法的指标
CPU利用率 : 是指cpu忙碌的时间占总时间的比例。
公式:利用率 = 忙碌的时间/总时间。
系统吞吐量:单位时间内,完成作业的数量。
公式:系统吞吐量 = 完成作业的数量/完成作业的时间。
周转时间:是指作业提交到作业完成的总时间。
公式:周转时间 = 作业完成的时间 - 作业提交的时间。
平均周转时间 = 所有作业的周转时间之和 / 作业数量。
对于用户来说,只关心自己提交作业的周转时间,而操作系统注重平均周转时间.
思考: 一个长作业和一个短作业分别需要执行1分钟和9分钟,但是他们的周转时间都是10分钟,会怎么样?
为了客观公平的比较作业完成的满意度,提出了带权周转时间:
带权周转时间 = 作业周转时间 / 作业实际执行的时间.
从公式看.带权周转时间>=1.并且对于刚刚两个周转时间相同的作业来说,实际运行时间长的作业带权周转时间会更小,因此面对不同长度的作业,带权周转时间更能反映作业的满意度.
平均带权周转时间 = 所有作业带权周转时间之和 / 作业的数量.
等待时间: 是指进程/作业 等待处理机状态的时间之和。
对于进程来说,就是进程在创建之后,等待被服务的时间之和。但是等待I/O的时间也是被进程服务的,所以这个时间不算在内。
对于作业来说,作业先在外存的后备队列排队,因此还要加上排队的时间。
响应时间:是指计算机用户提交请求的时间到计算机首次响应的时间。
先来先服务策略(FCFS, First Come First Serve)
算法思想 | 先到先得,出于公平的考虑 |
---|---|
算法规则 | 按照作业/进程到达的顺序执行 |
用于作业/进程 | 作业:考虑哪个作业先到达外存的后备队列; 进程:考虑哪个进程先到达就绪队列 |
抢占/非抢占 | 非抢占 |
优缺点 | 优点:算法实现简单、公平 缺点:对长作业有利,对于短作业来说,短作业可能排在长作业之后,导致带权周转时间时间长 |
是否会导致饥饿 | 不会 |
短作业优先策略(SJF, Shortest Job First)
算法思想 | 追求最少的平均等待时间,最少的平均周转时间、最少的平均带权周转时间 |
---|---|
算法规则 | 最短的作业/进程优先得到服务(所谓“最短”,是指要求服务时间最短) |
用于作业/进程 | 即可用于作业调度,也可用于进程调度。用于进程调度时称为“短进程优先(SPF, Shortest Process First)算法” |
抢占/非抢占 | 短作业优先有俩种实现方式,一种是抢占式,一种是非抢占式 |
优缺点 | 优点:最短的平均等待时间、平均周转时间 缺点:不公平,对短作业有利,长作业不利。会产生饥饿。 |
是否会导致饥饿 | 会 |
短作业优先的俩种算法:
非抢占式:每次调度时,选择已到达的进程中执行时间最短的进程。
在调度时才选择,意味着短作业到来时不会直接抢占正在执行的线程。
抢占式:当就绪队列改变时(有新的进程阻塞),就选择哪个进程的剩余时间最少,如果不是正在执行的进程最少,则选择最少的那个进程执行。所以这种方式又称为“最短剩余时间有限算法”(SRTN)。
上面两种算法各有利弊,一个是对长作业有利,一个是对短作业有利,都不太合理。而下面这种高响应比优先算法就是同时照顾长作业和短作业。
高响应比优先算法( HRRN, Highest Response Ratio Next)
响应比 = (等待时间 + 运行时间)/ 运行时间 , >=1
算法思想 | 综合考虑作业/进程的等待时间和执行时间 |
---|---|
算法规则 | 每次调度时,先计算作业的响应比,选择响应比高的作业先执行。 |
用于作业/进程 | 作业/进程 |
抢占/非抢占 | 非抢占式 |
优缺点 | 综合考虑了作业的等待时间和执行时间。 当等待时间一致时,运行时间短的作业优先执行(SJF的特点) 当运行时间一致,等待时间越长的优先执行(FCFS的特点) 对于长作业来说,等待时间越长,其响应比也就越来越高,避免了饥饿问题。 |
是否会导致饥饿 | 不会 |
时间片轮转(RR,Round-Robin)
算法思想 | 公平地、轮流地为每个进程服务,让每个进程在一定时间内都能得到响应。 |
---|---|
算法规则 | 将就绪队列中的进程同意分配给一定的时间片,让他们轮流的执行,若时间片结束进程还没有完成任务,则继续加入就绪队列尾部等待下一个时间片的到来。 |
用于作业/进程 | 用于进程 |
抢占/非抢占 | 抢占式,当时间片结束(时钟中断)进程还没有终止时,剥夺该进程的执行权(被动放弃)给下一个进程 |
优缺点 | 优点:公平,响应快,适合分时操作系统. 缺点:高频率的切换,使得进程切换的开销很大;不能及时处理紧急任务 |
是否导致饥饿 | 不会 |
时间片如果过大,那么在时间片内,进程都可以完成任务,相当于FCFS策略;
时间片如果太小,则会增加进程的切换,而进程的切换开销就会变大(会切换PCB、数据段、程序段等)
优先级调度策略
算法 | 优先处理紧急的、优先级较高的进程 |
---|---|
算法规则 | 调度时,优先选择优先级较高的进程 |
用于作业/进程 | 作业、进程 |
抢占/非抢占 | 与SJF一样,有抢占式和非抢占式俩种 |
优缺点 | 优点:能够用优先级区分作业的紧急程度、重要程度,灵活性高适用于实时操作系统 缺点:会导致饥饿 |
是否导致饥饿 | 会 |
问题:如何合理的设置优先级?
通常:内核进程 > 用户进程
前台进程 > 后台进程 (前台进程需要及时响应,后台进程多用于数据的计算处理工作)
操作系统更偏好I/O型进程(I/O繁忙行进程)
因为I/O设备与CPU是两个设备,可以同时运行,如果I/O型进程可以优先执行,那么I/O设备才有概率更早执行,可以提高资源利用率。
与I/O型进程相对的是计算型进程(CPU繁忙行进程)
多级反馈队列调度算法
算法思想:针对前几种算法优缺点,折中平衡,使得尽可能的适用于各种各样的作业/进程。
算法规则:设置多级就绪队列,各级队列优先级从高到低,时间片从小到大。
新进程到来时,先加入第1级的队列中,按照FCFS原则排队等候,若时间片结束进程还未终止,则进入 下一级队列,如果此时已经是最后一级了,则回到这一级的队列末尾等待。
只有第k级队列为空时,才会为第k+1级对手的进程分配时间片。
该算法只能用于进程调度,属于抢占式调度策略。
优点:对各类进程相对公平(FCFS),每个新到达的进程都能快速得到相应(RR),短进程用很少的时间就可以完成(SJF);不必估计进程的实际运行时间,避免了用户造假。
缺点:有可能会造成饥饿。