一、进程调度算法
进程发生CPU调度情况:
- 1)从运行状态转到等待状态;
- 2)从运行状态转到就绪状态;
- 3)从等待状态转到就绪状态;
- 4)从运行状态转到终止状态。
1)和4)称为非抢占式调度,2)和3)称为抢占式调度。
补充:
非抢占式:当进程正运行时,就一直运行,直到该进程完成或因某事被阻塞时,才把CPU让给其他进程。
抢占式:当进程正运行时,就会一直运行,可以被打断,使其把CPU让给其他进程。抢占原则有三种:时间片、优先级、短作业优先。
调度算法影响的是等待时间(进程在就绪队列中等待调度的时间总和),而不能影响进程真正在使用CPU和IO的时间。
1.1 FCFS(First Come First Severd,先来先服务)
描述:每次从就绪队列选择最先进入队列的进程,然后一直运行至退出或被阻塞,才继续从队列中选择第一个进程接着运行。

利弊:对长作业有利,不利于短作业。适用于CPU繁忙型系统,不适用于IO繁忙型。
1.2 SJF(Shortest Job First,最短作业优先)
描述:优先选择运行时间最短的进程来运行。

利弊:有助于提高系统吞吐量,对长作业不利。
1.3 HRRN(Highest Response Ratio Next,高响应比优先调度算法)
描述:每次进行进程调度时,先计算响应比优先级,然后把最高的进程投入运行。

分析:如果两个进程等待时间相同,要求服务时间越短,响应比越高,这更有助于短作业选中运行。
如果两个要求服务时间相同,等待时间越长,响应比越高,等待时间长的长作业响应比就升到很高,从而得以运行,即自然兼顾了长作业进程。
1.4 RR(Round Robin,时间片轮转)
描述:如果时间片用完,进程还在运行,那将此进程从CPU释放出来,并把CPU分配另一个进程;如果该进程在时间片结束前阻塞或结束,则CPU立即进程切换。
补充:
1、最古老、简单、公平、广泛的调度算法。每个进程被分配一个时间段,称为时间片(Quantum),即允许该进程在该时间段中运行。
2、时间片长度很关键,太短容易导致过多上下文切换,降低CPU效率;太长可能引起短作业响应时间变长。设为20ms~50ms,通常是毕竟合理的折中值。

1.5 HPF(Highest Priority First,最高优先级)
描述:从就绪队列选择最高优先级的进程进行运行。
补充:
静态优先级:创建进程已确定优先级,整个运行时间都不会变化。
动态优先级:根据进程动态调整,如随时间推移提高等待进程优先级。
非抢占式:运行完当前进程,再从就绪队列中选择优先级高的进程。
抢占式:当就绪队列出现高优先级,当前进程被挂起,运行更高优先级进程。
1.6 MFQ(Multilevel Feedback Queue,多级反馈队列)
描述:时间片轮转和最高优先级算法的综合和发展。
- 多级:表示多个队列,每个队列优先级从高到低,同时优先级越高,时间片越短;
- 反馈:如果新进程加入高优先级队列,立刻停止当前运行进程去执行更高优先级的。
设置多个队列,赋予每个队列不同优先级,每个队列优先级从高到低,同时优先级越高时间片越短。
新进程放入第一级队列末尾,按先来先服务排队等待被调度,如果第一级队列规定时间片没运行完,则将其转入第二级队列的末尾,以此类推,直至完成。
当较高优先级队列为空,才运行较低优先级队列中的进程。如果进程运行时,有新的高优先级进程进入,则停止当前运行进程,并将其移到原队列末尾,去运行较高优先级队列进程。
分析:短作业在第一级队列很快被处理。长作业在第一级队列处理不完,可移入下次队列执行,等待与运行时间同样较长。该算法很好地兼顾了长短作业,有较好响应时间。
二、内存页面置换算法
2.0 基础知识
1、缺页中断
含义:当CPU访问页面不在物理内存时,便产生一个缺页中断,请求操作系统将所缺页调入物理内存。
VS 一般中断:缺页中断在指令执行期间产生和处理中断信号,返回到开始重新执行该指令;而一般中断在一条指令执行完成后检查和处理中断信号,返回到该指令的下一个指令执行。
处理流程:

- 第4步中,如果找不到空闲页,说明此时内存已满。这时需要页面置换算法,选择一个物理页,如果该物理页有被修改过(脏页),则把它换出到磁盘,然后把该被置换出去的页表项改成无效的,最后把正在访问的页面装入到这个物理页中。
页面置换算法:
-
功能:缺页异常时调入新页面,内存已满选择被置换物理页面。
-
目标:尽可能减少页面换入换出次数。
页面项字段:

- 状态位:用于表示该页是否有效,即是否在物理内存中,供程序访问时参考。
- 访问字段:用于记录该页在一段时间被访问的次数。供页面置换算法选择出页面时的参考。
- 修改位:表示该页在调入内存后,是否被修改过,由于内存每一页在磁盘上保留一份副本。因此,如果没被修改,在置换该页时就不需要将该页写回到磁盘上,以减少系统开销;如果已经被修改,则将该页重写到磁盘,来保证磁盘保留是最新副本。
- 硬盘地址:用于指出该页在硬盘上的地址,通常是物理块号,供调入该页时使用。
虚拟内存管理流程:

