摘要Linux kernel 成功的兩個原因:
正是這兩個原因使得Linux kernel可以不斷進化和改進,。 一、Linux內(nèi)核在整個計算機系統(tǒng)中的位置Fig 1 - 計算機系統(tǒng)分層結(jié)構(gòu) 分層結(jié)構(gòu)的原則:
這種子系統(tǒng)之間的依賴性只能是從上到下,,也就是圖中頂部的子系統(tǒng)依賴底部的子系統(tǒng),,反之則不行。 二,、內(nèi)核的作用
PS:進程上下文切換就是要換掉程序狀態(tài)字,、換掉頁表基地址寄存器的內(nèi)容,、換掉 current 指向的 task_struct 實例、換掉 PC ——>也就換掉了進程打開的文件(通過 task_struct 的 files 可以找到),、換掉了進程內(nèi)存的執(zhí)行空間(通過 task_struct 的 mem 可以找到),; 三、Linux內(nèi)核的整體架構(gòu)Linux內(nèi)核的整體架構(gòu) 中心系統(tǒng)是進程調(diào)度器:所有其余的子系統(tǒng)都依賴于進程調(diào)度器,,因為其余子系統(tǒng)都需要阻塞和恢復(fù)進程。當一個進程需要等待一個硬件動作完成時,,相應(yīng)子系統(tǒng)會阻塞這個進程,;當這個硬件動作完成時,子系統(tǒng)會將這個進程恢復(fù):這個阻塞和恢復(fù)動作都要依賴于進程調(diào)度器完成,。 上圖中的每一個依賴箭頭都有原因:
四,、高度模塊化設(shè)計的系統(tǒng),利于分工合作,。
五,、系統(tǒng)中的數(shù)據(jù)結(jié)構(gòu)
六,、子系統(tǒng)架構(gòu)1.進程調(diào)度器架構(gòu)(1)目標進程調(diào)度器是 Linux kernel 中最重要的子系統(tǒng),。系統(tǒng)通過它來控制對 CPU 的訪問——不僅僅是用戶進程對 CPU 的訪問,也包括其余子系統(tǒng)對 CPU 的訪問,。 (2)模塊進程調(diào)度器 調(diào)度策略模塊:決定哪個進程獲得對 CPU 的訪問權(quán),;調(diào)度策略應(yīng)該讓所有進程盡可能公平得共享 CPU。
(3)數(shù)據(jù)表示調(diào)度器維護一個數(shù)據(jù)結(jié)構(gòu)——task list,其中的元素時每個活動的進程 task_struct 實例,;這個數(shù)據(jù)結(jié)構(gòu)不僅僅包含用來阻塞和恢復(fù)進程的信息,,也包含額外的計數(shù)和狀態(tài)信息。這個數(shù)據(jù)結(jié)構(gòu)在整個 kernel 層都可以公共訪問,。 (4)依賴關(guān)系,、數(shù)據(jù)流、控制流正如前面提到過的,,調(diào)度器需要調(diào)用內(nèi)存管理器提供的功能,,去為需要恢復(fù)執(zhí)行的進程選擇合適的物理地址,正因為如此,,所以 進程調(diào)度器子系統(tǒng)依賴于內(nèi)存管理子系統(tǒng),。當其他內(nèi)核子系統(tǒng)需要等待硬件請求完成時,它們都依賴于進程調(diào)度子系統(tǒng)進行進程的阻塞和恢復(fù),。這種依賴性通過函數(shù)調(diào)用和訪問共享的 task list 數(shù)據(jù)結(jié)構(gòu)來體現(xiàn),。所有的內(nèi)核子系統(tǒng)都要讀或者寫代表當前正在運行進程的數(shù)據(jù)結(jié)構(gòu),因此形成了貫穿整個系統(tǒng)的雙向數(shù)據(jù)流,。 除了內(nèi)核層的數(shù)據(jù)流和控制流,,OS 服務(wù)層還給用戶進程提供注冊定時器的接口。這形成了由調(diào)度器對用戶進程的控制流,。通常喚醒睡眠進程的用例不在正常的控制流范圍,,因為用戶進程無法預(yù)知何時被喚醒。最后,,調(diào)度器與 CPU 交互來阻塞和恢復(fù)進程,,這又形成它們之間的數(shù)據(jù)流和控制流——CPU 負責打斷當前正在運行的進程,并允許內(nèi)核調(diào)度其他的進程運行,。 2.內(nèi)存管理器架構(gòu)(1)目標內(nèi)存管理模塊負責控制進程如何訪問物理內(nèi)存資源,。通過硬件內(nèi)存管理系統(tǒng)(MMU)管理進程虛擬內(nèi)存和機器物理內(nèi)存之間的映射。每一個進程都有自己獨立的虛擬內(nèi)存空間,,所以兩個進程可能有相同的虛擬地址,,但是它們實際上在不同的物理內(nèi)存區(qū)域運行。MMU 提供內(nèi)存保護,,讓兩個進程的物理內(nèi)存空間不互相干擾,。內(nèi)存管理模塊還支持交換——將暫時不用的內(nèi)存頁換出到磁盤上的交換分區(qū),,這種技術(shù)讓進程的虛擬地址空間大于物理內(nèi)存的大小,。虛擬地址空間的大小由機器字長決定。 (2)模塊內(nèi)存管理子系統(tǒng)
(3)數(shù)據(jù)表示內(nèi)存管理存放每個進程的虛擬內(nèi)存到物理內(nèi)存的映射信息,。這種映射信息存放在 mm_struct 結(jié)構(gòu)實例中,,這個實例的指針又存放在每個進程的 task_struct 中。除了存放映射信息,,數(shù)據(jù)塊中還應(yīng)該存放關(guān)于內(nèi)存管理器如何獲取和存儲頁的信息,。例如:可執(zhí)行代碼能夠?qū)⒖蓤?zhí)行鏡像作為備份存儲;但是動態(tài)申請的數(shù)據(jù)則必須備份到系統(tǒng)頁中,。(這個沒看懂,,請高手解惑,?) 最后,,內(nèi)存管理模塊還應(yīng)該存放訪問和技術(shù)信息,以保證系統(tǒng)的安全,。 (4)依賴關(guān)系,、數(shù)據(jù)流和控制流內(nèi)存管理器控制物理內(nèi)存,當頁面失敗發(fā)生時,,接受硬件的通知(缺頁中斷)—— 這意味著在內(nèi)存管理模塊和內(nèi)存管理硬件之間存在雙向的數(shù)據(jù)流和控制流,。內(nèi)存管理也依賴文件系統(tǒng)來支持交換和內(nèi)存映射 I/O——這種需求意味著內(nèi)存管理器需要調(diào)用對文件系統(tǒng)提供的函數(shù)接口,往磁盤中存放內(nèi)存頁和從磁盤中取內(nèi)存頁,。因為文件系統(tǒng)請求非常慢,,所以在等待內(nèi)存頁被換入之前,內(nèi)存管理器要讓進程需要進入休眠——這種需求讓內(nèi)存管理器調(diào)用進程調(diào)度器的接口,。由于每個進程的內(nèi)存映射存放在進程調(diào)度器的數(shù)據(jù)結(jié)構(gòu)中,,所以在內(nèi)存管理器和進程調(diào)度器之間也有雙向的數(shù)據(jù)流和控制流,。用戶進程可以建立新的進程地址空間,,并且能夠感知缺頁錯誤——這里需要來自內(nèi)存管理器的控制流。一般來說沒有用戶進程到內(nèi)存管理器的數(shù)據(jù)流,,但是用戶進程卻可以通過 select 系統(tǒng)調(diào)用,,從內(nèi)存管理器獲取一些信息。 3.虛擬文件系統(tǒng)架構(gòu)(1)目標虛擬文件系統(tǒng)為存儲在硬件設(shè)備上數(shù)據(jù)提供統(tǒng)一的訪問接口??梢约嫒莶煌奈募到y(tǒng)(ext2,ext4,ntf等等),。計算機中幾乎所有的硬件設(shè)備都被表示為一個通用的設(shè)備驅(qū)動接口,。邏輯文件系統(tǒng)促進與其他操作系統(tǒng)標準的兼容性,并且允許開發(fā)者以不同的策略實現(xiàn)文件系統(tǒng),。虛擬文件系統(tǒng)更進一步,,允許系統(tǒng)管理員在任何設(shè)備上掛載任何邏輯文件系統(tǒng),。虛擬文件系統(tǒng)封裝物理設(shè)備和邏輯文件系統(tǒng)的細節(jié),,并且允許用戶進程使用統(tǒng)一的接口訪問文件。 除了傳統(tǒng)的文件系統(tǒng)目標,,VFS 也負責裝載新的可執(zhí)行文件,。這個任務(wù)由邏輯文件系統(tǒng)模塊完成,,使得 Linux 可以支持多種可執(zhí)行文件,。 (2)模塊虛擬文件系統(tǒng)模塊
(3)數(shù)據(jù)表示所有文件使用 inode 表示。每個 inode 都記錄一個文件在硬件設(shè)備上的位置信息,。不僅如此,,inode 還存放著指向邏輯文件系統(tǒng)模塊和設(shè)備驅(qū)動的的函數(shù)指針,這些指針能夠執(zhí)行具體的讀寫操作,。通過按照這種形式(就是面向?qū)ο笾械奶摵瘮?shù)的思想)存放函數(shù)指針,,具體的邏輯文件系統(tǒng)和設(shè)備驅(qū)動可以向內(nèi)核注冊自己而不需要內(nèi)核依賴具體的模塊特性。 (4)依賴關(guān)系,、數(shù)據(jù)流和控制流一個特殊的設(shè)備驅(qū)動是 ramdisk,,這個設(shè)備在主存中開辟一片區(qū)域,并把它當成持久性存儲設(shè)備使用,。這個設(shè)備驅(qū)動使用內(nèi)存管理模塊完成任務(wù),,所以在 VFS 與對內(nèi)存管理模塊存在依賴關(guān)系(圖中的依賴關(guān)系反了,應(yīng)該是 VFS 依賴于內(nèi)存管理模塊),、數(shù)據(jù)流和控制流,。 邏輯文件系統(tǒng)支持網(wǎng)絡(luò)文件系統(tǒng)。這個文件系統(tǒng)像訪問本地文件一樣,,從另一臺機器上訪問文件,。為了實現(xiàn)這個功能,一種邏輯文件系統(tǒng)通過網(wǎng)絡(luò)子系統(tǒng)完成它的任務(wù)——這引入了 VFS 對網(wǎng)絡(luò)子系統(tǒng)的一個依賴關(guān)系以及它們之間的控制流和數(shù)據(jù)流,。 正如前面提到的,,內(nèi)存管理器使用 VFS 完成內(nèi)存交換功能和內(nèi)存映射 I/O。另外,,當 VFS 等待硬件請求完成時,,VFS 需要使用進程調(diào)度器阻塞進程;當請求完成時,,VFS 需要通過進程調(diào)度器喚醒進程,。最后,系統(tǒng)調(diào)用接口允許用戶進程調(diào)用來存取數(shù)據(jù),。不像前面的子系統(tǒng),,VFS 沒有提供給用戶注冊不明確調(diào)用的機制,,所以沒有從VFS到用戶進程的控制流。 4.網(wǎng)絡(luò)接口架構(gòu)(1)目標網(wǎng)絡(luò)子系統(tǒng)讓 Linux 系統(tǒng)能夠通過網(wǎng)絡(luò)與其他系統(tǒng)相連,。這個子系統(tǒng)支持很多硬件設(shè)備,,也支持很多網(wǎng)絡(luò)協(xié)議。網(wǎng)絡(luò)子系統(tǒng)將硬件和協(xié)議的實現(xiàn)細節(jié)都屏蔽掉,,并抽象出簡單易用的接口供用戶進程和其他子系統(tǒng)使用——用戶進程和其余子系統(tǒng)不需要知道硬件設(shè)備和協(xié)議的細節(jié),。 (2)模塊網(wǎng)絡(luò)協(xié)議層模塊圖
(3)數(shù)據(jù)表示每個網(wǎng)絡(luò)對象都被表示為一個套接字。套接字與進程關(guān)聯(lián)的方法和 inode 節(jié)點相同,。通過兩個 task_struct 指向同一個套接字,,套接字可以被多個進程共享。 (4)數(shù)據(jù)流,,控制流和依賴關(guān)系當網(wǎng)絡(luò)子系統(tǒng)需要等待硬件請求完成時,,它需要通過進程調(diào)度系統(tǒng)將進程阻塞和喚醒——這形成了網(wǎng)絡(luò)子系統(tǒng)和進程調(diào)度子系統(tǒng)之間的控制流和數(shù)據(jù)流。不僅如此,,虛擬文件系統(tǒng)通過網(wǎng)絡(luò)子系統(tǒng)實現(xiàn)網(wǎng)絡(luò)文件系統(tǒng)(NFS)——這形成了 VFS 和網(wǎng)絡(luò)子系統(tǒng)指甲的數(shù)據(jù)流和控制流,。 七、結(jié)論1,、Linux 內(nèi)核是整個 Linux 系統(tǒng)中的一層,。內(nèi)核從概念上由五個主要的子系統(tǒng)構(gòu)成:進程調(diào)度器模塊、內(nèi)存管理模塊,、虛擬文件系統(tǒng),、網(wǎng)絡(luò)接口模塊和進程間通信模塊。這些模塊之間通過函數(shù)調(diào)用和共享數(shù)據(jù)結(jié)構(gòu)進行數(shù)據(jù)交互,。 2、Linux 內(nèi)核架構(gòu)促進了他的成功,,這種架構(gòu)使得大量的志愿開發(fā)人員可以合適得分工合作,,并且使得各個特定的模塊便于擴展。
參考文章:
|
|
來自: 昵稱29273511 > 《待分類》