很久很久以前,有一臺(tái)神奇的機(jī)器···
計(jì)算機(jī)
很久很久以前,有一臺(tái)機(jī)器,體型巨大,每秒鐘可以進(jìn)行幾千次的加法運(yùn)算,名震一時(shí),人類(lèi)給它取了個(gè)名字:計(jì)算機(jī)。
除了加法,它還能計(jì)算平方、立方、正弦、余弦,比人類(lèi)的大腦算得快多了。
許多程序慕名而來(lái),想在它上面運(yùn)行一下,體會(huì)這飛一般的感覺(jué)。
“來(lái)來(lái)來(lái),排好隊(duì),一個(gè)一個(gè)來(lái)”,計(jì)算機(jī)的管理員說(shuō)到。
眾程序挨個(gè)排好隊(duì),等待管理員傳喚。
執(zhí)行完一個(gè),管理員再將其取出,換上下一個(gè)開(kāi)始執(zhí)行。
久而久之,程序們紛紛抱怨:排隊(duì)十分鐘,執(zhí)行三秒鐘。人類(lèi)管理員太慢了,時(shí)間都用在排隊(duì)上了,能不能讓計(jì)算機(jī)自動(dòng)完成程序切換,不要手動(dòng)切換?
人工操作的速度比起計(jì)算機(jī)實(shí)在是慢太多了,人機(jī)矛盾日益凸顯,人類(lèi)決定對(duì)機(jī)器重新進(jìn)行設(shè)計(jì),并且開(kāi)發(fā)了一個(gè)控制程序,在它的指揮下,可以批量執(zhí)行程序,自動(dòng)實(shí)現(xiàn)切換,不用再需要人工介入了,效率提高了不少。
多道程序處理
慕名而來(lái)的程序越來(lái)越多了,等待執(zhí)行的隊(duì)伍排的越來(lái)越長(zhǎng)。
有些程序等的不耐煩了,詢(xún)問(wèn)控制程序:“大哥,你看前面那家伙在做輸入輸出,CPU給空出來(lái)了,一時(shí)半會(huì)兒用不上,這不是浪費(fèi)嗎,要不叫下一個(gè)上去執(zhí)行吧”
控制程序皺著眉頭說(shuō)到:“那怎么行,前面程序執(zhí)行的數(shù)據(jù)都在內(nèi)存里放著了,再放程序進(jìn)去,要是弄壞了誰(shuí)負(fù)責(zé)?再說(shuō)CPU只有一個(gè),前面的程序忙完輸入輸出回來(lái)了又該如何處理?”
大家一時(shí)語(yǔ)塞,誰(shuí)也給不出主意,紛紛嘆氣,只好作罷,繼續(xù)等待。
不過(guò)聰明的人類(lèi)倒是發(fā)現(xiàn)了這問(wèn)題:讓一個(gè)程序獨(dú)占計(jì)算機(jī)確實(shí)浪費(fèi)資源,執(zhí)行輸入輸出的時(shí)候,CPU就空著了,執(zhí)行計(jì)算操作的時(shí)候,輸入輸出設(shè)備又閑著了,總有一個(gè)閑著。
于是人類(lèi)又重新設(shè)計(jì)了計(jì)算機(jī),并開(kāi)發(fā)了新版的控制程序,這一次,允許多個(gè)程序同時(shí)進(jìn)入計(jì)算機(jī)執(zhí)行了。
如果程序A執(zhí)行輸入輸出,就把CPU空出來(lái)讓給另一個(gè)程序B執(zhí)行,一會(huì)兒B再執(zhí)行輸入輸出,再把CPU分給A執(zhí)行,彼此交替,這樣一來(lái)就不會(huì)浪費(fèi)了!
時(shí)間分片
不過(guò)沒(méi)多久,又出現(xiàn)了新的問(wèn)題。
這一天,其他程序都在排隊(duì)等待控制程序翻牌子,可左等右等也不見(jiàn)傳喚,眾程序急了,質(zhì)問(wèn)控制程序,控制程序大倒苦水:“前面那個(gè)家伙寫(xiě)了個(gè)死循環(huán),死活結(jié)束不了啊!”
聽(tīng)他這么一說(shuō),眾程序都怒了。
“怎么能這樣,這也太自私了”
“你這控制程序也不管管,要你有何用?”
“趕緊想辦法啊!”
“我也沒(méi)辦法,他不執(zhí)行輸入輸出,我也拿不到CPU的控制權(quán),拿他沒(méi)有辦法啊”,控制程序嘆氣說(shuō)到。
眾程序七嘴八舌,吵的是不可開(kāi)交。
敏感的人類(lèi)又一次發(fā)現(xiàn)了這個(gè)問(wèn)題,好一通研究,搞了一個(gè)叫“中斷”的技術(shù)出來(lái):可以給CPU發(fā)送中斷信號(hào),CPU收到信號(hào)后,就得停下手頭的工作,轉(zhuǎn)而執(zhí)行控制程序處理中斷信號(hào),這樣控制程序就有辦法獲得控制權(quán)了!
為了能夠讓控制程序及時(shí)獲得控制權(quán),人類(lèi)搞了一個(gè)中斷源,周期性的給CPU發(fā)送中斷信號(hào),并把這叫做時(shí)鐘中斷。
升級(jí)后的控制程序又上崗開(kāi)始工作了,眾程序聞風(fēng)而來(lái)。
“大哥,聽(tīng)說(shuō)你又升級(jí)了,這一次改了啥,可以搞定死循環(huán)的程序嗎?”,一個(gè)程序問(wèn)道。
“大家排好隊(duì),聽(tīng)好了,現(xiàn)在按照時(shí)間片來(lái)劃分了,每個(gè)程序一次只有一小段時(shí)間,時(shí)間一用完我就得請(qǐng)他出來(lái),讓別的程序來(lái)了”
“那要是時(shí)間到了,我還沒(méi)執(zhí)行完可咋辦呢?”
“大家不用擔(dān)心,都是輪著來(lái)的,等下一輪又有機(jī)會(huì)執(zhí)行了”,控制程序解釋道。
“我們這么多程序,輪到下一輪,那不得等好久”
“這臺(tái)計(jì)算機(jī)從里到外都升級(jí)過(guò)了,別看它個(gè)頭變小了,里面都是大規(guī)模集成電路了,執(zhí)行速度可比之前的大塊頭快了不少,每秒能執(zhí)行幾十萬(wàn)次運(yùn)算呢~你們還沒(méi)感覺(jué)到就轉(zhuǎn)了一圈回來(lái)了”
眾程序聽(tīng)后一片嘩然,“幾十萬(wàn),我的乖乖!這也太快了,快讓我們體驗(yàn)一下”
說(shuō)完,大家都摩拳擦掌排好隊(duì),準(zhǔn)備登上這臺(tái)升級(jí)后的計(jì)算機(jī)運(yùn)行。
果不其然,這升級(jí)后的計(jì)算機(jī)跑起來(lái)那叫一個(gè)快,有了時(shí)鐘中斷,控制程序總能按時(shí)獲得CPU的控制權(quán),在背后默默控制著程序們的運(yùn)行,眾程序絲毫感覺(jué)不到自己曾經(jīng)停止過(guò)。
狀態(tài)
不過(guò),計(jì)算機(jī)速度雖然變快了,但慕名而來(lái)的程序也更多了,這些程序的功能也越來(lái)越復(fù)雜。
漸漸的,程序們不再滿(mǎn)足于現(xiàn)狀,開(kāi)始出現(xiàn)了新的問(wèn)題。
有些程序在sleep,有些程序在同步等待,白白浪費(fèi)了時(shí)間片,大伙向控制程序提出了抗議,控制程序卻說(shuō)對(duì)待所有程序要一視同仁,要講公平,大伙當(dāng)面不敢說(shuō),背后卻罵他不作為。
控制程序把這個(gè)問(wèn)題反饋給了人類(lèi),聰明的工程師又開(kāi)始琢磨:所有程序都排成一個(gè)隊(duì)來(lái)輪轉(zhuǎn)確實(shí)有些欠妥,得給這些程序劃分成不同的狀態(tài),只有準(zhǔn)備就緒的程序才有資格執(zhí)行。
人類(lèi)一口氣搞了好些個(gè)任務(wù)狀態(tài)出來(lái),創(chuàng)建、就緒、運(yùn)行、阻塞、終止···
控制程序一下變得復(fù)雜起來(lái),原來(lái)只要挨個(gè)傳喚執(zhí)行就行,現(xiàn)在還得記錄他們的狀態(tài),選擇合適狀態(tài)的程序來(lái)運(yùn)行,工作量增加了不少。
優(yōu)先級(jí)
本以為這么一改,大家就會(huì)滿(mǎn)意了,沒(méi)想到有幾個(gè)老油條私下找到控制程序:“老哥,咱們幾個(gè)程序?qū)?shí)時(shí)性要求比較高,能不能給咱們整個(gè)VIP隊(duì)列,別跟他們一起排,優(yōu)先執(zhí)行我們?”
控制程序一聽(tīng)臉都綠了,斷然拒絕。
其中有一個(gè)家伙說(shuō)到:“我們幾個(gè)程序可是非常重要的,要是延誤了時(shí)間,你能擔(dān)待的起嗎?”
沒(méi)辦法,控制程序只能再次反饋給人類(lèi)。工程師一想,倒也是,所有程序都是同樣的優(yōu)先級(jí),確實(shí)太草率了。
工程師再一次升級(jí)了控制程序,這一次,不僅劃分了任務(wù)狀態(tài),還設(shè)定了不同的優(yōu)先級(jí),劃分了不同的隊(duì)伍,讓程序們?nèi)ジ髯詢(xún)?yōu)先級(jí)所在的隊(duì)伍排隊(duì),優(yōu)先執(zhí)行高優(yōu)先級(jí)的程序。
不僅如此,如果有高優(yōu)先級(jí)的程序出現(xiàn),即使低優(yōu)先級(jí)程序的時(shí)間片還沒(méi)用完,也會(huì)被剝奪執(zhí)行機(jī)會(huì),工程師把這叫做搶占。
不過(guò),這一次的改動(dòng),控制程序把大家伙都蒙在了鼓里,要是知道他們還被劃分了三六九等,估計(jì)得鬧翻天。
經(jīng)過(guò)這一輪改動(dòng),大家總算過(guò)了一段清靜日子。
多核時(shí)代
硬件技術(shù)發(fā)展的太快了,有一天,人類(lèi)激動(dòng)的告訴控制程序:現(xiàn)在CPU里面有多個(gè)核心了,可以真正同時(shí)執(zhí)行多個(gè)程序了,我們決定再次對(duì)你升級(jí)!
可對(duì)于控制程序來(lái)說(shuō),這可不是什么好消息,本來(lái)一個(gè)核的程序調(diào)度管理已經(jīng)讓他夠忙活的了,現(xiàn)在來(lái)了多個(gè)核,這調(diào)度管理任務(wù)就更復(fù)雜了。原來(lái)只是多個(gè)優(yōu)先級(jí)的隊(duì)列,現(xiàn)在每個(gè)核都得搞一套,真是想想都頭大了。
人類(lèi)開(kāi)始對(duì)控制程序大動(dòng)手術(shù),把它變得越來(lái)越復(fù)雜,功能也越來(lái)越強(qiáng)大。
最后,還給他取了一個(gè)新的名字:操作系統(tǒng)。
本文轉(zhuǎn)載自微信公眾號(hào)「編程技術(shù)宇宙」,可以通過(guò)以下二維碼關(guān)注。轉(zhuǎn)載本文請(qǐng)聯(lián)系編程技術(shù)宇宙公眾號(hào)。