linux核心的子系統有5個:1、 進程調度控制系統(SCHED);2、記憶體管理系統(MM),主要作用是控制多個進程安全地共享主記憶體區域;3、虛擬檔案系統(VFS);4、網路介面(NET);5、進程間通訊(IPC)。
本教學操作環境:Ubuntu 16.04系統、Dell G3電腦。
核心:
在電腦科學中是一個用來管理軟體發出的資料I/O(輸入與輸出)要求的電腦程序,將這些要求轉譯為資料處理的指令並交由中央處理器(CPU)及電腦中其他電子組件處理,是現代作業系統中最基本的部分。它是為眾多應用程式提供對電腦硬體的安全存取的一部分軟體,這種存取是有限的,並由核心決定一個程式在什麼時候對某部分硬體操作多長時間。直接對硬體操作是非常複雜的。所以核心通常提供一種硬體抽象的方法,來完成這些操作。透過進程間通訊機制及系統調用,應用程式可間接控制所需的硬體資源(特別是處理器及IO設備)。
linux核心的子系統有哪些
Linux核心主要由進程調度(SCHED)、記憶體管理(MM)、虛擬檔案系統(VFS)、網路介面(NET)和進程間通訊(IPC)5個子系統組成,如下圖所示。
1、程式調度
程式調度控制系統中的多個進程對CPU的訪問,使得多個進程能在CPU中「微觀串行,宏觀並行」地執行。進程調度處於系統的中心位置,核心中其他的子系統都依賴它,因為每個子系統都需要掛起或恢復進程。
如下圖所示,Linux的進程在幾個狀態之間切換。
Linux進程狀態轉換
在裝置驅動程式設計中,當請求的資源無法滿足時,驅動一般會調度其他進程執行,並使本進程進入睡眠狀態,直到它所要求的資源被釋放,才會被喚醒而進入就緒狀態。睡眠分成可中斷的睡眠和不可中斷的睡眠,兩者的差異在於可中斷的睡眠在收到訊號的時候會醒。
完全處於TASK_UNINTERRUPTIBLE狀態的進程甚至都無法被“殺死”,所以Linux 2.6.26之後的內核也存在一種TASK_KILLABLE的狀態,它等於“TASK_WAKEKILL|TASK_UNINTERRUPTIBLE”,可以響應致命信號。
在Linux核心中,使用task_struct結構體(include/linux/sched.h)來描述進程,該結構體中包含描述該進程記憶體資源、檔案系統資源、檔案資源、tty資源、訊號處理等的指針。 Linux的執行緒採用輕量級進程模型來實現,在用戶空間透過pthread_create()API建立執行緒的時候,本質上核心只是建立了一個新的task_struct,並將新task_struct的所有資源指標都指向建立它的那個task_struct的資源指標。
絕大多數行程(以及行程中的多個執行緒)是由使用者空間的應用程式所建立的,當它們存在底層資源和硬體存取的需求時,會透過系統呼叫進入核心空間。有時候,在核心程式設計中,如果需要幾個並發執行的任務,可以啟動核心線程,這些線程沒有使用者空間。啟動核心執行緒的函式為:pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
##2、記憶體管理
# 記憶體管理的主要功能是控制多個進程安全地共享主記憶體區域。當CPU提供記憶體管理單元(MMU)時,Linux記憶體管理對於每個程序完成從虛擬記憶體到實體記憶體的轉換。 Linux 2.6引入了對無MMU CPU的支援。 如圖所示,一般而言,32位元處理器的Linux的每個進程享有4GB的記憶體空間,0~3GB屬於用戶空間,3~4GB屬於核心空間,核心空間對常規內存、I/O裝置記憶體以及高階記憶體有不同的處理方式。核心空間和使用者空間的具體界限是可以調整的,在核心配置選項Kernel Features→Memory split下,可以設定界限為2GB或3GB。
Linux進程位址空間
如上圖所示,Linux核心的記憶體管理整體較為龐大,包含底層的Buddy(夥伴)演算法,它用於管理每頁的佔用情況,內核空間的slab分配器以及用戶空間的C庫的二次管理。另外,核心也提供了頁快取的支持,用記憶體來快取磁碟,per backing device info flusher執行緒用來刷回髒的頁快取到磁碟。 Kswapd(交換程序)則是Linux中用於頁面回收(包括file-backed的頁和匿名頁)的核心線程,它採用最近最少使用(LRU)演算法進行記憶體回收。
3、虛擬檔案系統
# 如圖所示,
Linux虛擬檔案系統
Linux虛擬檔案系統隱藏了各種硬體的特定細節,為所有裝置提供了統一的介面。而且,它獨立於各個特定的檔案系統,是對各種檔案系統的抽象。它為上層的應用程式提供了統一的vfs_read()、vfs_write()等接口,並調用具體底層文件系統或設備驅動中實現的file_operations結構體的成員函數。
4、網路介面
網路介面提供了各種網路標準的存取和各種網路硬體的支援。如圖3.8所示,在Linux中網路介面可分為網路協定和網路驅動程序,網路協定部分負責實現每一種可能的網路傳輸協議,網路裝置驅動程式負責與硬體裝置通信,每一種可能的硬體設備都有對應的設備驅動程式。
Linux網路體系結構
Linux核心支援的協定堆疊種類較多,如Internet、UNIX、CAN、NFC、Bluetooth、WiMAX、IrDA等,上層的應用程式統一使用套接字介面。
5、進程間通訊
進程間通訊支援進程之間的通信,Linux支援進程間的多種通訊機制,包含信號量、共享記憶體、訊息佇列、管道、UNIX域套接字等,這些機制可協助多個進程、多資源的互斥存取、進程間的同步和訊息傳遞。在實際的Linux應用程式中,人們更趨向於使用UNIX域套接字,而不是System V IPC中的消息佇列等機制。 Android核心則新增了Binder進程間通訊方式。
Linux核心5個組成部分之間的依賴關係如下:
進程調度與記憶體管理之間的關係:這兩個子系統互相依賴。在多程式環境下,程式要運行,則必須為之建立進程,而創建進程的第一件事情,就是將程式和資料裝入記憶體。
進程間通訊與記憶體管理的關係:進程間通訊子系統要依賴記憶體管理支援共享記憶體通訊機制,這種機制允許兩個行程除了擁有自己的私有空間之外,還可以訪問共同的記憶體區域。
虛擬檔案系統與網路介面之間的關係:虛擬檔案系統利用網路介面支援網路檔案系統(NFS),也利用記憶體管理支援RAMDISK設備。
記憶體管理與虛擬檔案系統之間的關係:記憶體管理利用虛擬檔案系統支援交換,交換進程定期由調度程式調度,這也是記憶體管理依賴進程調度的原因。當一個進程存取的記憶體映射被換出時,記憶體管理向虛擬檔案系統發出請求,同時,掛起目前正在運行的進程。
除了這些依賴關係外,核心中的所有子系統還要依賴一些共同的資源。這些資源包括所有子系統都用到的API,如分配和釋放記憶體空間的函數、輸出警告或錯誤訊息的函數及系統提供的偵錯介面等。
相關推薦:《Linux影片教學》
以上是linux核心的子系統有哪些的詳細內容。更多資訊請關注PHP中文網其他相關文章!