歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux綜合 >> Linux內核 >> Linux內核及內核緩沖區技術詳解

Linux內核及內核緩沖區技術詳解

日期:2017/3/3 16:02:01   编辑:Linux內核

Linux 內核簡介

現在讓我們從一個比較高的高度來審視一下 GNU/Linux 操作系統的體系結構。您可以從兩個層次上來考慮操作系統,如圖 2 所示。

圖 2. GNU/Linux 操作系統的基本體系結構

最上面是用戶(或應用程序)空間。這是用戶應用程序執行的地方。用戶空間之下是內核空間,Linux 內核正是位於這裡。

GNU C Library (glibc)也在這裡。它提供了連接內核的系統調用接口,還提供了在用戶空間應用程序和內核之間進行轉換的機制。這點非常重要,因為內核和用戶空間的應用程序使用的是不同的保護地址空間。每個用戶空間的進程都使用自己的虛擬地址空間,而內核則占用單獨的地址空間。

Linux 內核可以進一步劃分成 3 層。最上面是系統調用接口,它實現了一些基本的功能,例如 read 和 write。系統調用接口之下是內核代碼,可以更精確地定義為獨立於體系結構的內核代碼。這些代碼是 Linux 所支持的所有處理器體系結構所通用的。在這些代碼之下是依賴於體系結構的代碼,構成了通常稱為 BSP(Board Support Package)的部分。這些代碼用作給定體系結構的處理器和特定於平台的代碼。

Linux 內核的屬性

在討論大型而復雜的系統的體系結構時,可以從很多角度來審視系統。體系結構分析的一個目標是提供一種方法更好地理解源代碼,這正是本文的目的。

Linux 內核實現了很多重要的體系結構屬性。在或高或低的層次上,內核被劃分為多個子系統。Linux 也可以看作是一個整體,因為它會將所有這些基本服務都集成到內核中。這與微內核的體系結構不同,後者會提供一些基本的服務,例如通信、I/O、內存和進程管理,更具體的服務都是插入到微內核層中的。每種內核都有自己的優點,不過這裡並不對此進行討論。

隨著時間的流逝,Linux 內核在內存和 CPU 使用方面具有較高的效率,並且非常穩定。但是對於 Linux 來說,最為有趣的是在這種大小和復雜性的前提下,依然具有良好的可移植性。Linux 編譯後可在大量處理器和具有不同體系結構約束和需求的平台上運行。一個例子是 Linux 可以在一個具有內存管理單元(MMU)的處理器上運行,也可以在那些不提供 MMU 的處理器上運行。Linux 內核的 uClinux 移植提供了對非 MMU 的支持。

Linux的主要子系統

現在使用圖 3 中的分類說明 Linux 內核的主要組件。

圖 3. Linux 內核的一個體系結構透視圖

本文URL地址:http://www.bianceng.cn/OS/Linux/201410/45417.htm

系統調用接口

SCI 層提供了某些機制執行從用戶空間到內核的函數調用。正如前面討論的一樣,這個接口依賴於體系結構,甚至在相同的處理器家族內也是如此。SCI 實際上是一個非常有用的函數調用多路復用和多路分解服務。在 ./linux/kernel 中您可以找到 SCI 的實現,並在 ./linux/arch 中找到依賴於體系結構的部分。

進程管理

進程管理的重點是進程的執行。在內核中,這些進程稱為線程,代表了單獨的處理器虛擬化(線程代碼、數據、堆棧和 CPU 寄存器)。在用戶空間,通常使用進程 這個術語,不過 Linux 實現並沒有區分這兩個概念(進程和線程)。內核通過 SCI 提供了一個應用程序編程接口(API)來創建一個新進程(fork、exec 或 Portable Operating System Interface [POSIX] 函數),停止進程(kill、exit),並在它們之間進行通信和同步(signal 或者 POSIX 機制)。

進程管理還包括處理活動進程之間共享 CPU 的需求。內核實現了一種新型的調度算法,不管有多少個線程在競爭 CPU,這種算法都可以在固定時間內進行操作。這種算法就稱為 O(1) 調度程序,這個名字就表示它調度多個線程所使用的時間和調度一個線程所使用的時間是相同的。 O(1) 調度程序也可以支持多處理器(稱為對稱多處理器或 SMP)。您可以在 ./linux/kernel 中找到進程管理的源代碼,在 ./linux/arch 中可以找到依賴於體系結構的源代碼。

內存管理

內核所管理的另外一個重要資源是內存。為了提高效率,如果由硬件管理虛擬內存,內存是按照所謂的內存頁 方式進行管理的(對於大部分體系結構來說都是 4KB)。Linux 包括了管理可用內存的方式,以及物理和虛擬映射所使用的硬件機制。

不過內存管理要管理的可不止 4KB 緩沖區。Linux 提供了對 4KB 緩沖區的抽象,例如 slab 分配器。這種內存管理模式使用 4KB 緩沖區為基數,然後從中分配結構,並跟蹤內存頁使用情況,比如哪些內存頁是滿的,哪些頁面沒有完全使用,哪些頁面為空。這樣就允許該模式根據系統需要來動態調整內存使用。

為了支持多個用戶使用內存,有時會出現可用內存被消耗光的情況。由於這個原因,頁面可以移出內存並放入磁盤中。這個過程稱為交換,因為頁面會被從內存交換到硬盤上。內存管理的源代碼可以在 ./linux/mm 中找到。

