目录

操作系统-调度算法

《操作系统》-调度算法

调度算法

在了解调度算法之前我们先了解一下调度算法的评价指标从这几个方面入手: CPU利用率、系统吞吐量、周转时间、等待时间、响应时间


CPU利用率 :指CPU“忙碌”的时间占总时间的比例

https://i-blog.csdnimg.cn/blog_migrate/896444a0cc81f15b97ade86b6d503934.png

由于早期的CPU造价极其昂贵,因此人们会 希望让CPU尽可能多地工作

https://i-blog.csdnimg.cn/blog_migrate/acb8912780f2531a95ee180e139de974.png


系统吞吐量 :单位时间内完成作业的数量

对于计算机希望尽可能少的时间处理完尽可能多的作业

https://i-blog.csdnimg.cn/blog_migrate/9b6507f74e5417f78acb6effe5e9bc36.png

https://i-blog.csdnimg.cn/blog_migrate/e99a37d49f2472e623d7c51fcbb6d7da.png


周转时间 :是指从 作业被提交给系统开始 ,到 作业完成为止 的这段时间间隔

对于计算机用户来说,他很关心自己的作业从提交到完成花了多少时间

他包括四个部分 :作业在外存后备队伍中等待被调用的时间、进程在就绪队伍上等待进程调度的时间、进程在CPU上执行的时间、进程等待I/O操作完成的时间。后三项在一个作业的整个处理过程中可能多次发生

https://i-blog.csdnimg.cn/blog_migrate/ac3eddadd370e6588b80949da76240aa.png

https://i-blog.csdnimg.cn/blog_migrate/24625ac9f46ed2d2f4dc69898182117e.png

https://i-blog.csdnimg.cn/blog_migrate/95523e2d5c2df252dda63e01863a2d92.png

带权周转时间必然>=1

带权周转时间与周转时间都是越小越好

https://i-blog.csdnimg.cn/blog_migrate/886021ebbb5558092a4442d5fef1893f.png

对于周转时间相同的两个作业,实际运行时间长的作业在相同的时间内被服务的时间更多,带权周期时间更小,用户满意度更高

对于实际运行时间相同的两个作业,周转时间短的带权周转时间更小,用户满意度更高


等待时间 :指进程/作业 处于等待处理机状态之和 ,等待时间越长,用户满意度低

计算机用户希望自己的作业尽可能少的等待处理机

对于 进程 来说,等待时间就是指进程建立后 等待被服务的时间之和 ,在等待I/O完成的期间其实进程也是被服务的,所以不计入等待时间

对于 作业 来说,不仅要考虑 建立进程后的等待时间、还要加上作业在外存队列中的等待时间。

一个作业总共需要被CPU服务多久,被I/O设备服务多久一般是确定不变的,因此调度算法其实只会影响作业/进程的等待时间。当然,与前面指标类似,也有“ 平均等待时间 ”来评价整体性能


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

对于计算机用户来说,会希望自己的提交请求尽早开始被系统服务、回应

https://i-blog.csdnimg.cn/blog_migrate/7c8ae3fafe0ec22019f9549e22f7ca5a.png

适用于 早期的批处理系统 的调度算法

https://i-blog.csdnimg.cn/blog_migrate/3bed739fb249e0b8975cdbfdc5570cc1.png


先来先服务(FCSF)

https://i-blog.csdnimg.cn/blog_migrate/d93feeb1dc3ef3e0a44893763efd4049.png

饥饿 :某进程/作业长期得不到服务

https://i-blog.csdnimg.cn/blog_migrate/6f50db79770486338608cbd3e0c8f130.png


短作业优先

https://i-blog.csdnimg.cn/blog_migrate/6ba32e6d056b93829abbae26534552df.png

非抢占式的短进程优先调度算法(SFP)

https://i-blog.csdnimg.cn/blog_migrate/66526954fe58e8ba67ff638a66e949ab.png

抢占式的短进程优先调度算法(SRTN)

https://i-blog.csdnimg.cn/blog_migrate/149010c1f72fad0f8a11df2cc1d23055.png

https://i-blog.csdnimg.cn/blog_migrate/16e6f6f7ec739f9fc2c5f1c2b1e814a0.png

注意 几个小细节:

1、如果题目中 未特别说明 ,所提到的“短作业/进程优先算法” 默认非抢占式

2、很多书上都会说“SJF调度算法的平均等待时间、平均周转时间最少”

严格的说,这个表述是错误的,不严谨的,之前的例子表明抢占式的短进程优先算法(SRNT)得到的平均等待时间、平均周转时间更少:

应该加上一个条件“在 所有进程同时可运行 时”,采用SJF调度的平均等待时间、平均周转时间最少

或者说:“在 所有进程都几乎同时到达 时”,采用SJF调度算法的平均等待时间、平均周转时间最少

如果不加上上述前提条件,则应该说“ 抢占式的 短作业/进程优先调度算法(最短剩余时间优先, SRNT 算法)”的平均等待时间、平均周转时间最少

3、虽然严格意义上来说,SJF算法的等待时间、周转时间不一定是最少的,但相对于其他算法(如:FCFS),SJF依然可以获得较少的平均等待时间、平均周转时间

4、如果选择题中遇到“SJF 算法的平均等待时间、平均周转时间最少”的选项,那最好判断其他选项

