作業系統的主要子系統
一整個作業系統太龐大,無法一次想清楚,因此把它拆成少數幾個主要子系統會很有幫助,每個子系統各自負責管理某一類資源或某一類工作。想像一座城市的各個部門:一個管交通、一個管住房、一個管供水、一個管戶政、一個管警務。每個部門都有自己的關注重點與專家,卻又彼此合作以維持城市運轉。作業系統的組織方式正是如此,而本主題其餘的內容,本質上就是逐一參訪這些部門。
經典的子系統如下。行程與 CPU 管理決定哪些程式執行,並透過排程在它們之間分享處理器——這是行程、執行緒與排程器的歸宿。記憶體管理把主記憶體分發給程式、防止它們互相踩踏,並提供「比實際存在更多記憶體」的錯覺(虛擬記憶體、分頁)。檔案系統把儲存裝置上的資料組織成有名字的檔案與目錄,並控制誰可以讀或寫它們。輸入輸出子系統透過裝置驅動程式、緩衝與中斷處理,驅動所有裝置——磁碟、鍵盤、網路。保護與安全執行「誰能做什麼、存取什麼」的規則。在這些之上與周圍,常常還有一個使用者介面(殼層或圖形桌面),不過那通常算是上層的程式,而非核心的一部分。
這張地圖是初學者最好的定位工具:之後的每個主題都能在某個子系統裡找到歸宿,所以當你遇到分頁表,你便知道它屬於記憶體管理;遇到號誌,便知道它屬於行程管理裡同步的那一角。這些子系統彼此並非築起高牆——記憶體管理與檔案系統密切合作(頁面快取、記憶體映射檔案),排程也與輸入輸出互動——但把它們當作各自獨立的部門看待,正是讓整個領域變得可學、而非令人不知所措的方法。
開啟一段 2 GB 的影片,一次就觸及四個子系統:檔案系統找到那個檔案、記憶體管理把它的一部分映射進來、輸入輸出子系統在你觀看時從磁碟串流位元組進來,而排程器則持續讓播放器取得 CPU 時間,使播放保持流暢。
真實任務會橫跨多個子系統;這種劃分是為了理解,而非隔離。
子系統的劃分是學習用的地圖,而非嚴格的程式碼配置。在單核心裡它們全住在同一個程式中、彼此自由呼叫;在微核心裡它們可能以各自獨立的使用者空間伺服器執行。