将计算机思维故事化——之操作系统典型调度算法
在计算机正常工作中,后台有大量的进程在执行,但彼此“不争吵不争夺”,这归功于操作系统中的调度算法。
通常。大多数进程的执行能够简单的分为两步走:
第一步,将须要运行的进程从外存(比如,电脑的硬盘)中选出来,送至内存“候旨”,准备让CPU来运行;
第二步,CPU从那些在内存“候旨”的若干进程中选出一个。開始运行。
简单的说,调度就是选择的办法。
【调度是多道程序操作系统的基础,是操作系统设计的核心基础。上述“两步走”中。第一步中的选择。这次调度称为“作业调度”;第二步中的选择,这次调度称为“进程调度”。】
在计算机发展过程以来,渐渐形成了多种选择的办法,当中有的选择办法适用于“第一步”阶段,有的适用于“第二步”阶段,有的两者都适用。
【在操作系统中存在多种调度算法,当中的有的调度算法适用于作业调度。有的调度算法适用于进程调度,有的调度算法两者都适合。】
当中有六种办法比較经典,为了仔细描写叙述这六种办法。引入一个情境——“小岛取水”。
话说,一群人来到一个小岛上。决定在小岛上生活一段时间。生活期间须要水,而小岛上仅仅有一个水源,幸好是源源不断的。
一群人蜂拥而至地取水,不但秩序乱,还会引发危急。于是大家商议着办法。定出一个制度来保证取水的秩序。非常快。秩序的若干方案提出来了,各有优势又各有劣势,于是决定開始试行。
第一天,開始试行方案一:谁先到谁先取水。剩下的排队。于是。每次水源前排着长长的队伍,人们安静地等待轮到自己的机会。非常快。问题出现了。有的人用桶取水洗澡,有的人用杯取水仅仅是为了喝,因为先到先得的制度。打水喝的人为了打到一杯水,不得不等上几十分钟,等前面的人都结束才轮到自己。渐渐地,大家发现这个方法看上去比較公平,却过于死板,应该改进。
非常好的是,这个方法提出了这样的先到先得的思维,而这样的思维能够融合在其它方案之中。
【这样的调度算法叫作“先来先服务调度算法”(FCFS),该算法特点是算法简单。但效率低,平均等待时间过长。对长作业比較有利,但对短作业不利;但它常被结合在其它调度算法中使用。
】
第二天,为了弥补方案一的漏洞。大家决定试试方案二:让须要水较少的先打,须要多的往后排。
这使得大家很热衷于“频取少取”,由于一次须要的少,就能够往前面排队,不分先后抵达。到了中午猛然发现,队伍中有一人已经等了整个上午,由于他用桶取水,须要的多。理应排在后面,好不easy看着前面的人越来越少。又来了一群用杯打水的。由于须要的少所以能够“插队”,结果到天黑也没打到水。
所以,大家慢慢地所有换成杯子打水,并且杯子越换越小,甚至出现用勺子取水的另类。
【这样的调度算法叫作“短作业优先调度算法”(SJF),该算法虽使得平均等待时间大大缩短,但对长作业不利。甚至出现某些长作业永远得不到执行(“饥饿”现象)。
此外,当用户人为地缩短执行时间时,该算法不一定真正做到短作业优先。】
第三天,大家開始运行方案三:依照紧迫程度顺序排队打水。制定了文件来描写叙述日常的每件事的紧迫程度,用优先级来描写叙述须要水的紧迫程度。
大家每次来打水时,先汇报自己打水是为了干什么。依据优先级来决定先后。可是发现这样的优先级文件难以制定,当中有一项“打水洗手”,将此项的紧迫程度规定得很低(理由是:小岛周围都是水。用海水洗手就能够了),于是,有个小孩想洗手。不管怎么等,就是轮不到自己去取水。而那些满足最高优先级取水的人。总是重复来取水,高优先级似乎成了这些人的特权,而导致怨声载道。到了下午。開始有了改善。採用调整优先级策略。仅仅要是取过一次水。优先级自降一级,理论上给了那些非紧迫程度的人取水的机会,这一天勉强结束了。
【这样的调度算法叫作“优先级调度算法”。该算法相同会引起“饥饿”现象,使得有些作业永远得不到运行。为了解决问题,能够将该算法分为“静态优先级”和“动态优先级”,通过动态调整优先级来解决“饥饿”现象(该举措称为“老化”)。】
第四天,运行方案四:结合方案一和方案二,即同一时候到的。须要少的先打;须要同样量的,先到的先打。由于方案四平衡了方案一和方案二,得到了稳定地运行,用杯子打水的由于须要的少,不须要等太久;用桶打水的。须要的多,但仅仅要去得早排个好队,一样可以打到水从根本上攻克了某些人永远打不到水的情况。
【这样的调度算法叫作“高响应比优先调度算法”,该算法主要用于作业调度,响应比=(等待时间+运行时间)/运行时间。有利于短作业。也兼顾了长作业,克服了“饥饿”现象。】
第五天,大家认为第四天过得挺稳定。或许还能发现更好的方案,于是运行了方案五:大家聚集在一起。由一个人循环地平均分水,一直循环到满足全部人的需求。大家认为这个方法非常公平。对每一个人都同等对待。一天下来,大家都没有怨气。但分水的人不干了。由于分水工作太难做。不知道一次分水量多少比較合适——一次分得太少了,就须要循环非常多次,太麻烦;一次分得太多了,还不如让他们直接去水源取水更方便。
【这样的调度算法叫作“时间片轮转调度算法”,在该算法中,时间片的大小对系统性能的影响非常大。时间片过小,CPU频繁切换,开销太大;时间片过大,该算法退化成先来先服务调度算法。】
第六天,运行者们消失了一天,或许他们去度假了。或许他们想办法去了…
第七天,他们兴高採烈的回来了。開始运行方案六:让前来打水的人们依照先后排成队伍,依旧安排一个人来循环平均分水。
但这次分水量有了改进——第一轮每一个人分一杯,须要一杯的人得到一杯水惬意的离开了。还须要的由于不够继续留在队伍里;第二轮每一个人分两杯。相同,满足的人惬意地离开。仍然须要的人继续留下……以此类推。
这样,队伍的人数越来越少,并且大家没有不论什么怨言,更关键的是。方案规定,对刚到的人先分水一杯,失去是留,他会依据自己须要决定,而不会陷入无尽的等待。这样,便兼顾了非常多方面,需求少的人取了一杯水立刻就行满足。缩短了大家的平均等待时间,并且也不须要汇报打水是为了干什么,同一时候也避免了永远打不到水的情况。
【这样的调度算法叫作“多级反馈队列调度算法”,在该算法是时间片轮转调度算法和优先级调度算法的综合和发展优先级,兼顾了短作业优先而等待时间短和长作业部分运行而避免“饥饿”现象。
】
以上就是操作系统六种经典的调度算法(先来先服务调度算法、短作业优先调度算法、优先级调度算法、高响应比优先调度算法、时间片轮转调度算法、多级反馈队列调度算法),各有利弊,不同的操作系统则依据自己側重的方面不同而选择不同进程调度算法。反过来。不同的调度算法适用于不同需求的操作系统。
* 思维碰撞,不要忘了与好友分享!未来将推出“将计算机思维故事化”系列,谢谢大家的关注!
*