是不是有很明显的错误,如果没有更合适的选项,那也应该选择该选项


高响应比优先算法

FCFS算法是每次调度的时候选择一个等待时间比较长的作业(进程)为其服务,但是没有考虑到作业的运行时间,因此导致对短作业不友好的问题

SJF算法是选择一个执行时间最短的作业为其进行服务,但是又完全不考虑各个作业的等待时间,因此导致对长作业不友好的问题,甚至还会导致饥饿问题

因此就提出了高响应比优先算法,即考虑到了各个作业的等待时间,也能兼顾运行时间

https://i-blog.csdnimg.cn/blog_migrate/e91e44e2fffb7aedc8414a6c09757005.png

https://i-blog.csdnimg.cn/blog_migrate/7b43cbebda61bd82badf442914dd2ff3.png

对于前面三种调度方法的对比

https://i-blog.csdnimg.cn/blog_migrate/670b1b484528b30956b85a51df6c3e37.png

:这几种算法主要关心对用户的公平性、平均周转时间、平均等待时间这几个评价系统整体性能的这几个指标,但是不关心“响应时间”,也并不区分任务的紧急程度,因此对于用户来说,交互性很糟糕。因此这三种算法一般适用于 早期的批处理系统 ,当然,FCFS算法也常结合其他算法使用,在现在也扮演着很重要的角色。

以上三个算法交互性很糟糕,那我们接下来介绍一下,适用于 交互系统 的调度算法

https://i-blog.csdnimg.cn/blog_migrate/ee317f4886201fb0f40e33bbbeaf01f6.png


时间片轮转(RR)

https://i-blog.csdnimg.cn/blog_migrate/9753da3d02f0caeb524e3273e6fe5197.png

时间片大小为2时

https://i-blog.csdnimg.cn/blog_migrate/d1e470c67c8d4e9b64b2cfedb05d633e.png

https://i-blog.csdnimg.cn/blog_migrate/a1a1a52267ea6bd02122dc715fde8c32.png

https://i-blog.csdnimg.cn/blog_migrate/83b8c66120575858975d8e26db9491d4.png

时间片为5时

https://i-blog.csdnimg.cn/blog_migrate/27ff2f7b4f6411fbe11cd59ea97a1ca6.png

当时间片为5时,在这种情况下就和先来先服务调度算法执行的结果相同了,所以如果时间片太大,使得每个进程都可以在一个时间片内就完成,则时间片轮转调度算法退化为先来先服务调度算法,并且会增大进程响应时间。因此 时间片不能太大 。另一方面,进程调度、切换是有时间代价的(保存、恢复运行环境),因此如果时间片太小,会导致进程切换过于频繁,系统会花大量的时间来处理进程切换,从而导致实际用于进程执行的时间比例减少。可见 时间片也不能太小


优先级调度算法

https://i-blog.csdnimg.cn/blog_migrate/6d179fb67975947d1a05ecc56f658d78.png

非抢占式的优先级调度算法

https://i-blog.csdnimg.cn/blog_migrate/1661a020c0b091f855e92d042024c69e.png

抢占式优先级调度算法

https://i-blog.csdnimg.cn/blog_migrate/e971333857cf8698ef5a8ab8fd4d1bf3.png

补充:

就绪队列未必只有一个,可以按照不同优先级来组织。另外也可以把优先级高的进程放在更靠近队头的位置

根据优先级是否可以动态改变,可将优先级分为 静态优先级动态优先级

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

动态优先级:创建进程时有一个初始值,之后会根据情况动态地调整优先级

1、如何合理地设置各类进程的优先级?

答:通常,系统进程优先级 高于 用户进程

前台程序进程优先级 高于 后台进程

操作系统更 偏好I/O型进程(或称I/O繁忙型进程)

注:与I/O型进程相对的是 计算机进程(或称CPU繁忙型进程)

2、如果采用是动态优先级,什么时候应该调整?

答:可以从追求公平、提高资源利用率等角度考虑

如果某进程在就绪队列中等待了很长时间,则可以适当的提高其优先率

如果某进程占用处理机时间很长,则可以适当降低其优先率

如果发现一个进程频繁地进行I/O操作,则可适当提升其优先级


多级反馈调度队列算法

FCFS算法的优点是公平,SJF算法的优点是尽快处理完短作业,平均等待/周转时间等参数都很优秀,时间片轮转调度算法可以让各个进程得到及时的响应,优先级调度算法可以灵活地调整各个进程被服务的机会为了将这些算法折中权衡,得到一个综合表现优秀平衡的算法,多级反馈队列调度算法诞生了

https://i-blog.csdnimg.cn/blog_migrate/66df5a13c5c3578c25554cd7fd36a0fc.png

https://i-blog.csdnimg.cn/blog_migrate/fa4d438f306a34f86f47b5cad92a9718.png

对于前面三种调度方法的对比

https://i-blog.csdnimg.cn/blog_migrate/946747d4fd9b5972e6d98e6a5ad3d261.png

注:比起早期的批处理操作系统来说,由于计算机造假大幅度降低,因此之后出现的交互性操作系统(包括分时操作系统、实时操作系统)更注重系统的响应时间、公平性、平衡性等指标。而这几种算法恰好也能较好的满足交互系统的需求,因此这三种算法适用于 交互式系统 。(比如UNIX使用的就是多级反馈队列调度算法)