核心物件緩衝區管理
linux 核心在執行過程中,常常會需要經常使用一些核心的資料結構(物件)。例如,當程序的某個執行緒第一次開啟乙個檔案的時候,核心需要為該檔案分配乙個稱為 file 的資料結構;當該檔案被最終關閉的時候,核心必須釋放此檔案所關聯的 file 資料結構。這些小塊儲存空間並不只在某個核心函式的內部使用,否則就可以使用當前執行緒的核心棧空間。同時,這些小塊儲存空間又是動態變化的,不可能像物理記憶體頁面管理使用的 page 結構那樣,有多大記憶體就有多少個 page 結構,形成乙個靜態長度的佇列。而且由於核心無法**執行中各種不同的核心物件對緩衝區的需求,因此不適合為每一種可能用到的物件建立乙個「緩衝池」,因為那樣的話很可能出現有些緩衝池已經耗盡而有些緩衝池中卻又大量空閒緩衝區的現象。因此,核心只能採取更全域性性的方法。
我們可以看出,核心物件的管理與使用者程序中的堆管理比較相似,核心問題均是:如何高效地管理記憶體空間,使得可以快速地進行物件的分配和**並減少記憶體碎片。但是核心不能簡單地採用使用者程序的基於堆的記憶體分配演算法,這是因為核心對其物件的使用具有以下特殊性:
核心使用的物件種類繁多,應該採用一種統一的高效管理方法。
核心對某些物件(如 task_struct)的使用是非常頻繁的,所以使用者程序堆管理常用的基於搜尋的分配演算法比如first-fit(在堆中搜尋到的第乙個滿足請求的記憶體塊)和 best-fit(使用堆中滿足請求的最合適的記憶體塊)並不直接適用,而應該採用某種緩衝區的機制。
核心物件中相當一部分成員需要某些特殊的初始化(例如佇列頭部)而並非簡單地清成全 0。如果能充分重用已被釋放的物件使得下次分配時無需初始化,那麼可以提高核心的執行效率。
分配器對核心物件緩衝區的組織和管理必須充分考慮對硬體快取記憶體的影響。
隨著共享記憶體的多處理器系統的普及,多處理器同時分配某種型別物件的現象時常發生,因此分配器應該盡量避免處理器間同步的開銷,應採用某種 lock-free 的演算法。
如何有效地管理緩衝區空間,長期以來都是乙個熱門的研究課題。90 年代初期,在 solaris 2.4 作業系統中,採用了一種稱為「slab」(原意是大塊的混凝土)的緩衝區分配和管理方法,在相當程度上滿足了核心的特殊需求。
Linux使用者態和核心態
一 unix linux的體系架構 如上圖所示,從巨集觀上來看,linux作業系統的體系架構分為使用者態和核心態 或者使用者空間和核心 核心從本質上看是一種軟體 控制計算機的硬體資源,並提供上層應用程式執行的環境。使用者態即上層應用程式的活動空間,應用程式的執行必須依託於核心提供的資源,包括cpu資...
Linux 核心態和使用者態
1.核心態 當乙個任務 程序 執行系統呼叫而陷入核心 中執行時,我們就稱程序處於核心執行態 或簡稱為核心態 此時處理器處於特權級最高的 0級 核心 中執行。當程序處於核心態時,執行的核心 會使用當前程序的核心棧。每個程序都有自己的核心棧。2.使用者態 當程序在執行使用者自己的 時,則稱其處於使用者執...
Linux 使用者態和核心態
系統呼叫是通向作業系統本身的介面,是面向底層硬體的。通過系統呼叫,可以使得使用者態執行的程序與硬體裝置 如cpu 磁碟 印表機等 進行互動,是作業系統留給應用程式的乙個介面。由作業系統實現 執行時,需要從使用者態切換到核心態 使用者態 當乙個程序在執行使用者自己的 時處於使用者執行態 使用者態 此時...