操做系統學習(一)-- 從發展史理解操做系統設計需求

這是操做系統系列第 1 篇。程序員

儘管操做系統發展史不是研究操做系統的重點,可是在這一發展過程當中,衍生出了許許多多與操做系統相關的重要概念,若是知道這些概念出如今怎樣的背景下,以及產生的緣由,在後期學習中就不會以爲一些概念出現的比較突兀。除此以外,瞭解操做系統的發展史,理解設計需求,有助於咱們站在計算機的角度思考問題。算法

ENIAC 與串行處理

計算機的發展能夠追溯到 1946 年,世界上第一臺通用計算機「ENIAC」 誕生在這一年的 2 月14 日(這天正好是情人節)。編程

ENVAC

圖爲 ENIAC網絡

> ENIAC 長 30.48 米,寬 6 米,高 2.4 米,佔地面積約 170 平方米,30 個操做臺,重達 30 英噸,耗電量 150 千瓦,造價 48 萬美圓。編程語言

從這一年一直到 20 世紀 50 年代中期,操做系統是不存在的。畢竟那時候尚未操做系統這個概念。程序員要是想要運行什麼程序,得把機器代碼用打孔機打在紙帶上(這不只是個智力活,仍是個要細心的活兒,打錯一個孔你就得重來。想象一下,讓你寫一篇文章,不用退格鍵,更不能從中間插入。。。當時的程序員太難了),而後經過輸入設備,好比紙帶閱讀機,載入計算機。計算機就按照步驟一步步運行下去。運行完畢,就把結果打印出來。分佈式

PS:這十幾年間,編程語言也有很大的發展,這一階段後期就已經有高級語言——FORTRAN 了。編譯連接函數庫這些概念也已經實現。因此這一時間段的計算機不是你想象的那麼落後!ide

這個時期,用戶若是有上機需求,就要提早預定一個時間段,而後才能去上機(往機器裏放紙帶和控制機器的活也是他們本身來幹。當個程序員你還得和硬件打交道)。這樣的模式下,問題出現了:函數

  • 若是用戶申請了 1 個小時,但他的任務只用 35 分鐘就運行完了,那多出來的 25 分鐘就這麼被浪費掉了。
  • 若是一個小時到了,用戶的程序還沒運行完,這個程序就會被強制中止——這至關於浪費了整整一個小時的計算資源。但延長時間是不可能的,後邊還有人排隊呢,並且萬一是你的程序死循環了咋辦。

簡單批處理系統

計算資源匱乏的當時,上面那種串行處理形成了巨大的資源浪費,令科學家們難以接受——必需要提升計算機的利用率。佈局

因而,批處理系統誕生了。學習

IBM7090

圖爲 IBM 7090,其上運行着最爲著名的批處理系統 IBSYS 。這也是世界上第一款全晶體管計算機

批處理系統的中心思想就是用一個稱爲監控程序(monitor)的軟件。剛剛提到了,串行處理須要用戶本身去訪問機器,時間段是固定的,但如今他們只須要把做業提交給計算機操做員,操做員會把這些做業按順序組織成一批,而後把整個批做業放在輸入設備上,供監控程序使用。

監控程序已經有點操做系統的意思了,它的的工做過程很好理解:

  • 大部分監控程序老是常駐內存,這部分稱爲常駐監控程序(resident monitor)。

  • 一開始,監控程序掌握了計算機的控制權(廢話,這時候用戶做業還沒加載進來呢),它會從輸入設備中讀取一個做業,通過讀入之後,做業就被放置在了用戶程序區域,而且得到控制權。看成業完成後,控制權將再次返回給監控程序。

有了監控程序後,計算機的利用率提高了——一道做業完成後立馬就會開始下一道做業,沒有任何空閒時間,也不多出現做業沒完成就被終止的狀況(基本上解決了串行處理的問題)。

監控程序的正確運行是依賴於硬件的,在這個時期,爲了系統的可靠性,計算機廠商爲計算機提供了幾樣重要的功能:

  • 內存保護:這一點很好理解,監控程序的內存空間不能被用戶程序隨意更改——無論是有意仍是無心。*不過當時黑客這一羣體尚未發展,畢竟計算機又少又貴,不可能「飛入尋常百姓家」。*一旦硬件檢測到有用戶程序試圖使壞,就會將控制權直接轉移給監控程序,取消這個做業。
  • 定時器:這項功能是爲了防止一個做業獨佔系統,做業接管控制權後定時器自動打開。若是定時器時間到了而做業未運行完,程序會被殺掉。
  • 特權指令:有的機器指令會被設置成特權指令(好比 I/O 指令),只能由監控程序執行。用戶程序是不能直接使用這些指令的。固然用戶程序能夠請求監控程序爲本身執行這個操做。特權指令就是爲了限制用戶程序的「權力」而設置的,畢竟老闆和員工不可能有同樣的話語權。

監控程序內存佈局

監控程序的內存佈局,藍色部分就是受保護的內存區域

這幾種功能裏,內存保護特權指令引入了操做模式的概念,咱們知道,現代操做系統中依然保留這兩種功能——足以見得他們的地位。

簡單批處理系統已經具有了基本的任務調度能力,但它仍有很大的改進空間。雖然簡單批處理系統爲機器提供了一個自動做業序列,但處理器常常仍是空閒的,由於 I/O 設備相對於處理器的速度要慢不少,處理器須要 I/O 操做完成後才能接着幹活。

舉個例子:

簡單批處理系統CPU利用率

CPU 利用率 = 1/31 = 3.2%

CPU 的利用率過低了。有什麼辦法解決這個問題呢?

多道批處理系統

