核心基礎層提供的服務 核心中使用記憶體

2021-08-07 21:17:49 字數 1216 閱讀 2440

linux記憶體關係參考:

很詳細很清晰

linux採用夥伴系統解決外部碎片的問題,採用slab解決內部碎片的問題。

避免外部碎片的方法有兩種:

一種是之前介紹過的利用非連續記憶體的分配;

一種是用一種有效的方法來監視記憶體,保證在核心只要申請一小塊記憶體的情況下,不會從大塊的連續空閒記憶體中擷取一段過來,從而保證了大塊記憶體的連續性和完整性。

顯然,前者不能成為解決問題的普遍方法,一來用來對映非連續記憶體線性位址空間有限,二來每次對映都要改寫核心的頁表,進而就要重新整理tlb,這使得分配的速度大打折扣,這對於要頻繁申請記憶體的核心顯然是無法忍受的。因此linux採用後者來解決外部碎片的問題,也就是著名的夥伴系統。

夥伴系統:

夥伴系統的宗旨就是用最小的記憶體塊來滿足核心的對於記憶體的請求。在最初,只有乙個塊,也就是整個記憶體,假如為1m大小,而允許的最小塊為64k,那麼當我們申請一塊200k大小的記憶體時,就要先將1m的塊**成兩等分,各為512k,這兩分之間的關係就稱為夥伴,然後再將第乙個512k的記憶體塊**成兩等分,各位256k,將第乙個256k的記憶體塊分配給記憶體,這樣就是乙個分配的過程。

slab系統:

slab分配器是linux記憶體管理中非常重要和複雜的一部分,其工作是針對一些經常分配並釋放的物件,如程序描述符等,這些物件的大小一般比較小,如果直接採用夥伴系統來進行分配和釋放,不僅會造成大量的內碎片,而且處理速度也太慢。而slab分配器是基於物件進行管理的,相同型別的物件歸為一類(如程序描述符就是一類),每當要申請這樣乙個物件,slab分配器就從乙個slab列表中分配乙個這樣大小的單元出去,而當要釋放時,將其重新儲存在該列表中,而不是直接返回給夥伴系統。slab分配物件時,會使用最近釋放的物件記憶體塊,因此其駐留在cpu快取記憶體的概率較高。

slub系統:

slab分配器一直處於核心記憶體管理的核心地位,儘管如此,它還是擁有自身的缺點,最明顯的兩點就是複雜性和過多的管理資料造成的記憶體上的開銷。針對這些問題,linux引入了slub分配器,slub分配器保留了slab分配器的所有介面,實際上slub分配器的模型和slab分配的模型是基本一致的,只不過在一些地方進行了精簡,這也使得slub分配器工作起來更為游刃有餘。兩者主要的區別如下:

(1)核心基礎層提供的服務

作業系統通常提供的服務是記憶體管理 程序管理 裝置管理 檔案系統 核心提供了兩個層次的記憶體分配介面 從夥伴系統分配 從slab系統分配。夥伴系統是最底層的記憶體管理機制,提供頁式的記憶體管理。slab是夥伴系統之上的記憶體管理,提供基於物件的記憶體管理。從夥伴系統分配記憶體呼叫的是alloc pa...

linux核心中使用定時器

一 使用linux 核心定時器 linux 核心定時器採用系統時鐘來實現,linux 核心定時器使用很簡單,只需要提供超時時間 相當於定時值 和定時處理函式即可,當超時時間到了以後設定的定時處理函式就會執行,和我們使用硬體定時器的套路一樣,只是使用核心定時器不需要做一大堆的暫存器初始化工作。在使用核...

Linux核心裝置驅動之核心中煉表的使用筆記整理

核心中煉表的應用 1 介紹 在linux核心中使用了大量的鍊錶結構來組織資料,包括裝置列表以及各種功能模組中的資料組織。這些鍊錶大多採用在include linux list.h實現的乙個相當精彩的鍊錶資料結構。鍊錶資料結構的定義很簡單 struct list head list head結構包含兩...