虛擬文件系統

虛擬文件系統(VFS)是 Linux 內核中非常有用的一個方面,因為它為文件系統提供了一個通用的接口抽象。VFS 在 SCI 和內核所支持的文件系統之間提供了一個交換層(請參看圖 4)。

圖 4. VFS 在用戶和文件系統之間提供了一個交換層

在 VFS 上面,是對諸如 open、close、read 和 write 之類的函數的一個通用 API 抽象。在 VFS 下面是文件系統抽象,它定義了上層函數的實現方式。它們是給定文件系統(超過 50 個)的插件。文件系統的源代碼可以在 ./linux/fs 中找到。

文件系統層之下是緩沖區緩存,它為文件系統層提供了一個通用函數集(與具體文件系統無關)。這個緩存層通過將數據保留一段時間(或者隨即預先讀取數據以便在需要是就可用)優化了對物理設備的訪問。緩沖區緩存之下是設備驅動程序,它實現了特定物理設備的接口。

網絡堆棧

網絡堆棧在設計上遵循模擬協議本身的分層體系結構。回想一下,Internet Protocol (IP) 是傳輸協議(通常稱為傳輸控制協議或 TCP)下面的核心網絡層協議。TCP 上面是 socket 層,它是通過 SCI 進行調用的。

socket 層是網絡子系統的標准 API,它為各種網絡協議提供了一個用戶接口。從原始幀訪問到 IP 協議數據單元(PDU),再到 TCP 和 User Datagram Protocol (UDP),socket 層提供了一種標准化的方法來管理連接,並在各個終點之間移動數據。內核中網絡源代碼可以在 ./linux/net 中找到。

設備驅動程序

Linux 內核中有大量代碼都在設備驅動程序中,它們能夠運轉特定的硬件設備。Linux 源碼樹提供了一個驅動程序子目錄,這個目錄又進一步劃分為各種支持設備,例如 Bluetooth、I2C、serial 等。設備驅動程序的代碼可以在 ./linux/drivers 中找到。

本文URL地址:http://www.bianceng.cn/OS/Linux/201410/45417.htm

依賴體系結構的代碼

盡管 Linux 很大程度上獨立於所運行的體系結構,但是有些元素則必須考慮體系結構才能正常操作並實現更高效率。./linux/arch 子目錄定義了內核源代碼中依賴於體系結構的部分,其中包含了各種特定於體系結構的子目錄(共同組成了 BSP)。對於一個典型的桌面系統來說,使用的是 i386 目錄。每個體系結構子目錄都包含了很多其他子目錄,每個子目錄都關注內核中的一個特定方面,例如引導、內核、內存管理等。這些依賴體系結構的代碼可以在 ./linux/arch 中找到。

以上的內容來自:http://www.ibm.com/developerworks/cn/linux/l-linux-kernel/

下面介紹內核緩沖區的內容:

為什麼總是需要將數據由內核緩沖區換到用戶緩沖區或者相反呢?

答:用戶進程是運行在用戶空間的,不能直接操作內核緩沖區的數據。 用戶進程進行系統調用的時候,會由用戶態切換到內核態,待內核處理完之後再返回用戶態

應用緩沖技術能很明顯的提高系統效率。內核與外圍設備的數據交換,內核與用戶空間的數據交換都是比較費時的,使用緩沖區就是為了優化這些費時的操作。其實核心到用戶空間的操作本身是不buffer的,是由I/O庫用buffer來優化了這個操作。比如read本來從內核讀取數據時是比較費時的,所以一次取出一塊,以避免多次陷入內核。

應用內核緩沖區的 主要思想就是一次讀入大量的數據放在緩沖區,需要的時候從緩沖區取得數據。

管理員模式和用戶模式之間的切換需要消耗時間,但相比之下,磁盤的I/O操作消耗的時間更多,為了提高效率,內核也使用緩沖區技術來提高對磁盤的訪問速度。磁盤是數據塊 的集合,內核會對磁盤上的數據塊做緩沖。內核將磁盤上的數據塊復制到內核緩沖區中,當一個用戶空間中的進程要從磁盤上讀數據時,內核一般不直接讀磁盤,而 是將內核緩沖區中的數據復制到進程的緩沖區中。當進程所要求的數據塊不在內核緩沖區時,內核會把相應的數據塊加入到請求隊列,然後把該進程掛起,接著為其 他進程服務。一段時間之後(其實很短的時間),內核把相應的數據塊從磁盤讀到內核緩沖區,然後再把數據復制到進程的緩沖區中,最後喚醒被掛起的進程。

注:理解內核緩沖區技術的原理有助於更好的掌握系統調用read&write,read把數據從內核緩沖區復制到進程緩沖區,write把數據從進程緩沖區復制到內核緩沖區,它們不等價於數據在內核緩沖區和磁盤之間的交換。

從理論上講,內核可以在任何時候寫磁盤,但並不是所有的write操作都會導致內核的寫動作。內核會把要寫的數據暫時存在緩沖區中,積累到一定數量後再一 次寫入。有時會導致意外情況,比如斷電,內核還來不及把內核緩沖區中的數據寫道磁盤上,這些更新的數據就會丟失。

應用內核緩沖技術導致的結果是:提高了磁盤的I/O效率;優化了磁盤的寫操作;需要及時的將緩沖數據寫到磁盤。

Copyright © Linux教程網 All Rights Reserved