linux內(nèi)核的子系統(tǒng)有5個:1、 進(jìn)程調(diào)度控制系統(tǒng)(SCHED);2、內(nèi)存管理系統(tǒng)(MM),主要作用是控制多個進(jìn)程安全地共享主內(nèi)存區(qū)域;3、虛擬文件系統(tǒng)(VFS);4、網(wǎng)絡(luò)接口(NET);5、進(jìn)程間通信(IPC)。
本教程操作環(huán)境:Ubuntu 16.04系統(tǒng)、Dell G3電腦。
內(nèi)核:
在計算機(jī)科學(xué)中是一個用來管理軟件發(fā)出的數(shù)據(jù)I/O(輸入與輸出)要求的計算機(jī)程序,將這些要求轉(zhuǎn)譯為數(shù)據(jù)處理的指令并交由中央處理器(CPU)及計算機(jī)中其他電子組件進(jìn)行處理,是現(xiàn)代操作系統(tǒng)中最基本的部分。它是為眾多應(yīng)用程序提供對計算機(jī)硬件的安全訪問的一部分軟件,這種訪問是有限的,并由內(nèi)核決定一個程序在什么時候?qū)δ巢糠钟布僮鞫嚅L時間。直接對硬件操作是非常復(fù)雜的。所以內(nèi)核通常提供一種硬件抽象的方法,來完成這些操作。通過進(jìn)程間通信機(jī)制及系統(tǒng)調(diào)用,應(yīng)用進(jìn)程可間接控制所需的硬件資源(特別是處理器及IO設(shè)備)。
linux內(nèi)核的子系統(tǒng)有哪些
Linux內(nèi)核主要由進(jìn)程調(diào)度(SCHED)、內(nèi)存管理(MM)、虛擬文件系統(tǒng)(VFS)、網(wǎng)絡(luò)接口(NET)和進(jìn)程間通信(IPC)5個子系統(tǒng)組成,如下圖所示。
1、進(jìn)程調(diào)度
????進(jìn)程調(diào)度控制系統(tǒng)中的多個進(jìn)程對CPU的訪問,使得多個進(jìn)程能在CPU中“微觀串行,宏觀并行”地執(zhí)行。進(jìn)程調(diào)度處于系統(tǒng)的中心位置,內(nèi)核中其他的子系統(tǒng)都依賴它,因為每個子系統(tǒng)都需要掛起或恢復(fù)進(jìn)程。
????如下圖所示,Linux的進(jìn)程在幾個狀態(tài)間進(jìn)行切換。
Linux進(jìn)程狀態(tài)轉(zhuǎn)換
????在設(shè)備驅(qū)動編程中,當(dāng)請求的資源不能得到滿足時,驅(qū)動一般會調(diào)度其他進(jìn)程執(zhí)行,并使本進(jìn)程進(jìn)入睡眠狀態(tài),直到它請求的資源被釋放,才會被喚醒而進(jìn)入就緒狀態(tài)。睡眠分成可中斷的睡眠和不可中斷的睡眠,兩者的區(qū)別在于可中斷的睡眠在收到信號的時候會醒。
????完全處于TASK_UNINTERRUPTIBLE狀態(tài)的進(jìn)程甚至都無法被“殺死”,所以Linux 2.6.26之后的內(nèi)核也存在一種TASK_KILLABLE的狀態(tài),它等于“TASK_WAKEKILL|TASK_UNINTERRUPTIBLE”,可以響應(yīng)致命信號。
????在Linux內(nèi)核中,使用task_struct結(jié)構(gòu)體(include/linux/sched.h)來描述進(jìn)程,該結(jié)構(gòu)體中包含描述該進(jìn)程內(nèi)存資源、文件系統(tǒng)資源、文件資源、tty資源、信號處理等的指針。Linux的線程采用輕量級進(jìn)程模型來實現(xiàn),在用戶空間通過pthread_create()API創(chuàng)建線程的時候,本質(zhì)上內(nèi)核只是創(chuàng)建了一個新的task_struct,并將新task_struct的所有資源指針都指向創(chuàng)建它的那個task_struct的資源指針。
????絕大多數(shù)進(jìn)程(以及進(jìn)程中的多個線程)是由用戶空間的應(yīng)用創(chuàng)建的,當(dāng)它們存在底層資源和硬件訪問的需求時,會通過系統(tǒng)調(diào)用進(jìn)入內(nèi)核空間。有時候,在內(nèi)核編程中,如果需要幾個并發(fā)執(zhí)行的任務(wù),可以啟動內(nèi)核線程,這些線程沒有用戶空間。啟動內(nèi)核線程的函數(shù)為:pid_t kernel_thread(int (*fn)(void *), void *arg, unsigned long flags);
2、內(nèi)存管理
????內(nèi)存管理的主要作用是控制多個進(jìn)程安全地共享主內(nèi)存區(qū)域。當(dāng)CPU提供內(nèi)存管理單元(MMU)時,Linux內(nèi)存管理對于每個進(jìn)程完成從虛擬內(nèi)存到物理內(nèi)存的轉(zhuǎn)換。Linux 2.6引入了對無MMU CPU的支持。
????如圖所示,一般而言,32位處理器的Linux的每個進(jìn)程享有4GB的內(nèi)存空間,0~3GB屬于用戶空間,3~4GB屬于內(nèi)核空間,內(nèi)核空間對常規(guī)內(nèi)存、I/O設(shè)備內(nèi)存以及高端內(nèi)存有不同的處理方式。內(nèi)核空間和用戶空間的具體界限是可以調(diào)整的,在內(nèi)核配置選項Kernel Features→Memory split下,可以設(shè)置界限為2GB或者3GB。
Linux進(jìn)程地址空間
????如上圖所示,Linux內(nèi)核的內(nèi)存管理總體比較龐大,包含底層的Buddy(伙伴)算法,它用于管理每個頁的占用情況,內(nèi)核空間的slab分配器以及用戶空間的C庫的二次管理。另外,內(nèi)核也提供了頁緩存的支持,用內(nèi)存來緩存磁盤,per backing device info flusher線程用于刷回臟的頁緩存到磁盤。Kswapd(交換進(jìn)程)則是Linux中用于頁面回收(包括file-backed的頁和匿名頁)的內(nèi)核線程,它采用最近最少使用(LRU)算法進(jìn)行內(nèi)存回收。
3、虛擬文件系統(tǒng)
????如圖所示,
Linux虛擬文件系統(tǒng)
????Linux虛擬文件系統(tǒng)隱藏了各種硬件的具體細(xì)節(jié),為所有設(shè)備提供了統(tǒng)一的接口。而且,它獨立于各個具體的文件系統(tǒng),是對各種文件系統(tǒng)的一個抽象。它為上層的應(yīng)用程序提供了統(tǒng)一的vfs_read()、vfs_write()等接口,并調(diào)用具體底層文件系統(tǒng)或者設(shè)備驅(qū)動中實現(xiàn)的file_operations結(jié)構(gòu)體的成員函數(shù)。
4、網(wǎng)絡(luò)接口
????網(wǎng)絡(luò)接口提供了對各種網(wǎng)絡(luò)標(biāo)準(zhǔn)的存取和各種網(wǎng)絡(luò)硬件的支持。如圖3.8所示,在Linux中網(wǎng)絡(luò)接口可分為網(wǎng)絡(luò)協(xié)議和網(wǎng)絡(luò)驅(qū)動程序,網(wǎng)絡(luò)協(xié)議部分負(fù)責(zé)實現(xiàn)每一種可能的網(wǎng)絡(luò)傳輸協(xié)議,網(wǎng)絡(luò)設(shè)備驅(qū)動程序負(fù)責(zé)與硬件設(shè)備通信,每一種可能的硬件設(shè)備都有相應(yīng)的設(shè)備驅(qū)動程序。
Linux網(wǎng)絡(luò)體系結(jié)構(gòu)
????Linux內(nèi)核支持的協(xié)議棧種類較多,如Internet、UNIX、CAN、NFC、Bluetooth、WiMAX、IrDA等,上層的應(yīng)用程序統(tǒng)一使用套接字接口。
5、進(jìn)程間通信
????進(jìn)程間通信支持進(jìn)程之間的通信,Linux支持進(jìn)程間的多種通信機(jī)制,包含信號量、共享內(nèi)存、消息隊列、管道、UNIX域套接字等,這些機(jī)制可協(xié)助多個進(jìn)程、多資源的互斥訪問、進(jìn)程間的同步和消息傳遞。在實際的Linux應(yīng)用中,人們更多地趨向于使用UNIX域套接字,而不是System V IPC中的消息隊列等機(jī)制。Android內(nèi)核則新增了Binder進(jìn)程間通信方式。
Linux內(nèi)核5個組成部分之間的依賴關(guān)系如下:
-
進(jìn)程調(diào)度與內(nèi)存管理之間的關(guān)系:這兩個子系統(tǒng)互相依賴。在多程序環(huán)境下,程序要運行,則必須為之創(chuàng)建進(jìn)程,而創(chuàng)建進(jìn)程的第一件事情,就是將程序和數(shù)據(jù)裝入內(nèi)存。
-
進(jìn)程間通信與內(nèi)存管理的關(guān)系:進(jìn)程間通信子系統(tǒng)要依賴內(nèi)存管理支持共享內(nèi)存通信機(jī)制,這種機(jī)制允許兩個進(jìn)程除了擁有自己的私有空間之外,還可以存取共同的內(nèi)存區(qū)域。
-
虛擬文件系統(tǒng)與網(wǎng)絡(luò)接口之間的關(guān)系:虛擬文件系統(tǒng)利用網(wǎng)絡(luò)接口支持網(wǎng)絡(luò)文件系統(tǒng)(NFS),也利用內(nèi)存管理支持RAMDISK設(shè)備。
-
內(nèi)存管理與虛擬文件系統(tǒng)之間的關(guān)系:內(nèi)存管理利用虛擬文件系統(tǒng)支持交換,交換進(jìn)程定期由調(diào)度程序調(diào)度,這也是內(nèi)存管理依賴于進(jìn)程調(diào)度的原因。當(dāng)一個進(jìn)程存取的內(nèi)存映射被換出時,內(nèi)存管理向虛擬文件系統(tǒng)發(fā)出請求,同時,掛起當(dāng)前正在運行的進(jìn)程。
????除了這些依賴關(guān)系外,內(nèi)核中的所有子系統(tǒng)還要依賴于一些共同的資源。這些資源包括所有子系統(tǒng)都用到的API,如分配和釋放內(nèi)存空間的函數(shù)、輸出警告或錯誤消息的函數(shù)及系統(tǒng)提供的調(diào)試接口等。
相關(guān)推薦:《Linux視頻教程》