IBM_system360

IBM System360,搭載了多道批處理操做系統 OS/360,公認的劃時代操做系統

咱們剛剛說了,利用率低的主要緣由就是 CPU 須要等待 I/O 操做,那咱們讓 CPU 忙起來不就能夠了?

多道批處理系統就是讓 CPU 忙起來的祕訣。方法聽起來很簡單——在內存裏多放幾道用戶程序,一旦有一個做業須要等待 I/O ,就馬上切換另外一個可能不須要等待 I/O 的做業。這種處理,稱爲多道程序設計(multiprogramming)或多任務處理(multitasking)。

咱們來看看這種方法是怎麼提升 CPU 利用率的:

  • 圖 a :僅有程序 A 在運行

    多道批處理_一個程序

  • 圖 b :內存上有用戶程序 A 和 B ,當 A 在等待 I/O 操做時,B 就開始運行。(爲方便理解,咱們假設 A, B 兩程序競爭的 IO 資源是不同的)

    多道批處理_兩個程序

  • 圖 c :用戶程序 A,B,C 同時存儲在內存上。

    多道批處理_三個程序

咱們能夠直觀的看到,在一樣的時間內,CPU 運行時間大大提高,知足了咱們的預期。

像簡單批處理系統同樣,多道程序批處理系統必須依賴於某些計算機硬件功能。其中最顯著的功能就是支持 I/O 中斷(Interrupt)和直接存儲器訪問(Direct Memory Access,DMA)。(DMA 也須要中斷的支持)

中斷這個詞,第一次聽會感受有點玄乎,若是翻譯成「打斷」感受會好理解一點(就是不大好聽)。當一個做業開始進行 I/O 操做時,CPU 就會切換到另外一項做業,那操做系統怎麼知道這個 I/O 操做何時結束呢?

答案就是 I/O 中斷,在 I/O 操做結束後,DMA 模塊(哪一種模塊具體取決於系統實現)就會向 CPU 發送一個信號,CPU 就必須停下當前的事情去處理這個信號,在多道批處理系統裏表現爲控制權被轉移到操做系統的中斷處理程序。這個過程,就是 I/O 設備打斷(Interrupt)了 CPU 手頭上的事情,轉而去作另外一件事。

因此說中斷是操做系統完成各類複雜操做的前提。

多道批處理系統顯然比他的前輩們複雜多了,由這個操做系統,又引伸出來了幾個比較有意思的話題:

  • 做業管理:內存的空間是有限的,意味着一次性載入到內存的程序數量也是有限的,那麼怎樣從備選做業裏選擇合適的做業加載進內存就是一個問題,這就是就是做業管理。
  • 內存管理:選擇了做業,就須要爲做業分配空間,那從空閒區的哪一部分爲做業劃空間就是內存管理須要解決的事情。
  • 進程調度:進程,就是進行中的程序,通常咱們把加載進內存的做業稱爲進程,以和未加載的做業區分。進程調度,就是當須要進行進程切換時,經過某一種算法從進程隊列中取出合適的進程,得到 CPU 的執行。

到了現代,由於內存容量的提高,不多出現有做業須要在後臺排隊的狀況,因此做業管理之後只會花少許筆墨來介紹。但內存管理進程調度將是咱們之後學習的重點。

分時系統

UNIX 就是最爲著名的分時操做系統

多道批處理系統能夠說是現代操做系統的雛形了,它處理批做業時對處理器的利用率也比較使人滿意,但面對多個交互做業,多道批處理系統就顯得力不從心了。

交互做業的出現很好理解,畢竟咱們如今幾乎全部應用程序都是交互式的,你滑動屏幕,這篇文章就會上下滑動,點一個分享,就會出現各類選項,等等等等。

在交互做業中,不免須要等待用戶作出操做,但又不可能讓處理器停下來等你一我的,畢竟不少人都在用同一臺計算機,所以分時系統應運而生。

顧名思義,分時系統就是 n 個用戶做業,操做系統控制每一個用戶程序以很短的時間爲單位交替執行。由於人的反應相對機器要慢不少,因此若是控制得當,你會感受本身是獨佔了這一臺計算機同樣。

多提一句,分時系統切換進程靠的就是咱們在批處理系統中強調的中斷,不同的是,這裏的中斷是時鐘中斷——一到時間就向 CPU 發出中斷信號。

若是把多個用戶運行的交互程序,看作一個用戶運行的多個交互程序,像咱們如今使用我的計算機同樣,就很容易理解現代操做系統了:

  • 多個進程共用一個處理器,每一個進程分得一個時間片,而在計算機面前的你看來,好像多個進程是並行的。
  • 某進程進行 I/O 操做會被操做系統阻塞,在阻塞隊列等待 I/O 操做結束,纔能有機會使用 CPU。
  • 多個進程在內存上存儲,操做系統須要防止進程向其餘進程的內存空間寫入信息。尤爲要保護操做系統自身的內存空間。
  • 用戶程序運行在用戶態,無權使用特權指令,須要向操做系統提出請求。

講到這,咱們已經瞭解了操做系統的發展,事實上,還有一些其餘的操做系統,好比實時操做系統,網絡操做系統,分佈式操做系統等等,但這些操做系統與咱們生活相關性不大(實時操做系統對嵌入式來講仍是很重要的),因此在此文略過,有興趣的能夠查閱相關資料。

但願在閱讀完這篇文章以後,你可以對操做系統的設計理念有一個簡單的印象,若是本文引發了你對操做系統的興趣,那就再好不過了。

感謝你的閱讀,咱們後會有期!

聲明:原創文章,未經受權,禁止轉載

相關文章
相關標籤/搜索