第三章 操作系統結構
操作系統的機制與策略
操作系統乃至計算機系統中控制復雜度的—個重要設計原則是:將策略與機制相分離,其中策略(policy)表示要‘‘做什么”,機制(mechanjsm)表示該“如何做”。
操作系統復雜度管理方法
管理復雜系統的重要方法是 M.A.L.H 方法,即模塊化(modularity)、抽象(abstraction)、分層(layering)和層級(hierarchy)。
- 模塊化:模塊化就是通過“分而治之”(divide and conquer)原則,將一個復雜系統分解為一系列通過明確定義的接口進行交互的模塊,并嚴格保障模塊之間的界限。
- 抽象:抽象是在模塊化的基礎上,將接口與內部實現分離,從而使模塊之間只需通過抽象的接口進行相互調用,而無須關心各個模塊的內部實現。
小知識:寬進嚴出原則:
一個模塊的接口應該容忍各種可能的輸入,抑制錯誤甚至惡意的輸入,避免錯誤或惡意輸入的效果在模塊內傳播,并且盡可能嚴格地控制模塊對外的輸出,從而減少錯誤在模塊間的傳播。
- 分層:分層是通過將模塊按照一定的原則進行層次的劃分,約束每層內部模塊間的交互方式與跨層次模塊間的交互方式,從而有效地減少模塊之間的交互。
- 層級:層級是另外一種模塊的組織方式。首先將一些功能相近的模塊組成一個具有清晰接口的自包含子系統,然后再將這些子系統遞歸地組成一個具有清晰接口的更大子系統。
比如在操作系統中,既有分層的模塊結構(如內核層、用戶層),也有層級的進程管理結構(父進程與子進程)
操作系統內核架構
隨著操作系統功能的不斷增多和代碼規模的不斷擴大,提供合理的層級結構,對于降低操作系統復雜度、提升操作系統安全與可靠性來說變得尤為重要。下圖列舉了一些常見的操作系統內核架構。
簡要結構
- 特點:應用程序與操作系統放置在同一個地址空間(address space)中,無須底層硬件提供復雜的內存管理、特權級隔離等功能。
- 優勢:任何程序對操作系統服務的調用可直接通過函數調用高效完成。
- 劣勢:任何一個應用程序或操作系統模塊出現了問題,均有可能使整個系統崩潰。
- 典型例子:MS-DOS(MicroSoft Disk Operating System)、FreeRTOG、uCOS。
MS-DOS的系統結構:
宏內核結構
- 特點:操作系統內核的所有模塊(包括進程調度、內存管理、文件系統、設備驅動等)均運行在內核態,具備直接操作硬件的能力。
- 優勢:性能高、模塊間通信高效、資源管理集中、廣泛支持與優化。
- 劣勢:一個通用的、適用于大部分場景的設計,常常意味著很難滿足特定場景下對安全性、可靠性、實時性等方面的需求;同時,在一個龐大的系統中進行創新也變得越來越困難。
- 典型例子:UNIX/Linux、FreeBSD。
宏內核的基本結構:
微內核結構
- 特點:對宏內核架構的操作系統進行解耦,將單個功能或模塊(如文件系統、設備驅動等)從內核中拆分出來,作為一個獨立的服務部署到獨立的運行環境中;內核僅保留極少的功能,為這些服務提供通信等基礎能力,使其能夠互相協作以完成操作系統所必需的功能。
- 優勢:服務與服務完全隔離,能有效提供操作系統的可靠性與安全性;方便為不同場景定制不同服務。
- 劣勢:開發難度高,通信開銷大
外核結構
- 特點:為不同的應用提供定制化的高效資源管理:按照不同應用領域的要求’將對硬件資源的抽象模塊化為一系列的庫(即LibOS)
- 優勢:
- 可按照應用領域的特點與需求,動態組裝成最適合該應用領域的 LibOS,最小化非必要的代碼,從而獲得更高的性能。
- 處于硬件特權級的操作系統內核可以做到非常小,并且由于多個 LibOS 之間的強隔離性,從而可以提升整個計算機系統的安全性與可靠性。
- 劣勢:
- LibOS通常是為某種應用定制的’缺乏跨場景的通用性,應用生態差。
- 不同的LibOS通常會實現相同或類似的功能,容易造成代碼冗余。
外核結構架構圖:
外核結構與微內核的區別
- 外核架構將多個硬件資源劃分為一個“切片”,每個切片中保護的多個硬件資源由 LibOS 管理并直接服務于一個應用;而微內核架構則是通過讓一個操作系統模塊獨立運行在一個地址空間上來管理一個具體的硬件資源,為操作系統中所有的應用服務。
- 外核架構中,運行在特權級的內核主要為 LibOS 提供硬件的多路復用能力并管理 LibOS;而微內核架構中,內核主要提供進程間通信(IPC)功能。
- 外核架構在面向一個功能與生態受限的場景時可通過定制化 LibOS 獲得非常高的性能;而微內核架構則需要更復雜的優化才能獲得與之類似的性能。
多內核結構
- 特點:將—個眾核系統看成一個由多個獨立處理器核通過網絡互聯而成的分布式系統;它提供了—層基于進程間通信的抽象,從而避免了處理器核之間通過共享內存進行隱式的共享。
- 優勢:可以避免傳統操作系統架構中的復雜的隱式共享所帶來的性能可 擴展性瓶頸;非常容易支持異構處理器架構。
- 劣勢:不同節點之間存在的狀態冗余對資源開 銷會造成一定壓力;需要移植現有應用才能適應多內核架構。
多內核架構圖:
混合內核架構
由于設計需求的多樣化,現實中的操作系統往往融合了多種架構的設計思想。
- 雖然Linux內核是公認的宏內核架構,但其近期也開始融合了微內核架構中的用戶態驅
動模型(如UIO與VFIO等)。 - 蘋果操作系統內核XNU是一個Mach微內核與BSD UNIX的混合體,被使用于MacOSX中。
- WmdowsNT的操作系統內核也采用了微內核設計思想,但是將一些系統服務運行在內核態。
操作系統架構組合及演進:
操作系統框架結構
Android系統框架
在Linux內核之上運行的Android系統框架包括如下幾個主要組件:
- 硬件抽象層(hardwareabstractlayer):Android在Linux內核上提供—層硬件抽象層的主要原因有兩個:
- linux宏內核架構使得設備驅動運行在linux內核態,因此設備驅動的接口依賴于linux內核設備驅動接口的演進,這會阻礙 Android 系統框架的獨立演進與升級。
- Linux 內核采用了 GPL v2 開源協議,協議要求運行在同一個地址空間的設備驅動必須開源代碼,這會導致一些硬件的實現細節也被公開,因此一些設備廠商擔心其硬件競爭力受到影響。
- Android 庫(Android library):Android 庫一方面提供了一些方便 Android 應用開發的自定義庫,另外一方面也重新實現了一些標準庫(如 glibc 等),從而規避了 LGPL 開源協議。
- Android 運行環境(Android Runtime, ART)。由于 Android 應用的主要開發語言是 Java,因此需要一個運行時環境將應用從字節碼轉化為可執行代碼。早期的 Android 采用 Dalvik 虛擬機的形式,通過解釋執行與 JIT(Just-in-Time)編譯的方式運行,因而帶來一些性能與功耗的損失。Android 自 5.0 后引入了 Android 運行環境(ART),通過 Ahead-of-Time (AOT) 預先編譯的方式,將 Java 代碼預編譯為二進制可執行代碼,從而避免了運行時的編譯開銷。
- Android 應用框架(Android application framework)。Android 應用框架提供了應用運行所需要的基礎服務,包括服務管理(service manager)、活動管理(activity manager)、包管理(package manager)、窗口管理(window manager)等。這些服務化的組件利用操作系統內核提供的資源抽象,為應用構建了一系列方便調用的應用服務。
服務化架構與 Binder IPC
Android 系統框架的設計整體應用了類似微內核架構的思想,將系統框架組件化與服務化,各個組件依賴于 Android 提供的 Binder IPC 進行通信。
ROS系統框架
ROS 是 Robot Operating System 的縮寫,即機器人操作系統。雖然名字中包含操作系統,但 ROS 實際上是一個面向機器人硬件場景的系統框架,可運行在 Linux 內核以及其他兼容 POSIX 接口的操作系統內核之上。作為一個操作系統的系統框架,ROS 提供了
ROS層次架構圖:
簡要而言,ROS 可以分為基礎設施層、通信層和應用層。其中,基礎設施層包括 ROS 中的 Python、C++ 等運行環境、ROS 文件系統與 ROS 包管理機制等。在基礎設施層之上運行了 ROS 的通信層,提供基礎的 ROS IPC 機制以及 ROS 的數據分發服務(Data Distribution Service, DDS)等。ROS 的應用層是由一個個節點所構成的計算,這些節點之間可以使用 ROS 的通信層直接進行互相調用,或者通過對一些話題(topic)發布消息或者訂閱消息來進行間接通信。