這是操作系統(tǒng)系列第 1 篇。
盡管操作系統(tǒng)發(fā)展史不是研究操作系統(tǒng)的重點(diǎn)柑土,但是在這一發(fā)展過程中慢哈,衍生出了許許多多與操作系統(tǒng)相關(guān)的重要概念,如果知道這些概念出現(xiàn)在怎樣的背景下姿现,以及產(chǎn)生的原因肠仪,在后期學(xué)習(xí)中就不會(huì)覺得一些概念出現(xiàn)的比較突兀。除此之外备典,了解操作系統(tǒng)的發(fā)展史异旧,理解設(shè)計(jì)需求,有助于我們站在計(jì)算機(jī)的角度思考問題提佣。
ENIAC 與串行處理
計(jì)算機(jī)的發(fā)展可以追溯到 1946 年吮蛹,世界上第一臺(tái)通用計(jì)算機(jī)「ENIAC」 誕生在這一年的 2 月14 日(這天正好是情人節(jié))。
圖為 ENIAC
ENIAC 長(zhǎng) 30.48 米拌屏,寬 6 米潮针,高 2.4 米,占地面積約 170 平方米倚喂,30 個(gè)操作臺(tái)每篷,重達(dá) 30 英噸,耗電量 150 千瓦端圈,造價(jià) 48 萬美元焦读。
從這一年一直到 20 世紀(jì) 50 年代中期,操作系統(tǒng)是不存在的舱权。畢竟那時(shí)候還沒有操作系統(tǒng)這個(gè)概念矗晃。程序員要是想要運(yùn)行什么程序,得把機(jī)器代碼用打孔機(jī)打在紙帶上(這不僅是個(gè)智力活宴倍,還是個(gè)要細(xì)心的活兒张症,打錯(cuò)一個(gè)孔你就得重來。想象一下鸵贬,讓你寫一篇文章俗他,不用退格鍵,更不能從中間插入阔逼。拯辙。。當(dāng)時(shí)的程序員太難了),然后通過輸入設(shè)備涯保,比如紙帶閱讀機(jī)诉濒,載入計(jì)算機(jī)。計(jì)算機(jī)就按照步驟一步步運(yùn)行下去夕春。運(yùn)行完畢未荒,就把結(jié)果打印出來。
<u>PS:這十幾年間及志,編程語(yǔ)言也有很大發(fā)展片排,這一階段后期就已經(jīng)有高級(jí)語(yǔ)言——FORTRAN 了。編譯速侈,鏈接率寡,函數(shù)庫(kù)這些概念也已經(jīng)實(shí)現(xiàn)。所以這一時(shí)間段的計(jì)算機(jī)不是你想象的那么落后倚搬!</u>
這個(gè)時(shí)期冶共,用戶如果有上機(jī)需求,就要提前預(yù)約一個(gè)時(shí)間段每界,然后才能去上機(jī)(往機(jī)器里放紙帶和控制機(jī)器的活也是他們自己來干捅僵。當(dāng)個(gè)程序員你還得和硬件打交道)。這樣的模式下眨层,問題出現(xiàn)了:
- 如果用戶申請(qǐng)了 1 個(gè)小時(shí)庙楚,但他的任務(wù)只用 35 分鐘就運(yùn)行完了,那多出來的 25 分鐘就這么被浪費(fèi)掉了趴樱。
- 如果一個(gè)小時(shí)到了馒闷,用戶的程序還沒運(yùn)行完,這個(gè)程序就會(huì)被強(qiáng)制停止——這相當(dāng)于浪費(fèi)了整整一個(gè)小時(shí)的計(jì)算資源叁征。但延長(zhǎng)時(shí)間是不可能的纳账,后邊還有人排隊(duì)呢,而且萬一是你的程序死循環(huán)了咋辦航揉。
簡(jiǎn)單批處理系統(tǒng)
在計(jì)算資源匱乏的當(dāng)時(shí)塞祈,上面那種串行處理造成了巨大的資源浪費(fèi)金刁,令科學(xué)家們難以接受——必須要提高計(jì)算機(jī)的利用率帅涂。
于是,批處理系統(tǒng)誕生了尤蛮。
圖為 IBM 7090媳友,其上運(yùn)行著最為著名的批處理系統(tǒng) IBSYS 。這也是世界上第一款全晶體管計(jì)算機(jī)
批處理系統(tǒng)的中心思想就是用一個(gè)稱為監(jiān)控程序(monitor)的軟件产捞。剛剛提到了醇锚,串行處理需要用戶自己去訪問機(jī)器,時(shí)間段是固定的,但現(xiàn)在他們只需要把作業(yè)提交給計(jì)算機(jī)操作員焊唬,操作員會(huì)把這些作業(yè)按順序組織成一批恋昼,然后把整個(gè)批作業(yè)放在輸入設(shè)備上,供監(jiān)控程序使用赶促。
監(jiān)控程序已經(jīng)有點(diǎn)操作系統(tǒng)的意思了液肌,它的的工作過程很好理解:
大部分監(jiān)控程序總是常駐內(nèi)存,這部分稱為常駐監(jiān)控程序(resident monitor)鸥滨。
一開始嗦哆,監(jiān)控程序掌握了計(jì)算機(jī)的控制權(quán)(廢話,這時(shí)候用戶作業(yè)還沒加載進(jìn)來呢)婿滓,它會(huì)從輸入設(shè)備中讀取一個(gè)作業(yè)老速,經(jīng)過讀入以后,作業(yè)就被放置在了用戶程序區(qū)域凸主,并且獲得控制權(quán)橘券。當(dāng)作業(yè)完成后,控制權(quán)將再次返回給監(jiān)控程序秕铛。
有了監(jiān)控程序后约郁,計(jì)算機(jī)的利用率提升了——一道作業(yè)完成后立馬就會(huì)開始下一道作業(yè),沒有任何空閑時(shí)間但两,也很少出現(xiàn)作業(yè)沒完成就被終止的情況(基本上解決了串行處理的問題)鬓梅。
監(jiān)控程序的正確運(yùn)行是依賴于硬件的,在這個(gè)時(shí)期谨湘,為了系統(tǒng)的可靠性绽快,計(jì)算機(jī)廠商為計(jì)算機(jī)提供了幾樣重要的功能:
- 內(nèi)存保護(hù):這一點(diǎn)很好理解,監(jiān)控程序的內(nèi)存空間不能被用戶程序隨意更改——不管是有意還是無意紧阔。不過當(dāng)時(shí)黑客這一群體還沒有發(fā)展坊罢,畢竟計(jì)算機(jī)又少又貴,不可能「飛入尋常百姓家」擅耽。一旦硬件檢測(cè)到有用戶程序試圖使壞活孩,就會(huì)將控制權(quán)直接轉(zhuǎn)移給監(jiān)控程序,取消這個(gè)作業(yè)乖仇。
- 定時(shí)器:這項(xiàng)功能是為了防止一個(gè)作業(yè)獨(dú)占系統(tǒng)憾儒,作業(yè)接管控制權(quán)后定時(shí)器自動(dòng)打開。如果定時(shí)器時(shí)間到了而作業(yè)未運(yùn)行完乃沙,程序會(huì)被殺掉起趾。
- 特權(quán)指令:有的機(jī)器指令會(huì)被設(shè)置成特權(quán)指令(比如 I/O 指令),只能由監(jiān)控程序執(zhí)行警儒。用戶程序是不能直接使用這些指令的训裆。當(dāng)然用戶程序可以請(qǐng)求監(jiān)控程序?yàn)樽约簣?zhí)行這個(gè)操作。特權(quán)指令就是為了限制用戶程序的「權(quán)力」而設(shè)置的,畢竟老板和員工不可能有一樣的話語(yǔ)權(quán)边琉。
監(jiān)控程序的內(nèi)存布局属百,藍(lán)色部分就是受保護(hù)的內(nèi)存區(qū)域
這幾種功能里,內(nèi)存保護(hù)和特權(quán)指令引入了操作模式的概念变姨,我們知道诸老,現(xiàn)代操作系統(tǒng)中依然保留這兩種功能——足以見得他們的地位。
簡(jiǎn)單批處理系統(tǒng)已經(jīng)具備了基本的任務(wù)調(diào)度能力钳恕,但它仍有很大的改進(jìn)空間别伏。雖然簡(jiǎn)單批處理系統(tǒng)為機(jī)器提供了一個(gè)自動(dòng)作業(yè)序列,但處理器經(jīng)常還是空閑的忧额,因?yàn)?I/O 設(shè)備相對(duì)于處理器的速度要慢很多厘肮,處理器需要 I/O 操作完成后才能接著干活。
舉個(gè)例子:
CPU 利用率 = 1/31 = 3.2%
CPU 的利用率太低了睦番。有什么辦法解決這個(gè)問題呢类茂?
多道批處理系統(tǒng)
IBM System360,搭載了多道批處理操作系統(tǒng) OS/360托嚣,公認(rèn)的劃時(shí)代操作系統(tǒng)
我們剛剛說了巩检,利用率低的主要原因就是 CPU 需要等待 I/O 操作,那我們讓 CPU 忙起來不就可以了?
多道批處理系統(tǒng)就是讓 CPU 忙起來的秘訣示启。方法聽起來很簡(jiǎn)單——在內(nèi)存里多放幾道用戶程序兢哭,一旦有一個(gè)作業(yè)需要等待 I/O ,就立刻切換另一個(gè)可能不需要等待 I/O 的作業(yè)夫嗓。這種處理迟螺,稱為多道程序設(shè)計(jì)(multiprogramming)或多任務(wù)處理(multitasking)。
我們來看看這種方法是怎么提高 CPU 利用率的:
- 圖 a :僅有程序 A 在運(yùn)行
- 圖 b :內(nèi)存上有用戶程序 A 和 B 舍咖,當(dāng) A 在等待 I/O 操作時(shí)矩父,B 就開始運(yùn)行。(為方便理解排霉,我們假設(shè) A, B 兩程序競(jìng)爭(zhēng)的 IO 資源是不一樣的)
- 圖 c :用戶程序 A窍株,B,C 同時(shí)存儲(chǔ)在內(nèi)存上攻柠。
我們可以直觀的看到球订,在同樣的時(shí)間內(nèi),CPU 運(yùn)行時(shí)間大大提升辙诞,滿足了我們的預(yù)期辙售。
像簡(jiǎn)單批處理系統(tǒng)一樣轻抱,多道程序批處理系統(tǒng)必須依賴于某些計(jì)算機(jī)硬件功能飞涂。其中最顯著的功能就是支持 I/O 中斷(Interrupt)和直接存儲(chǔ)器訪問(Direct Memory Access,DMA)。(DMA 也需要中斷的支持)
中斷這個(gè)詞较店,第一次聽會(huì)感覺有點(diǎn)玄乎士八,如果翻譯成「打斷」感覺會(huì)好理解一點(diǎn)(就是不大好聽)。當(dāng)一個(gè)作業(yè)開始進(jìn)行 I/O 操作時(shí)梁呈,CPU 就會(huì)切換到另一項(xiàng)作業(yè)婚度,那操作系統(tǒng)怎么知道這個(gè) I/O 操作什么時(shí)候結(jié)束呢?
答案就是 I/O 中斷官卡,在 I/O 操作結(jié)束后蝗茁,DMA 模塊(哪種模塊具體取決于系統(tǒng)實(shí)現(xiàn))就會(huì)向 CPU 發(fā)送一個(gè)信號(hào),CPU 就必須停下當(dāng)前的事情去處理這個(gè)信號(hào)寻咒,在多道批處理系統(tǒng)里表現(xiàn)為控制權(quán)被轉(zhuǎn)移到操作系統(tǒng)的中斷處理程序哮翘。這個(gè)過程,就是 I/O 設(shè)備打斷(Interrupt)了 CPU 手頭上的事情毛秘,轉(zhuǎn)而去做另一件事饭寺。
所以說中斷是操作系統(tǒng)完成各種復(fù)雜操作的前提。
多道批處理系統(tǒng)顯然比他的前輩們復(fù)雜多了叫挟,由這個(gè)操作系統(tǒng)艰匙,又引申出來了幾個(gè)比較有意思的話題:
- 作業(yè)管理:內(nèi)存的空間是有限的,意味著一次性載入到內(nèi)存的程序數(shù)量也是有限的抹恳,那么怎樣從備選作業(yè)里選擇合適的作業(yè)加載進(jìn)內(nèi)存就是一個(gè)問題员凝,這就是就是作業(yè)管理。
- 內(nèi)存管理:選擇了作業(yè)奋献,就需要為作業(yè)分配空間绊序,那從空閑區(qū)的哪一部分為作業(yè)劃空間就是內(nèi)存管理需要解決的事情。
- 進(jìn)程調(diào)度:進(jìn)程秽荞,就是進(jìn)行中的程序骤公,一般我們把加載進(jìn)內(nèi)存的作業(yè)稱為進(jìn)程,以和未加載的作業(yè)區(qū)分扬跋。進(jìn)程調(diào)度阶捆,就是當(dāng)需要進(jìn)行進(jìn)程切換時(shí),通過某一種算法從進(jìn)程隊(duì)列中取出合適的進(jìn)程钦听,獲得 CPU 的執(zhí)行洒试。
到了現(xiàn)代,因?yàn)閮?nèi)存容量的提升朴上,很少出現(xiàn)有作業(yè)需要在后臺(tái)排隊(duì)的情況垒棋,所以作業(yè)管理以后只會(huì)花少量筆墨來介紹。但內(nèi)存管理和進(jìn)程調(diào)度將是我們以后學(xué)習(xí)的重點(diǎn)痪宰。
分時(shí)系統(tǒng)
UNIX 就是最為著名的分時(shí)操作系統(tǒng)
多道批處理系統(tǒng)可以說是現(xiàn)代操作系統(tǒng)的雛形了叼架,它處理批作業(yè)時(shí)對(duì)處理器的利用率也比較令人滿意畔裕,但面對(duì)多個(gè)交互作業(yè),多道批處理系統(tǒng)就顯得力不從心了乖订。
交互作業(yè)的出現(xiàn)很好理解扮饶,畢竟我們現(xiàn)在幾乎所有應(yīng)用程序都是交互式的,你滑動(dòng)屏幕乍构,這篇文章就會(huì)上下滑動(dòng)甜无,點(diǎn)一個(gè)分享,就會(huì)出現(xiàn)各種選項(xiàng)哥遮,等等等等岂丘。
在交互作業(yè)中,難免需要等待用戶做出操作眠饮,但又不可能讓處理器停下來等你一個(gè)人元潘,畢竟很多人都在用同一臺(tái)計(jì)算機(jī),因此分時(shí)系統(tǒng)應(yīng)運(yùn)而生君仆。
顧名思義翩概,分時(shí)系統(tǒng)就是 n 個(gè)用戶作業(yè),操作系統(tǒng)控制每個(gè)用戶程序以很短的時(shí)間為單位交替執(zhí)行返咱。因?yàn)槿说姆磻?yīng)相對(duì)機(jī)器要慢很多钥庇,所以如果控制得當(dāng),你會(huì)感覺自己是獨(dú)占了這一臺(tái)計(jì)算機(jī)一樣咖摹。
多提一句评姨,分時(shí)系統(tǒng)切換進(jìn)程靠的就是我們?cè)谂幚硐到y(tǒng)中強(qiáng)調(diào)的中斷,不一樣的是萤晴,這里的中斷是時(shí)鐘中斷——一到時(shí)間就向 CPU 發(fā)出中斷信號(hào)吐句。
如果把多個(gè)用戶運(yùn)行的交互程序,看做一個(gè)用戶運(yùn)行的多個(gè)交互程序店读,像我們現(xiàn)在使用個(gè)人計(jì)算機(jī)一樣嗦枢,就很容易理解現(xiàn)代操作系統(tǒng)了:
- 多個(gè)進(jìn)程共用一個(gè)處理器,每個(gè)進(jìn)程分得一個(gè)時(shí)間片屯断,而在計(jì)算機(jī)面前的你看來文虏,好像多個(gè)進(jìn)程是并行的。
- 某進(jìn)程進(jìn)行 I/O 操作會(huì)被操作系統(tǒng)阻塞殖演,在阻塞隊(duì)列等待 I/O 操作結(jié)束氧秘,才能有機(jī)會(huì)使用 CPU。
- 多個(gè)進(jìn)程在內(nèi)存上存儲(chǔ)趴久,操作系統(tǒng)需要防止進(jìn)程向其他進(jìn)程的內(nèi)存空間寫入信息丸相。尤其要保護(hù)操作系統(tǒng)自身的內(nèi)存空間。
- 用戶程序運(yùn)行在用戶態(tài)彼棍,無權(quán)使用特權(quán)指令灭忠,需要向操作系統(tǒng)提出請(qǐng)求膳算。
講到這,我們已經(jīng)了解了操作系統(tǒng)的發(fā)展更舞,事實(shí)上,還有一些其他的操作系統(tǒng)坎吻,比如實(shí)時(shí)操作系統(tǒng)缆蝉,網(wǎng)絡(luò)操作系統(tǒng),分布式操作系統(tǒng)等等瘦真,但這些操作系統(tǒng)與我們生活相關(guān)性不大(實(shí)時(shí)操作系統(tǒng)對(duì)嵌入式來說還是很重要的)刊头,所以在此文略過,有興趣的可以查閱相關(guān)資料诸尽。
希望在閱讀完這篇文章之后原杂,你能夠?qū)Σ僮飨到y(tǒng)的設(shè)計(jì)理念有一個(gè)簡(jiǎn)單的印象,如果本文引起了你對(duì)操作系統(tǒng)的興趣您机,那就再好不過了穿肄。
感謝你的閱讀,我們后會(huì)有期际看!
聲明:原創(chuàng)文章咸产,未經(jīng)授權(quán),禁止轉(zhuǎn)載