调度

调度

调度:当有一堆任务要处理,但由于资源有限,需要某种规则来决定这些任务的顺序


进程(低级)调度

就绪队列中按某种方法选取一个进程,并将处理机分配给它

  • 操作系统最基本的一种调度

  • 频率很高

  • 主动放弃CPU:

    • 进程正常终止

    • 运行过程发生异常

    • 进程主动请求阻塞(等待I/O)

  • 被动放弃CPU:

    • 时间片用完

    • 更紧急事需要处理

    • 优先级更高的事进入就绪队列


不能进行进程调度和切换

  • 处理中断时

  • 进程在操作系统内核程序临界区

  • 原子操作过程中

进程调度方式:

  • 抢占式/剥夺调度方式:当有更重要进程需要使用处理机时,暂停当前进程,并将处理机分配给更紧急更重要的进程; 适合于分时、实时操作系统

  • 非抢占式/非剥夺调度方式:只允许进程主动放弃处理机开销小,但无法及时处理紧急任务


进程切换:一个进程让出处理机,另一个进程占用处理机

  • 对原来运行进程的各种数据保存

  • 对新的进程各种资源的恢复

进程切换是有代价的:若过于频繁的进行进程的切换与调度,会使整个系统的效率降低 ,系统大部分时间都花在了进程切换上,真正用于执行进程的时间减少


内存(中级)调度

决定将哪个处于挂起状态的进程重新调入内存

挂起状态:暂时不能运行的进程调入外存等待,但PCB常驻内存 ,插在挂起队列提高了内存的利用率和系统的吞吐量

  • 就绪挂起

  • 阻塞挂起


中级调度比高级调度发生更频繁

image


挂起的进程映像在外存中,阻塞的进程映像在内存中


作业(高级)调度

按一定原则从外存上处于后备队列的作业中挑选一个作业,给它们分配内存等资源,并建立相应的进程(建立PCB),使它们获得竞争处理机的权利

  • 外存与内存间的调度

  • 每个作业只调入一次(建立PCB),调出一次(撤销PCB)


高级调度 从后备队列调入内存,并创建进程 外存->内存(面向作业) 频率最低 无->创建态->就绪态
中级调度 挂起队列调回内存 外存->内存(面向进程) 频率中等 挂起态->就绪态;阻塞挂起态->阻塞态
低级调度 就绪队列分配处理机 内存->CPU 频率最高 就绪态->运行态

调度算法

FCFS、SJF、HRRN适合于早期的批处理系统,没有交互性

时间片轮转调度算法、优先级调度算法、多级反馈队列调度算法适用于交互式系统


先来先服务FCFS

  • 按照先后顺序进行服务;等待时间越久,越优先得到服务

  • 非抢占式算法

例:

image

image

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

P1=7-0=7;P2=11-2=9;P3=12-4=8;P4=16-5=11

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

P1=7/7=1;P2=9/4=2.25;P3=8/1=8(短作业的带权周转时间太大);P4=11/4=2.75

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

P1=7-7=0;P2=9-4=5;P3=8-1=7;P4=11-4=7

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

平均带权周转时间=(1+2.25+8+2.75)/4=3.5

平均等待时间=(0+5+7+7)/4=4.75


  • 优:公平、算法实现简单;不会导致饥饿 (总会被处理到)

  • 缺:对长作业有利,对短作业不利

短作业优先SJF

  • 最短(服务时间)的进程/作业优先得到服务
  • 追求最少的平均周转时间、平均带权周转时间、平均等待时间
  • 有抢占式版本,也有非抢占式版本

例:(非抢占式)

image

image

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

P1=7-0=7;P2=12-2=10;P3=8-4=4;P4=16-5=11

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

P1=7/7=1;P2=10/4=2.5;P3=4/1=4;P4=11/4=2.75

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

P1=7-7=0;P2=10-4=6;P3=4-1=3;P4=11-4=7

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

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

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


例:(抢占式)SRTN

image

image

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

P1=16-0=16;P2=7-2=5;P3=5-4=1;P4=11-5=6

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

