Linux中國

操作系統何時運行?

請各位思考以下問題:在你閱讀本文的這段時間內,計算機中的操作系統運行嗎?又或者僅僅是 Web 瀏覽器在運行?又或者它們也許均處於空閑狀態,等待著你的指示?

這些問題並不複雜,但它們深入涉及到系統軟體工作的本質。為了準確回答這些問題,我們需要透徹理解操作系統的行為模型,包括性能、安全和除錯等方面。在該系列文章中,我們將以 Linux 為主舉例來幫助你建立操作系統的行為模型,OS X 和 Windows 在必要的時候也會有所涉及。對那些深度探索者,我會在適當的時候給出 Linux 內核源碼的鏈接。

這裡有一個基本認知,就是,在任意給定時刻,某個 CPU 上僅有一個任務處於活動狀態。大多數情形下這個任務是某個用戶程序,例如你的 Web 瀏覽器或音樂播放器,但它也可能是一個操作系統線程。可以確信的是,它是一個任務,不是兩個或更多,也不是零個,對,永遠是一個。

這聽上去可能會有些問題。比如,你的音樂播放器是否會獨佔 CPU 而阻止其它任務運行?從而使你不能打開任務管理工具去殺死音樂播放器,甚至讓滑鼠點擊也失效,因為操作系統沒有機會去處理這些事件。你可能會憤而喊出,「它究竟在搞什麼鬼?」,並引發騷亂。

此時便輪到中斷大顯身手了。中斷就好比,一聲巨響或一次拍肩後,神經系統通知大腦去感知外部刺激一般。計算機主板上的晶元組同樣會中斷 CPU 運行以傳遞新的外部事件,例如鍵盤上的某個鍵被按下、網路數據包的到達、一次硬碟讀取的完成,等等。硬體外設、主板上的中斷控制器和 CPU 本身,它們共同協作實現了中斷機制。

中斷對於記錄我們最珍視的資源——時間——也至關重要。計算機啟動過程中,操作系統內核會設置一個硬體計時器以讓其產生周期性計時中斷,例如每隔 10 毫秒觸發一次。每當計時中斷到來,內核便會收到通知以更新系統統計信息和盤點如下事項:當前用戶程序是否已運行了足夠長時間?是否有某個 TCP 定時器超時了?中斷給予了內核一個處理這些問題並採取合適措施的機會。這就好像你給自己設置了整天的周期鬧鈴並把它們用作檢查點:我是否應該去做我正在進行的工作?是否存在更緊急的事項?直到你發現 10 年時間已逝去……

這些內核對 CPU 周期性的劫持被稱為 滴答 tick ,也就是說,是中斷讓你的操作系統滴答了一下。不止如此,中斷也被用作處理一些軟體事件,如整數溢出和頁錯誤,其中未涉及外部硬體。中斷是進入操作系統內核最頻繁也是最重要的入口。對於學習電子工程的人而言,這些並無古怪,它們是操作系統賴以運行的機制。

說到這裡,讓我們再來看一些實際情形。下圖示意了 Intel Core i5 系統中的一個網卡中斷。圖片中的部分元素設置了超鏈,你可以點擊它們以獲取更為詳細的信息,例如每個設備均被鏈接到了對應的 Linux 驅動源碼。

鏈接如下:

讓我們來仔細研究下。首先,由於系統中存在眾多中斷源,如果硬體只是通知 CPU 「嘿,這裡發生了一些事情」然後什麼也不做,則不太行得通。這會帶來難以忍受的冗長等待。因此,計算機上電時,每個設備都被授予了一根中斷線,或者稱為 IRQ。這些 IRQ 然後被系統中的中斷控制器映射成值介於 0 到 255 之間的中斷向量。等到中斷到達 CPU,它便具備了一個完好定義的數值,異於硬體的某些其它詭異行為。

相應地,CPU 中還存有一個由內核維護的指針,指向一個包含 255 個函數指針的數組,其中每個函數被用來處理某個特定的中斷向量。後文中,我們將繼續深入探討這個數組,它也被稱作中斷描述符表(IDT)。

每當中斷到來,CPU 會用中斷向量的值去索引中斷描述符表,並執行相應處理函數。這相當於,在當前正在執行任務的上下文中,發生了一個特殊函數調用,從而允許操作系統以較小開銷快速對外部事件作出反應。考慮下述場景,Web 伺服器在發送數據時,CPU 卻間接調用了操作系統函數,這聽上去要麼很炫酷要麼令人驚恐。下圖展示了 Vim 編輯器運行過程中一個中斷到來的情形。

此處請留意,中斷的到來是如何觸發 CPU 到 Ring 0 內核模式的切換而未有改變當前活躍的任務。這看上去就像,Vim 編輯器直接面向操作系統內核產生了一次神奇的函數調用,但 Vim 還在那裡,它的地址空間原封未動,等待著執行流返回。

這很令人振奮,不是么?不過讓我們暫且告一段落吧,我需要合理控制篇幅。我知道還沒有回答完這個開放式問題,甚至還實質上翻開了新的問題,但你至少知道了在你讀這個句子的同時滴答正在發生。我們將在充實了對操作系統動態行為模型的理解之後再回來尋求問題的答案,對 Web 瀏覽器情形的理解也會變得清晰。如果你仍有問題,尤其是在這篇文章公諸於眾後,請儘管提出。我將會在文章或後續評論中回答它們。下篇文章將於明天在 RSS 和 Twitter 上發布。

via: http://duartes.org/gustavo/blog/post/when-does-your-os-run/

作者:gustavo 譯者:Cwndmiao 校對:wxy

本文由 LCTT 原創編譯,Linux中國 榮譽推出


本文轉載來自 Linux 中國: https://github.com/Linux-CN/archive

對這篇文章感覺如何?

太棒了
0
不錯
0
愛死了
0
不太好
0
感覺很糟
0
雨落清風。心向陽

    You may also like

    Leave a reply

    您的郵箱地址不會被公開。 必填項已用 * 標註

    此站點使用Akismet來減少垃圾評論。了解我們如何處理您的評論數據

    More in:Linux中國