将计算机思维故事化——之操作系统典型调度算法

在计算机正常工作中,后台有大量的进程在运行,但彼此“不争吵不争夺”,这归功于操作系统中的调度算法


通常,大多数进程的运行可以简单的分为两步走

第一步,将需要执行的进程从外存(例如,电脑的硬盘)中选出来,送至内存“候旨”,准备让CPU来执行;

第二步,CPU从那些在内存“候旨”的若干进程中选出一个,开始执行。


简单的说,调度就是选择的办法

【调度是多道程序操作系统的基础,是操作系统设计的核心基础。上述“两步走”中,第一步中的选择,这次调度称为“作业调度”;第二步中的选择,这次调度称为“进程调度”。】


在计算机发展过程以来,渐渐形成了多种选择的办法,其中有的选择办法适用于“第一步”阶段,有的适用于“第二步”阶段,有的两者都适用。

【在操作系统中存在多种调度算法,其中的有的调度算法适用于作业调度,有的调度算法适用于进程调度,有的调度算法两者都适合。】


其中有六种办法比较经典,为了细致描述这六种办法,引入一个情境——“小岛取水”


话说,一群人来到一个小岛上,决定在小岛上生活一段时间,生活期间需要水,而小岛上只有一个水源,幸好是源源不断的。一群人蜂拥而至地取水,不但秩序乱,还会引发危险。于是大家商量着办法,定出一个制度来保证取水的秩序。很快,秩序的若干方案提出来了,各有优势又各有劣势,于是决定开始试行。


第一天,开始试行方案一:谁先到谁先取水,剩下的排队。于是,每次水源前排着长长的队伍,人们安静地等待轮到自己的机会。很快,问题出现了,有的人用桶取水洗澡,有的人用杯取水只是为了喝,由于先到先得的制度,打水喝的人为了打到一杯水,不得不等上几十分钟,等前面的人都结束才轮到自己。渐渐地,大家发现这个方案看上去比较公平,却过于死板,应该改进。很好的是,这个方案提出了这种先到先得的思维,而这种思维可以融合在其他方案之中

【这种调度算法叫作“先来先服务调度算法”(FCFS),该算法特点是算法简单,但效率低,平均等待时间过长;对长作业比较有利,但对短作业不利;但它常被结合在其他调度算法中使用。】


第二天,为了弥补方案一的漏洞,大家决定试试方案二:让需要水较少的先打,需要多的往后排这使得大家非常热衷于“频取少取”,因为一次需要的少,就可以往前面排队,不分先后抵达。到了中午猛然发现,队伍中有一人已经等了整个上午,因为他用桶取水,需要的多,理应排在后面,好不容易看着前面的人越来越少,又来了一群用杯打水的,因为需要的少所以可以“插队”,结果到天黑也没打到水。所以,大家慢慢地全部换成杯子打水,而且杯子越换越小,甚至出现用勺子取水的另类。

【这种调度算法叫作“短作业优先调度算法”(SJF),该算法虽使得平均等待时间大大缩短,但对长作业不利,甚至出现某些长作业永远得不到执行(“饥饿”现象)。此外,当用户人为地缩短运行时间时,该算法不一定真正做到短作业优先。】


第三天,大家开始执行方案三:按照紧迫程度顺序排队打水制定了文件来描述日常的每件事的紧迫程度,用优先级来描述需要水的紧迫程度。大家每次来打水时,先汇报自己打水是为了干什么,根据优先级来决定先后。但是发现这种优先级文件难以制定,其中有一项“打水洗手”,将此项的紧迫程度规定得非常低(理由是:小岛周围都是水,用海水洗手就可以了),于是,有个小孩想洗手,无论怎么等,就是轮不到自己去取水。而那些满足最高优先级取水的人,总是反复来取水,高优先级似乎成了这些人的特权,而导致怨声载道。到了下午,开始有了改善,采用调整优先级策略,只要是取过一次水,优先级自降一级,理论上给了那些非紧迫程度的人取水的机会,这一天勉强结束了。

【这种调度算法叫作“优先级调度算法”,该算法同样会引起“饥饿”现象,使得有些作业永远得不到执行。为了解决这个问题,可以将该算法分为“静态优先级”和“动态优先级”,通过动态调整优先级来解决“饥饿”现象(该举措称为“老化”)。】


第四天,执行方案四:结合方案一和方案二,即同时到的,需要少的先打;需要相同量的,先到的先打因为方案四平衡了方案一和方案二,得到了稳定地执行,用杯子打水的因为需要的少,不需要等太久;用桶打水的,需要的多,但只要去得早排个好队,一样能够打到水从根本上解决了某些人永远打不到水的情况。

这种调度算法叫作“高响应比优先调度算法”,该算法主要用于作业调度,响应比=(等待时间+执行时间)/执行时间,有利于短作业,也兼顾了长作业,克服了“饥饿”现象。】


第五天,大家觉得第四天过得挺稳定,也许还能发现更好的方案,于是执行了方案五:大家聚集在一起,由一个人循环地平均分水,一直循环到满足所有人的需求大家觉得这个方案非常公平,对每个人都同等对待。一天下来,大家都没有怨气,但分水的人不干了。因为分水工作太难做,不知道一次分水量多少比较合适——一次分得太少了,就需要循环很多次,太麻烦;一次分得太多了,还不如让他们直接去水源取水更方便

【这种调度算法叫作“时间片轮转调度算法”,在该算法中,时间片的大小对系统性能的影响很大,时间片过小,CPU频繁切换,开销太大;时间片过大,该算法退化成先来先服务调度算法。】


第六天,执行者们消失了一天,也许他们去度假了,也许他们想办法去了…


第七天,他们兴高采烈的回来了,开始执行方案六:让前来打水的人们按照先后排成队伍,依然安排一个人来循环平均分水。但这次分水量有了改进——第一轮每个人分一杯,需要一杯的人得到一杯水满意的离开了,还需要的因为不够继续留在队伍里;第二轮每个人分两杯,同样,满足的人满意地离开,仍然需要的人继续留下……以此类推。这样,队伍的人数越来越少,而且大家没有任何怨言,更关键的是,方案规定,对刚到的人先分水一杯,失去是留,他会根据自己需要决定,而不会陷入无尽的等待。这样,便兼顾了很多方面,需求少的人取了一杯水立马就能够满足,缩短了大家的平均等待时间,而且也不需要汇报打水是为了干什么,同时也避免了永远打不到水的情况。

【这种调度算法叫作“多级反馈队列调度算法”,在该算法是时间片轮转调度算法和优先级调度算法的综合和发展优先级,兼顾了短作业优先而等待时间短和长作业部分执行而避免“饥饿”现象。】


以上就是操作系统六种经典的调度算法(先来先服务调度算法、短作业优先调度算法、优先级调度算法、高响应比优先调度算法、时间片轮转调度算法、多级反馈队列调度算法),各有利弊,不同的操作系统则根据自己侧重的方面不同而选择不同进程调度算法,反过来,不同的调度算法适用于不同需求的操作系统。



* 思维碰撞,不要忘了与好友分享!未来将推出“将计算机思维故事化”系列,谢谢大家的关注!*










  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值