我是一个进程调度员。我的职责是调度计算机中的所有进程,并为它们分配CPU资源。1、在批处理时代,操作系统创造我的时候,只是想让我使用FCFS调度算法,简单的维护进程的顺序。但是我后来的发展远远超出了他的想象。1.1FCFS所谓FCFS就是“先来先服务(FirstComeFirstServe)”,每个进程按照进入内存的时间排成一个队列。每当CPU上的进程运行完毕或者阻塞时,我就会选择排在队列前面的进程,拿到CPU上去执行。以这几个进程为例:按照FCFS算法,我会按照A、B、C、D、E的顺序送入CPU:这个算法听起来简单公平,但是好景不长,收到一个短进程的投诉:“上次我前面排了一个长进程,他跑完了200秒,我才1秒跑完,就因为我在等他”拖了这么久,不值得。”仔细一想,FCFS算法确实存在这个缺陷——短进程的响应时间太长,用户交互体验会变差,所以决定更换调度算法1.2SPN我这次设计的算法被称为“ShortestProcessNext(SPN)”。每次都会选择期望处理时间最短的进程。因此,在排队的时候,我会把队列中短的进程带到最前面。这次,短进程拿的很好care,进程的平均响应时间大大降低,我和OS都很满意。但是长期进程退出:那些短期进程每天都在排队,导致他们经常得不到CPU资源,造成“饥饿”现象。取消SPN算法的呼声越来越高,这是个大问题。虽然FCFS的响应时间很长,但最终所有进程都必须有机会使用CPU资源。但是SPN算法不同。如果不断地把短进程加到队列中,长进程就永远得不到执行的机会——这很糟糕。因此,短任务优先算法需要改进。有什么办法可以兼顾短流程和长流程?1.3HRRN与操作系统讨论后,我们决定综合考虑进程的两个属性:等待时间和所需服务时间——等待时间长、服务时间短(即短进程)的进程更有可能被选中。为了量化,我们制定了一个公式:响应率=(等待时间+请求服务时间)/请求服务时间。首先执行具有较高响应率的算法。我们将其称为下一个最高响应比(HRRN)。该算法在长进程和短进程中都得到了很好的接受。虽然我的工作量增加了(每次调度前都要重新计算所有等待进程的响应率),但是为了进程的公平,一切都是值得的。2、新的并发时代已经到来。随着计算机的普及,大量的个人用户增多,同时运行多个程序的需求出现了。这让我很困惑——只有一个处理器,如何运行多个程序?幸运的是,CPU把我叫醒了:“既然我现在的计算速度这么快,为什么不利用这个优势,创造一个“伪并行”的呢?“伪并行?”你说的“”是什么意思“它看起来像并行,但实际上是串行的。每个进程在短时间内交替使用我的资源,但对人类来说,这些进程看起来像是在“同时”运行。”我突然恍然大悟。2.1RR在CPU的提醒下,我很快想出了一个新的调度算法——RoundRobin(RR)。在这个算法中,每个进程都会轮流使用CPU资源,但是当它们开始运行时,我会为它们开启定时器。如果定时器超时(或执行阻塞操作),进程将被强制“下机”并切换到下一个进程。至于下一个进程的选择,直接用FCFS就好了。新的算法必然会面临新的问题。现在我的问题是,如何设计时间片的长度?直观上,时间片越短,固定时间内可以运行的进程越多,但是CPU说切换进程会消耗大量的指令周期。太短的时间片会导致大量的CPU资源被浪费在上下文切换上。优越的。如果时间片过长,会导致对简短交互命令的响应变慢。所以怎么取就看交互时间了(感觉没说,但至少给了一个标准)。这个阶段,我的工作量有了很大的改善——以前十几秒不用切换一次节目,现在一秒要切换几十次。2.2VRR时间片轮换算法看起来很公平——所有进程时间片都是一样的。但事实真的如此吗?I/O密集型进程不这么认为。他对我说:“调度大哥,时间片轮转不照顾我们这种进程!我们经常遇到阻塞操作,还没有在CPU停留半个时间片,就被阻塞了。你开下去。而我们都在阻塞队列中,我们往往要长时间停留,当阻塞操作结束后,我们又要在就绪队列中长时间排队,那些处理器密集型进程占用了大部分处理器时间。结果,我们的性能下降,响应时间跟不上。”考虑到这些进程的需求,我决定为它们新建一个辅助队列。未阻塞的进程将进入这个辅助队列。调度进程时,会优先选择辅助队列中的进程。这就是“虚拟循环(VRR)”。从后面的实际表现结果来看,这种方式确实比round-robin方式要好。我为此感到非常自豪。2.3优先级调度有一天,操作系统突然发现我,神神秘秘地说:“调度器,你知道我要为整个系统提供服务,但是最近用户进程太多,导致我的服务进程没有时间响应跟不上,我有点担心这会影响系统的稳定性。”我一听,这可大不了,系统不稳定怎么办?调度算法需要改变!既然要让操作系统的服务获得足够的运行资源,那么干脆让它们拥有最高的CPU使用优先级。优先级调度算法诞生了。我给大家做了一个规定——每个进程都会被赋予一个优先级,大家可以根据自己的情况来确定优先级的值。但是,用户进程的优先级不允许高于内核进程的优先级。切换程序时,我会从优先级为1的队列中选择一个进程。如果优先级为1的队列为空,我将选择优先级为2的进程,依此类推。当然,为了保证低优先级的进程不会饿死,我会提高等待时间长的进程的优先级。使用这个算法,我比较忙,不仅需要大量切换进程,还需要动态调整优先级。也许这意味着能力越大责任越大。但我知道正是因为我,人类才能在计算机上进行多道程序设计——这让我感到自豪。我希望你在阅读我的文章后有所收获。感谢阅读,我们很快就会回来!免责声明:原创文章,未经授权禁止转载
