• 操作系统-进程与线程(调度器与闲逛进程,调度算法与评价标准)


    1. 调度器/调度程序

    进程从就绪态转化为运行态,或者从运行态转化为就绪态都需要调度器

    CPU运行哪个进程由调度算法决定。
    一个进程在CPU上运行的时间由时间片决定。

    执行调度器/调度程序的时机:

    1. 创建新进程
    2. 进程退出
    3. 运行进程阻塞
    4. IO中断发生,唤醒了某些阻塞进程

    如果是非抢占式调度策略:只有在进程退出,或者进程阻塞的时候才会触发调度器

    抢占式调度策略:每个或每K个时钟中断都会触发调度器。

    需要注意:

    • 在支持内核级线程操作系统,调度程序的操作对象是内核级线程
    • 不支持内核级线程操作系统,调度程序的操作对象是进程

    2. 闲逛进程

    如果没有进程就绪时,此时CPU就会运行闲逛进程。

    闲逛进程的特点:

    1. 优先级最低
    2. 能耗低
    3. 闲逛进程会反复执行0地址指令,不需要访存,不需要访问CPU寄存器。
    4. 指令周期结束后会检测中断。

    3. 调度算法评价标准

    CPU利用率: (CPU处于忙碌时间)÷(CPU总时间)(通常会考察多道程序并发执行的情况下CPU利用率)
    系统吞吐量: 单位时间内完成的作业数目

    系统吞吐量=(一段时间内完成的作业数目÷一段时间)

    周转时间: 作业被提交到系统到作业完成的这段时间

    • 平均周转时间:各个作业周转时间和÷作业数目
    • 带权周转时间:作业周转时间÷作业实际运行时间(带权周转时间越小,用户效果越好)
    • 平均带权周转时间:带权周转时间和÷作业数

    等待时间: 进程/作业处于等待处理机状态的时间

    • 进程等待时间:进程建立后等待被服务的时间和
    • 作业等待时间:作业在外存后备队列等待时间+进程等待时间

    相应时间: 用户提交请求到首次产生响应所用的时间

    4.调度算法

    先来先服务(FCFS)

    思路:按照作业,进程到达的先后顺序进行服务

    当用于作业调度时:考虑那个作业先到达后备队列。
    当用于进程调度时:考虑那个进行先到达就绪队列。

    FCFS调度算法是非抢占式的调度算法

    在这里插入图片描述

    解:这些进程都是纯计算型进程,首先采用先来先服务调度算法,进程的调度顺序为:

    p1->p2->p3->p4

    周转时间:(完成时间-到达时间

    • p1:7
    • p2:(7+4)- 2=9
    • p3:(7+4+1)- 4=8
    • p4:(7+4+1+4)- 5=11

    带权周转时间:周转时间÷运行时间

    • p1:7÷7=1
    • p2:9÷4=2.25
    • p3:8÷1=8
    • p4:11÷4=2.75

    等待时间:周转时间-运行时间

    需要注意:

    如果涉及IO操作的进程,等待时间=周转时间-等待时间-I/O操作时间

    • p1:0
    • p2:9-4=5
    • p3:8-1=7
    • p4:11-4=7

    平均等待时间:4.75

    平均周转时间:8.75

    平均带权周转时间:3.5

    优点:

    1. 公平,算法实现简单
    2. 不会导致线程饥饿

    缺点:

    1. 对长作业有利,短作业带权等待时间太长,短作业用户体验差

    短作业优先服务(SJF)

    思想:要求服务时间最短的优先调度

    当用于作业调度时:称为SJF
    当用于进程调度时:称为短进程优先算法SPF

    SJF与SPF是非抢占式调度算法

    但是也有其抢占式调度的变种:最短剩余时间优先算法(SRTN)
    在这里插入图片描述
    解:首先分析调度顺序

    短作业/进程优先调度算法:每次调度时选择当前已到达且运行时间最短的作业/进程。

    调度顺序为:p1->p3->p2->p4

    具体计算过程省略:

    平均周转时间= (7+4+10+11)/4 = 8

    平均带权周转时间=(1+4+2.5+2.75)/4 = 2.56

    平均等待时间= (0+3+6+7)/4 = 4

    如果采用抢占式短作业优先算法(SRTN):
    在这里插入图片描述
    最短剩余时间优先算法:每当有进程加入就绪队列,就绪队列改变时就需要调度,如果新到达的进程剩余时间比当前运行的进程剩余时间更短,则由新进程抢占处理机,当前运行进程重新回到就绪队列。另外,当一个进程完成时也需要调度。

    进程调度顺序分析如下:

    1. p1先到达,过了两个时间后p2到达
    2. 2时刻,p1(5) 、p2(4),此时p2剩余时间短。CPU会调度p2
    3. 4时刻,p1(5)、p2(2),p3(1)此时调度p3
    4. 5时刻,p3完成任务,p4进程需要被调度。p1(5)、p2(2)、p4(4)调度p2
    5. p2调度后,调度剩下的p4->p1

    在这里插入图片描述
    平均周转时间=(16+5+1+6)/4 = 7

    平均带权周转时间=(2.28+1.25+1+1.5)/4 = 1.50

    平均等待时间=(9+1+0+2)/4 = 3

    可以发现,采用抢占式短作业优先比非抢占式的短作业优先更加高效。

    如果题目没有明确指明,提到的短作业优先默认是非抢占式的。

    注意:
    1. 在所有的进程同时可以运行的情况下(所有的进程近似同时到达),采用短作业优先调度算法平均等待时间,平均周转次数最短。
    2. 如果没有限定条件,抢占式短作业优先算法(SRTN)平均等待时间,平均周转次数最短

    优点:

    1. 可以得到最短的平均等待时间,平均周转次数

    缺点:

    1. 对短作业比较好,对长作业用户体验差
    2. 可能会导致饥饿

    高响应比优先算法(HRRN)

    思路:在每次调度时先计算各个作业/进程的响应比,选择响应比最高的作业/进程为其服务(响应比:(等待时间+要求服务时间)÷要求服务时间。)

    属于非抢占式调度算法,在进程主动放弃CPU(正常结束,异常结束,挂起阻塞)时才需要进行调度。
    在这里插入图片描述
    分析调度顺序:

    1. 0时刻:只有进程p1需要调度,p1上CPU进行调度
    2. 7时刻:p1进程结束,7时刻p2,p3,p4进程都到达
    3. 计算p2、p3、p4的响应比:p2([(7-2)+4]/4=2.25)、p3([(7-4)+1]/1=4)、p4([(7-5)+4]/4=1.5),优先调度相应比高的p3
    4. 8时刻:p3进程结束,计算相应比p2(2.5)、p4(1,75)调度p2
    5. 12时刻:p2进程结束,只剩下p4进程,调度p4

    优点:

    1. 综合考虑了等待时间与运行时间
    2. 不会导致饥饿问题,长作业随着等待时间的提高,相应比会提高,避免了饥饿问题

    前三种算法主要保证公平性,不区分任务的紧急程度对用户的交互性很差

    时间片轮转调度算法(RR)

    思想:按照进程进入就绪队列的顺序,轮流让进程在CPU中执行一个时间片长度。如果进程在一个时间段内没有完成任务,则剥夺处理机,让这个进程进入就绪队列尾部等待CPU调度。

    需要注意:

    1. 时间片轮转调度算法仅仅适合进程调度,不适合作业调度。只有进程才会被系统分配时间片。
    2. 这种调度算法属于抢占式算法,由时钟装置发出时钟中断通知CPU时间片已经到

    在这里插入图片描述
    设时间片大小为2时

    1. 时刻0,p1进程到达,p1进程被调度
    2. 时刻2,p2进程到达,p1时间片到达,下CPU并到就绪队列尾部,此时就绪队列为p2(队头4)-p1(3),CPU调度p2进程
    3. 时刻4,p3进程到达,p2时间片到,此时就绪队列为p1(队头3)-p3(1)-p2(2),CPU调度p1
    4. 时刻5,p4进程到达,p1时间片未到,此时就绪队列为p1(队头2)-p3(1)-p2(2)-p4(6)
    5. 时刻6,p1时间片到,轮转调度,此时就绪队列为p3(队头1)-p2(2)-p4(6)-p1(1),CPU调度p3进程
    6. 时刻7,p3进程正常结束,CPU进行调度此时就绪队列为p2(队头2)-p4(6)-p1(1),CPU调度p2
    7. 时刻9,p2进程正常退出,此时就绪队列为p4(队头6)-p1(1),CPU调度p4进程
    8. 之后就是这个两个进程在调度,不在赘述

    时间片为5的情况不在赘述

    需要注意:

    如果设置的时间片比较大时,会导致每个进程都在一个时间片内完成,此时时间片轮转调度算法和先进先服务算法调度顺序相同。

    时间片大小不适合太大,也不适合太小。太大了会增加进程响应的时间,太小了回到是进程切换频繁,系统开销增大

    优点:

    1. 对于每个进程来讲公平
    2. 进程响应快
    3. 不会导致饥饿问题

    缺点

    1. 用于进程切换时有开销
    2. 不区分任务的紧急程度

    优先级调度算法

    思路:每个作业/进程有各自的优先级,调度时选择优先级最高的作业/进程

    这个算法既可以用在进程调度,也可以用于作业调度(同时也适用于IO调度)

    优先级调度算法可以由抢占式,也可以有非抢占式

    • 非抢占式只需在进程主动放弃处理机时进行调度即可
    • 抢占式还需在就绪队列变化时,检查是否会发生抢占。

    在这里插入图片描述
    非抢占式调度图:
    在这里插入图片描述
    抢占式优先级调度算法:
    在这里插入图片描述

    需要注意:

    1. 就绪队列不一定只有一个,可以按照优先级来组织就绪队列(把优先级高的进程放在靠近队头的位置)
    2. 根据优先级是否可以动态改变,可将优先级分为静态优先级和动态优先级两种。(动态优先级在运行时优先级可能改变,静态优先级在进程创建后不会改变)
    3. IO繁忙进程优先级比计算繁忙进程优先级高,让IO繁忙进程快速运行,使IO设备能尽快的于CPU并行运行,提高系统吞吐量
    4. 系统进程优先级比用户优先级高

    优点:

    1. 区分进程的优先级,可以灵活的处理各个进程或作业

    缺点:

    1. 如果有很多优先级比较高的进程到来,可能会导致饥饿问题

    多级反馈队列调度算法

    这种算法是上述几种调度算法的综合
    具体思路:

    1. 设置多级就绪队列,各级队列优先级从高到低,时间片从小到大
    2. 新进程到达时先进入第1级队列,按FCFS原则排队等待被分配时间片,若用完时间片进程还未结束,则进程进入下一级队列队尾。如果此时已经是在最下级的队列,则重新放回该队列队尾
    3. 只有第k级队列为空时,才会为k+1级队头的进程分配时间片

    这种算法只适用于进程调度,不适用于作业调度。

    此外这种调度算法属于抢占式调度算法
    在这里插入图片描述
    调度分析:

    1. 0时刻,此时只有p1进程,p1进程在第一级队列被调度
      在这里插入图片描述

    2. 时刻1,此时p2进程到达,p1进程时间片到,p1进程到第二级队列队尾。p2进程进入第一级队列队尾。CPU处理p2进程
      在这里插入图片描述

    3. 时刻2,此时p2进程时间片到达,进入第二级别队列队尾
      在这里插入图片描述

    4. 此时第一级别队列为空,为第二级别队列分配时间片,此时p1在队头,CPU调度p1进程

    5. 时刻4,p1时间片到,执行调度算法,CPU调度p2进程
      在这里插入图片描述

    6. 时刻5,进程p3进程到达,p3进入第一级队列,p2被抢占,p2回到原来队列的队尾,CPU调度p3
      在这里插入图片描述

    之后的调度过程与上面类似,就不在赘述了

    最终调度顺序为:

    P1(1)->P2(1)->P1(2)->P2(1)->P3(1)->P2(2)->P1(4)->P1(1)

    优点:

    1. 对各类进程相对公平
    2. 进程响应比较快
    3. 短进程响应快,长进程也能得到积极的响应
    4. 进程具有优先级

    缺点:

    1. 短进程如果很多的话,优先级低的进程会导致饥饿问题。

    多级队列调度算法

    思路:进程被后会对进程进行分类。不同类别的进程优先级不同
    在这里插入图片描述

    队列之间可以采用时间片轮转调度。
    eg:如三个队列分配时间50%、40%、10%

    每个队列自身可以采用上述的各种不同的调度算法

    eg:

    • 系统进程队列采用优先级调度
    • 交互式队列采用RR
    • 批处理队列采用FCFS
  • 相关阅读:
    单调队列/单调栈优化dp
    oppo手机便签隐藏了一条怎样打开?手机如何找到隐藏便签?
    并发中级(第二篇)
    基于Python实现的黑白棋强化学习模型
    [数据集][目标检测]胸部解剖检测数据集VOC+YOLO格式100张10类别
    JWT安全问题
    我们写的代码是如何一步步变成可执行程序(.EXE)的?
    Spring Aop 入门与理解
    《倍增商业成功宝典》全新升级上线!炙夏新品,久等终至!
    Linux初识
  • 原文地址:https://blog.csdn.net/dodamce/article/details/126641353