上一篇学习了虚拟内存分页相关的技术,这次通过《现代操作系统》这本书学习梳理一下调度算法。我写的不会很详细,尽量理清思路,搭好框架,日后把文章当作一个索引去查缺补漏,不会的认真翻书,简单的把书上内容照搬到博客中并无意义。
首先,在不同的环境下需要不同的调度算法,因为不同的环境下有不同的目标,优化的目标是不同的,因地制宜。
- 批处理
- 交互式
- 实时
批处理中的调度
先来先服务 first-come first-served
这个没什么好说的吧
最短作业优先
这里注意是最短作业,不是最短进程
最短剩余时间优先
交互式系统中的调度
轮转调度
给每个进程分配一个时间段,称为时间片,他的时间段到了就不让他继续运行了。 注意时间片的长度很重要,若设置得太短则导致更多时间花在上下文切换过程,若过长则引起对短的交互请求的时间响应变长。一般认为20~50ms比较合理。
优先级调度
相当于把各种进程分为几个层次组,从层次最高的那一组中进行轮转调度,如果这一层空了再运行低层次组里的进程。
很显然如果不及时调整优先级,那么在最低优先级那一组的进程可能会产生饥饿现象。
- 可以每次运行完一个时间片就降低这个进程的优先级
- 可以将IO密集型的进程优先级设为1/f,f为该进程在上一时间片中所占的比例。思想是:你上一次在时间片中运行时间少,那下次就多给你机会,上次时间片内全用完了的线程下次少一点机会,优先级靠后些
多级队列
对于CPU密集型,设置较长的时间片要比频繁地分给他们较短时间片更高效,即应该减少CPU密集型的交换次数,让他们专注于计算。但长的时间片又会影响进程的响应时间,就是你让他可以计算很久,那我其他进程就要等很久。
解决办法就是设置优先级类。在上面优先级调度方法基础上进行改进。刚才的优先级调度中,不同的优先级进程运行时间都是同样的一个时间片。但多级队列中改为,优先级越低,可以运行的时间片越多,就是运行时间越长。
比如最高优先级1的进程运行完一个时间片,他的优先级变为2,但是他下次轮到他可以运行2时间片,第三次他的优先级已经是3了,可以运行4时间片,以此类推。
最短进程优先
问题来了:如何知道每个进程将要运行的时间?
可以根据过去的行为进行推测。通过把当前测量值和先前估计值进行加权平均而得到下一个估计值,这种算法也被称为老化算法(aging)
保证调度
彩票调度
刚刚发现,蓝色的《操作系统导论》中对于调度算法的讲解也很细致,循序渐进的,一会看一下,明天在文章中补充一下。