很久很久以前,有一台神奇的機器···
計算機
很久很久以前,有一台機器,體型巨大,每秒鐘可以進行幾千次的加法運算,名震一時,人類給它取了個名字:計算機。
除了加法,它還能計算平方、立方、正弦、餘弦,比人類的大腦算得快多了。
許多程序慕名而來,想在它上面運行一下,體會這飛一般的感覺。
“來來來,排好隊,一個一個來”,計算機的管理員説到。
眾程序挨個排好隊,等待管理員傳喚。
執行完一個,管理員再將其取出,換上下一個開始執行。
久而久之,程序們紛紛抱怨:排隊十分鐘,執行三秒鐘。人類管理員太慢了,時間都用在排隊上了,能不能讓計算機自動完成程序切換,不要手動切換?
人工操作的速度比起計算機實在是慢太多了,人機矛盾日益凸顯,人類決定對機器重新進行設計,並且開發了一個控制程序,在它的指揮下,可以批量執行程序,自動實現切換,不用再需要人工介入了,效率提高了不少。
多道程序處理
慕名而來的程序越來越多了,等待執行的隊伍排的越來越長。
有些程序等的不耐煩了,詢問控制程序:“大哥,你看前面那傢伙在做輸入輸出,CPU給空出來了,一時半會兒用不上,這不是浪費嗎,要不叫下一個上去執行吧”
控制程序皺着眉頭説到:“那怎麼行,前面程序執行的數據都在內存裏放着了,再放程序進去,要是弄壞了誰負責?再説CPU只有一個,前面的程序忙完輸入輸出回來了又該如何處理?”
大家一時語塞,誰也給不出主意,紛紛歎氣,只好作罷,繼續等待。
不過聰明的人類倒是發現了這問題:讓一個程序獨佔計算機確實浪費資源,執行輸入輸出的時候,CPU就空着了,執行計算操作的時候,輸入輸出設備又閒着了,總有一個閒着。
於是人類又重新設計了計算機,並開發了新版的控制程序,這一次,允許多個程序同時進入計算機執行了。
如果程序A執行輸入輸出,就把CPU空出來讓給另一個程序B執行,一會兒B再執行輸入輸出,再把CPU分給A執行,彼此交替,這樣一來就不會浪費了!
時間分片
不過沒多久,又出現了新的問題。
這一天,其他程序都在排隊等待控制程序翻牌子,可左等右等也不見傳喚,眾程序急了,質問控制程序,控制程序大倒苦水:“前面那個傢伙寫了個死循環,死活結束不了啊!”
聽他這麼一説,眾程序都怒了。
“怎麼能這樣,這也太自私了”
“你這控制程序也不管管,要你有何用?”
“趕緊想辦法啊!”
“我也沒辦法,他不執行輸入輸出,我也拿不到CPU的控制權,拿他沒有辦法啊”,控制程序歎氣説到。
眾程序七嘴八舌,吵的是不可開交。
敏感的人類又一次發現了這個問題,好一通研究,搞了一個叫“中斷”的技術出來:可以給CPU發送中斷信號,CPU收到信號後,就得停下手頭的工作,轉而執行控制程序處理中斷信號,這樣控制程序就有辦法獲得控制權了!
為了能夠讓控制程序及時獲得控制權,人類搞了一箇中斷源,週期性的給CPU發送中斷信號,並把這叫做時鐘中斷。
升級後的控制程序又上崗開始工作了,眾程序聞風而來。
“大哥,聽説你又升級了,這一次改了啥,可以搞定死循環的程序嗎?”,一個程序問道。
“大家排好隊,聽好了,現在按照時間片來劃分了,每個程序一次只有一小段時間,時間一用完我就得請他出來,讓別的程序來了”
“那要是時間到了,我還沒執行完可咋辦呢?”
“大家不用擔心,都是輪着來的,等下一輪又有機會執行了”,控制程序解釋道。
“我們這麼多程序,輪到下一輪,那不得等好久”
“這台計算機從裏到外都升級過了,別看它個頭變小了,裏面都是大規模集成電路了,執行速度可比之前的大塊頭快了不少,每秒能執行幾十萬次運算呢~你們還沒感覺到就轉了一圈回來了”
眾程序聽後一片譁然,“幾十萬,我的乖乖!這也太快了,快讓我們體驗一下”
説完,大家都摩拳擦掌排好隊,準備登上這台升級後的計算機運行。
果不其然,這升級後的計算機跑起來那叫一個快,有了時鐘中斷,控制程序總能按時獲得CPU的控制權,在背後默默控制着程序們的運行,眾程序絲毫感覺不到自己曾經停止過。
狀態
不過,計算機速度雖然變快了,但慕名而來的程序也更多了,這些程序的功能也越來越複雜。
漸漸的,程序們不再滿足於現狀,開始出現了新的問題。
有些程序在sleep,有些程序在同步等待,白白浪費了時間片,大夥向控制程序提出了抗議,控制程序卻説對待所有程序要一視同仁,要講公平,大夥當面不敢説,背後卻罵他不作為。
控制程序把這個問題反饋給了人類,聰明的工程師又開始琢磨:所有程序都排成一個隊來輪轉確實有些欠妥,得給這些程序劃分成不同的狀態,只有準備就緒的程序才有資格執行。
人類一口氣搞了好些個任務狀態出來,創建、就緒、運行、阻塞、終止···
控制程序一下變得複雜起來,原來只要挨個傳喚執行就行,現在還得記錄他們的狀態,選擇合適狀態的程序來運行,工作量增加了不少。
優先級
本以為這麼一改,大家就會滿意了,沒想到有幾個老油條私下找到控制程序:“老哥,咱們幾個程序對實時性要求比較高,能不能給咱們整個VIP隊列,別跟他們一起排,優先執行我們?”
控制程序一聽臉都綠了,斷然拒絕。
其中有一個傢伙説到:“我們幾個程序可是非常重要的,要是延誤了時間,你能擔待的起嗎?”
沒辦法,控制程序只能再次反饋給人類。工程師一想,倒也是,所有程序都是同樣的優先級,確實太草率了。
工程師再一次升級了控制程序,這一次,不僅劃分了任務狀態,還設定了不同的優先級,劃分了不同的隊伍,讓程序們去各自優先級所在的隊伍排隊,優先執行高優先級的程序。
不僅如此,如果有高優先級的程序出現,即使低優先級程序的時間片還沒用完,也會被剝奪執行機會,工程師把這叫做搶佔。
不過,這一次的改動,控制程序把大傢伙都蒙在了鼓裏,要是知道他們還被劃分了三六九等,估計得鬧翻天。
經過這一輪改動,大家總算過了一段清靜日子。
多核時代
硬件技術發展的太快了,有一天,人類激動的告訴控制程序:現在CPU裏面有多個核心了,可以真正同時執行多個程序了,我們決定再次對你升級!
可對於控制程序來説,這可不是什麼好消息,本來一個核的程序調度管理已經讓他夠忙活的了,現在來了多個核,這調度管理任務就更復雜了。原來只是多個優先級的隊列,現在每個核都得搞一套,真是想想都頭大了。
人類開始對控制程序大動手術,把它變得越來越複雜,功能也越來越強大。
最後,還給他取了一個新的名字:操作系統。
- Spring中實現異步調用的方式有哪些?
- 帶參數的全類型 Python 裝飾器
- 整理了幾個Python正則表達式,拿走就能用!
- 設計模式之狀態模式
- 如何實現數據庫讀一致性
- SOLID:開閉原則Go代碼實戰
- React中如何引入CSS呢
- 慢查詢 MySQL 定位優化技巧,從10s優化到300ms
- 一個新視角:前端框架們都卷錯方向了?
- 編碼中的Adapter,不僅是一種設計模式,更是一種架構理念與解決方案
- 手寫編程語言-遞歸函數是如何實現的?
- 一文搞懂模糊匹配:定義、過程與技術
- 新來個阿里 P7,僅花 2 小時,做出一個多線程永動任務,看完直接跪了
- Puzzlescript,一種開發H5益智遊戲的引擎
- @Autowired和@Resource到底什麼區別,你明白了嗎?
- “四招”守護個人信息安全
- CSS transition 小技巧!如何保留 hover 的狀態?
- React如此受歡迎離不開這4個主要原則
- 我是怎麼入行做風控的
- 重温三十年前對於 NN 的批判:神經網絡無法實現可解釋 AI