一個故事看懂計算機作業系統的進化史

軒轅之風發表於2021-05-10

計算機

很久很久以前,有一臺機器,體型巨大,每秒鐘可以進行幾千次的加法運算,名震一時,人類給它取了個名字:計算機

除了加法,它還能計算平方、立方、正弦、餘弦,比人類的大腦算得快多了。

許多程式慕名而來,想在它上面執行一下,體會這飛一般的感覺。

“來來來,排好隊,一個一個來”,計算機的管理員說到。

眾程式挨個排好隊,等待管理員傳喚。

執行完一個,管理員再將其取出,換上下一個開始執行。

久而久之,程式們紛紛抱怨:排隊十分鐘,執行三秒鐘。人類管理員太慢了,時間都用在排隊上了,能不能讓計算機自動完成程式切換,不要手動切換?

人工操作的速度比起計算機實在是慢太多了,人機矛盾日益凸顯,人類決定對機器重新進行設計,並且開發了一個控制程式,在它的指揮下,可以批量執行程式,自動實現切換,不用再需要人工介入了,效率提高了不少。

多道程式處理

慕名而來的程式越來越多了,等待執行的隊伍排的越來越長。

有些程式等的不耐煩了,詢問控制程式:“大哥,你看前面那傢伙在做輸入輸出,CPU給空出來了,一時半會兒用不上,這不是浪費嗎,要不叫下一個上去執行吧”

控制程式皺著眉頭說到:“那怎麼行,前面程式執行的資料都在記憶體裡放著了,再放程式進去,要是弄壞了誰負責?再說CPU只有一個,前面的程式忙完輸入輸出回來了又該如何處理?”

大家一時語塞,誰也給不出主意,紛紛嘆氣,只好作罷,繼續等待。

不過聰明的人類倒是發現了這問題:讓一個程式獨佔計算機確實浪費資源,執行輸入輸出的時候,CPU就空著了,執行計算操作的時候,輸入輸出裝置又閒著了,總有一個閒著。

於是人類又重新設計了計算機,並開發了新版的控制程式,這一次,允許多個程式同時進入計算機執行了。

如果程式A執行輸入輸出,就把CPU空出來讓給另一個程式B執行,一會兒B再執行輸入輸出,再把CPU分給A執行,彼此交替,這樣一來就不會浪費了!

時間分片

不過沒多久,又出現了新的問題。

這一天,其他程式都在排隊等待控制程式翻牌子,可左等右等也不見傳喚,眾程式急了,質問控制程式,控制程式大倒苦水:“前面那個傢伙寫了個死迴圈,死活結束不了啊!”

聽他這麼一說,眾程式都怒了。

“怎麼能這樣,這也太自私了”

“你這控制程式也不管管,要你有何用?”

“趕緊想辦法啊!”

“我也沒辦法,他不執行輸入輸出,我也拿不到CPU的控制權,拿他沒有辦法啊”,控制程式嘆氣說到。

眾程式七嘴八舌,吵的是不可開交。

敏感的人類又一次發現了這個問題,好一通研究,搞了一個叫“中斷”的技術出來:可以給CPU傳送中斷訊號,CPU收到訊號後,就得停下手頭的工作,轉而執行控制程式處理中斷訊號,這樣控制程式就有辦法獲得控制權了!

為了能夠讓控制程式及時獲得控制權,人類搞了一箇中斷源,週期性的給CPU傳送中斷訊號,並把這叫做時鐘中斷

升級後的控制程式又上崗開始工作了,眾程式聞風而來。

“大哥,聽說你又升級了,這一次改了啥,可以搞定死迴圈的程式嗎?”,一個程式問道。

“大家排好隊,聽好了,現在按照時間片來劃分了,每個程式一次只有一小段時間,時間一用完我就得請他出來,讓別的程式來了”

“那要是時間到了,我還沒執行完可咋辦呢?”

“大家不用擔心,都是輪著來的,等下一輪又有機會執行了”,控制程式解釋道。

“我們這麼多程式,輪到下一輪,那不得等好久”

“這臺計算機從裡到外都升級過了,別看它個頭變小了,裡面都是大規模積體電路了,執行速度可比之前的大塊頭快了不少,每秒能執行幾十萬次運算呢~你們還沒感覺到就轉了一圈回來了”

眾程式聽後一片譁然,“幾十萬,我的乖乖!這也太快了,快讓我們體驗一下”

說完,大家都摩拳擦掌排好隊,準備登上這臺升級後的計算機執行。

果不其然,這升級後的計算機跑起來那叫一個快,有了時鐘中斷,控制程式總能按時獲得CPU的控制權,在背後默默控制著程式們的執行,眾程式絲毫感覺不到自己曾經停止過。

狀態

不過,計算機速度雖然變快了,但慕名而來的程式也更多了,這些程式的功能也越來越複雜。

漸漸的,程式們不再滿足於現狀,開始出現了新的問題。

有些程式在sleep,有些程式在同步等待,白白浪費了時間片,大夥向控制程式提出了抗議,控制程式卻說對待所有程式要一視同仁,要講公平,大夥當面不敢說,背後卻罵他不作為。

控制程式把這個問題反饋給了人類,聰明的工程師又開始琢磨:所有程式都排成一個隊來輪轉確實有些欠妥,得給這些程式劃分成不同的狀態,只有準備就緒的程式才有資格執行。

人類一口氣搞了好些個任務狀態出來,建立、就緒、執行、阻塞、終止···

控制程式一下變得複雜起來,原來只要挨個傳喚執行就行,現在還得記錄他們的狀態,選擇合適狀態的程式來執行,工作量增加了不少。

優先順序

本以為這麼一改,大家就會滿意了,沒想到有幾個老油條私下找到控制程式:“老哥,我們們幾個程式對實時性要求比較高,能不能給我們們整個VIP佇列,別跟他們一起排,優先執行我們?”

控制程式一聽臉都綠了,斷然拒絕。

其中有一個傢伙說到:“我們幾個程式可是非常重要的,要是延誤了時間,你能擔待的起嗎?”

沒辦法,控制程式只能再次反饋給人類。工程師一想,倒也是,所有程式都是同樣的優先順序,確實太草率了。

工程師再一次升級了控制程式,這一次,不僅劃分了任務狀態,還設定了不同的優先順序,劃分了不同的隊伍,讓程式們去各自優先順序所在的隊伍排隊,優先執行高優先順序的程式。

不僅如此,如果有高優先順序的程式出現,即使低優先順序程式的時間片還沒用完,也會被剝奪執行機會,工程師把這叫做搶佔

不過,這一次的改動,控制程式把大傢伙都蒙在了鼓裡,要是知道他們還被劃分了三六九等,估計得鬧翻天。

經過這一輪改動,大家總算過了一段清靜日子。

多核時代

硬體技術發展的太快了,有一天,人類激動的告訴控制程式:現在CPU裡面有多個核心了,可以真正同時執行多個程式了,我們決定再次對你升級!

可對於控制程式來說,這可不是什麼好訊息,本來一個核的程式排程管理已經讓他夠忙活的了,現在來了多個核,這排程管理任務就更復雜了。原來只是多個優先順序的佇列,現在每個核都得搞一套,真是想想都頭大了。

人類開始對控制程式大動手術,把它變得越來越複雜,功能也越來越強大。

最後,還給他取了一個新的名字:作業系統

【完】

PS:故事歸故事,作業系統這個名字可不是多核以後才出現的哦。

另外,現代作業系統更加複雜,狀態、搶佔、優先順序、動態優先順序、動態時間片、親和性各種因素交織在一起,綜合排程,還有多種排程演算法並存。

相關文章