P1=16/7=2.28;P2=5/4=1.25;P3=1/1=1;P4=6/4=1.5

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

P1=16-7=9;P2=5-4=1;P3=1-1=0;P4=6-4=2

平均周转时间=(16+5+1+6)/4=7

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

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


  • 若未特别说明,默认是非抢占式优先算法

  • 在所有进程同时可运行/所有进程几乎同时到达,SJF平均等待时间、平均周转时间最少

  • 抢占式最短优先算法的平均等待时间、平均周转时间最少


  • 优:最短的平均等待时间、平均周转时间

  • 缺:不公平:对短作业有利,长作业不利会产生饥饿

高响应比优先HRRN

  • 不仅考虑作业/进程的等待时间还要考虑运行时间

  • 每次调度时计算各个作业/进程的响应比,选择响应比高的优先服务

    响应比=(等待时间+运行时间)/运行时间≥1

  • 非抢占式算法

  • 不会导致饥饿

例:

image

响应比:

P1:P2=(5+4)/4=2.25;P3=(3+1)/1=4;P4=(2+4)/4=1.5

P1、P3:P2=(6+4)/4=2.5;P4=(3+4)/4=1.75

P1、P3、P2、P4


时间片轮转调度算法RR

  • 公平、轮流为各个进程服务

  • 按照到达就绪队列顺序,轮流让各个进程执行一个时间片,未处理完则剥夺处理机,放到就绪队尾重新排序

  • 用于进程调度 (只有在进入内存建立了进程后才能被分配处理机时间片)

  • 抢占式算法(由时钟装置发出时钟中断来通知CPU时间片已到)

  • 常用于分时操作系统不计算周转时间,更注重响应时间

例:

时间片=2

image

image


时间片=5

image

时间片太大,使得每个进程都可以在一个时间片内就完成,因此时间片轮转调度算法退化为先来先服务调度算法

时间片太小,导致进程切换过于频繁,系统花大量时间来处理进程切换,实际执行时间减少

合理时间片:切换进程开销占比不超过1%


  • 优:公平、响应快;不会导致饥饿

  • 缺:高频率的进程切换,造成一定开销;不区分任务紧急程度

优先级调度算法

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

  • 有抢占式也有非抢占式

  • 优先级是否可以动态改变:

    • 静态优先级:创建进程时确定,之后一直不变

    • 动态优先级:创建进程时确定,之后根据情况动态调整

      系统进程优先级>用户进程;前台进程优先级>后台进程;操作系统更偏好I/O型进程

  • 适用于实时操作系统


  • 优:用优先级区分紧急、重要程度,灵活调整对作业/进程的偏好程度

  • 缺:会导致饥饿

多级反馈队列调度算法

  • 用于进程调度

  • 抢占式算法

  • 会导致饥饿

例:

image

  1. 设置多级就绪队列,各级队列优先级从高到低时间片从小到大

    image

  2. 新进程先进入第1级队列,按先来先服务原则等待被分配时间片

  3. 若时间片用完进程未结束,则进程进入下一级队尾

  4. 若到了最后一级,则放入队尾

  5. 只有在第i级队列为空时,才会为第i+1级队列分配时间片

  6. 被强占处理机的进程重新放入原队队尾


调度算法的评价指标

  • CPU利用率:忙碌时间/总时间

  • 系统吞吐量:总共完成的作业量/总共花的时间

  • 周转时间:从作业被提交给系统开始,到作业完成为止=作业完成时间-作业提交时间

    • 高级调度时间

    • 低级调度时间(就绪)

    • CPU上运行时间(运行)

    • 等待I/O操作时间(阻塞)

  • 带权周转时间:作业周转时间/实际运行时间(必然≥1)

  • 周转时间、带权周转时间都是越小越好

  • 等待时间:

    • 进程的等待时间:进程建立后,等待被服务的时间之和

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

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


posted @ 2023-02-14 14:30  原语  阅读(156)  评论(0编辑  收藏  举报