操作系統的運行機制
在操作系統中,通常CPU執行兩種不同性質的程序:一種是操作系統內核程序;另一種是用戶自編程序或系統外層的應用程序。對操作系統而言,這兩種程序作用不同,前者是后者的管理者,因此 “管理程序”要執行一些特權指令,而“被管理程序”出于安全考慮不能執行這些指令。所謂特權指令,是指計算機中不允許用戶直接使用的指令,如I/O指令,置中斷指令,存取用于內存保護的寄存器等指令。操作系統在具體實現上劃分了用戶態(目態)和核心態(管態)以嚴格區分兩類程序。
什么是內核
內核,是一個操作系統的核心。是基于硬件的第一層軟件擴充,提供操作系統的最基本的功能,是操作系統工作的基礎,它負責管理系統的進程、內存、設備驅動程序、文件和網絡系統,決定著系統的性能和穩定性。
現代操作系統設計中,為減少系統本身的開銷,往往將一些與硬件緊密相關的(如中斷處理程序、設備驅動程序等)、基本的、公共的、運行頻率較高的模塊(如時鐘管理、進程調度等)以及關鍵性數據結構獨立開來,使之常駐內存,并對他們進行保護。通常把這一部分稱之為操作系統的內核。
Linux 內核簡介
讓我們一種圖來展示Linux操作系統的體系結構。可以從兩個層次上來考慮操作系統。
用戶空間(User Space)
這是用戶應用程序執行的地方
- 用戶程序(User Application)
- 標準C庫(CNU C Library):它提供了連接內核的系統調用接口,還提供了在用戶空間應用程序和內核之間進行轉換的機制。這點非常重要,因為內核和用戶空間的應用程序使用的是不同的保護地址空間。每個用戶空間的進程都使用自己的虛擬地址空間,而內核則占用單獨的地址空間。
內核空間(Kernel)
Linux 內核可以進一步劃分成 3 層
- 系統調用接口(System Call Interface):實現了一些基本的功能,例如 read 和 write。
- 內核代碼(Kernel):獨立于體系結構的內核代碼,這些代碼是 Linux 所支持的所有處理器體系結構所通用的。
- 依賴于體系結構的代碼:構成了通常稱為 BSP(Board Support Package)的部分。這些代碼用作給定體系結構的處理器和特定于平臺的代碼。
Linux 內核的主要子系統
Linux內核主要有5個子系統組成:進程調度、內存管理、虛擬文件系統、網絡接口和進程間通信。
進程調度(SCHED)
控制進程對CPU的訪問。當需要選擇下一個進程運行時,由調度程序選擇最值得運行的進程。可運行進程實際上是指那些僅等待CPU資源的進程,如果某個進程在等待其他資源,則該進程是不可運行進程。Linux使用了比較簡單的基于優先級的進程調度算法選擇新的進程。
內存管理 (MM)
允許多個進程共享主內存區域。Linux的內存管理支持虛擬內存,即在計算機中運行的程序,其代碼、數據、堆棧的總量可以超過實際內存的大小,操作系統只是把當前使用的程序塊保留在內存中,其余的程序塊則保留在磁盤中。必要時,操作系統只是把當前使用的程序塊保留在內存中,其余的程序塊則保留在磁盤中。必要時,操作系統負責在磁盤和內存間交換程序塊。
虛擬文件系統 (Virtual File System, VFS)
隱藏了各種硬件的具體細節,為所有的設備提供了同意的接口,VFS提供了多達數十種不同的文件系統。虛擬文件可以分為邏輯文件系統和設備驅動程序。邏輯文件系統指的是 Linux所支持的文件系統,如EXT2,FAT等,設備驅動程序指為每一種硬件控制器所編寫的設備驅動程序模塊。
網絡接口 (NET)
提供了對各種網絡標準的存取和各種網絡硬件的支持。網絡接口可分為網絡協議和網絡驅動程序。網絡協議負責實現每一種可能的網絡傳輸協議。網絡設備驅動程序負責與硬件設備通信,每一種可能的硬件設備都有相應的設備驅動程序。
進程間通信 (IPC)
支持進程間各種通信機制。處于中心位置的進程調度,所有其它的子系統都依賴它,因為每個子系統都需要掛起或恢復進程。一般情況下,當一個進程等待硬件操作完成時,它被掛起;當操作真正完成時,進程被恢復執行。例如,當一個進程通過網絡發送一條消息時,網絡接口需要掛起發送進程,直到硬件成功地完成消息的發送,當消息被成功的發送出去以后,網絡接口給進程返回一個代碼,表示操作的成功或失敗。其他子系統以相似的理由依賴于進程調度。
一張完整的 Linux 內核運行原理圖