2.1 OPT(最佳页面置换)
描述:置换在未来最长时间不访问的页面。
- 实现需要计算内存中每个逻辑页面的下一次访问时间,然后比较,选择未来最长时间不访问的页面。

分析:
-
7次缺页=3次空闲页换入+4次最优页面置换
-
理想情况,无法实现。因为程序动态访问,无法预知每个页面下一次访问前等待时间。它只是衡量你算法的效率,越接近越高效。
2.2 FIFO(先进先出)
描述:选择内存驻留时间最长的页面进行置换。

分析:
- 10次缺页=3次空闲页换入+ 7次页面置换
2.3 LRU(最近最久未使用)
描述:发生缺页时,选择最长时间没有被访问的页面进行置换。
算法假设:如果一个数据最近一段时间没有被访问,那将来它被访问的可能性也很小。即当限定空间已满,应当把最久没被访问的数据淘汰。

2.4 LOCK(时钟页面置换)
描述:把所有页面都保持在一个类似钟面的环形链表,一个表针指向最老的页面。
- 当发生缺页中断时,算法首先检查表针指向页面:
- 1)
If 访问位 == 0,就淘汰该页面,并在该位置插入新页面,然后表针前移一个位置。 - 2)
If 访问位 == 1,就清除访问位,把表针前移一个位置,重复这个过程直到找到一个访问位为0的页面。

2.5 LFU(最不常用置换)
描述:发生缺页中断时,选择访问次数最少的页面,并将其淘汰。
实现方式:每个页面加一个计数器就可以,但操作系统实现要考虑效率和硬件成本。
分析:链表长度很大时,非常耗时。LFU只考虑频率,没考虑时间,如有些页面在过去访问频率很高,但现在没有,那当前频繁访问次数积累不够,会被误伤。
解决办法:可以定期减少访问次数,如发生时间中断,把过去访问次数除以2。
三、磁盘调度算法
寻道时间是磁盘访问最耗时的部分,优化得当可以提高性能。

3.1 FCFS(First Come,First Served,先来先服务)
描述:先到来请求,先被服务。
磁头:53
序列:98,183,37,122,14,124,65,67
处理:98,183,37,122,14,124,65,67
磁头移动总距离:640

比较简单粗暴,但大量进程竞争磁盘,访问磁盘可能很分散,寻道时间过长。
3.2 SSF(Shortest Seek First,最短寻道时间优先)
描述:优先选择从当前磁头位置寻道时间最短的请求。
磁头:53
序列:98,183,37,122,14,124,65,67
处理:65,67,37,14,98,122,124,183
磁头移动总距离:236。

分析:存在某些请求饥饿,因为本次例子静态,假设动态请求,后续来的请求都小于183,那183可能永远不会被响应。产生原因就是磁头在一小块区域来回移动。
3.3 Scan(扫描算法)
背景:SSF产生饥饿原因:磁头有可能在一个小区域内来回移动。
描述:为防止这个问题,可以规定:磁头在一个方向上移动,访问所有未完成的请求,直到磁头到达该方向上最后的磁道,才调换方向,这就是扫描算法,也叫电梯算法。
磁头:53
序列:98,183,37,122,14,124,65,67
处理:37,14,0,65,67,98,122,124,183
磁头移动总距离:

分析:扫描算法性能较好,不会产生饥饿现象,但这样中间磁道比较占便宜,因为想比其他部分,响应频率很比较多。
3.4 CSCAN(Circular Scan,循环扫描)
描述:磁头朝某个特定方向移动,如向右移动并处理对应请求,直到碰到最右端,就立即返回磁盘开始处(磁道0),但这个返回途中不响应任何请求,直到最开始的磁道,才继续响应右边请求。
特点:只响应一个方向上的请求。
磁头:53
序列:98,183,37,122,14,124,65,67
处理:65,67,98,122,124,183,199,0,14,37
磁头移动总距离:

分析:相比扫描算法,各个磁道响应频率比较平均。
3.5 LOOK与C-LOOK算法
背景:前面的SCAN和CSCAN算法都是磁头移动到磁盘最始端或最末端才开始调换方向。
描述:可优化点 — 磁头移动到最远请求位置,然后立即反向移动。
-
针对
SCAN优化叫LOOK算法,具体是每个方向仅仅移动到最远请求位置,然后立即反向移动,而不需要移动到磁盘最始/末端,反向移动途中会响应请求。 -
针对
C-SCAN算法优化叫C-LOOK算法,其工作方式是磁头在每个方向仅仅移动到最远请求位置,然后立即反向移动,而不需要移动到磁盘的最始/末端,反向移动途中不会响应请求。

四、参考
1、大厂面试爱问的「调度算法」,20 张图一举拿下
2、2.2、线程的调度
3、了解进程的调度算法
4、操作系统修炼秘籍(26):进程调度算法图解说明
5、几种常见的调度算法(转载)
6、操作系统中常用的进程调度算法
本文详细介绍了操作系统中的调度算法,包括进程调度的FCFS、SJF、HRRN、RR、HPF和MFQ算法,内存页面置换的OPT、FIFO、LRU、LOCK和LFU算法,以及磁盘调度的FCFS、SSF、Scan、CSCAN和LOOK/C-LOOK算法。这些算法在优化系统性能和响应时间方面起着关键作用。
调度算法&spm=1001.2101.3001.5002&articleId=116064290&d=1&t=3&u=5d6de4b0dbea44e8abb7c0b09eafc907)
3539

被折叠的 条评论
为什么被折叠?



