歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux2.6中的Slab層

Linux2.6中的Slab層

日期:2017/2/28 14:44:34   编辑:Linux教程

還記得一個進程創建的時候是什麼給它分配的“進程描述符”嗎?沒錯,是slab分配器,那麼,這個slab分配器是個什麼東西呢?

分配和釋放數據結構是所有內核中最普遍的操作之一。為了便於結構的頻繁分配和回收,編程人員常常會用到空閒鏈表。空閒鏈表中包含可供使用的,已經分配好的數據結構塊。當代碼需要一個新的數據結構實例時,就可以從空閒鏈表中抓取一個,而不需要再去執行一些分配內存的代碼,這樣不僅高效而且使用簡單。以後,當不需要這個數據結構時,我們不能簡單的釋放這塊內存,而是需要把它放回空閒鏈表中,畢竟,下次使用的時候我們還要使用呢。

在內核中,空閒鏈表面對的一個主要問題就是不能全局控制。當可用內存變得緊缺時,內核無法通知每個空閒鏈表,讓其收縮緩存的大小以便釋放出一些內存來。實際上,內核根本不知道存在任何空閒鏈表。為了解決這個問題,Linux內核引入了slab層的概念。slab分配器扮演了通用數據結構緩存層的角色。

slab層把不同的對象劃分為高速緩存,其中每個高速緩存組中存放的都是不同類型的數據結構對象。例如,一個高速緩存用於存放進程描述符,另一個高速緩存用於存放i節點。

之後,這些高速緩存又被劃分為slab。slab由一個或多個物理上連續的頁組成。一般情況下,slab也就僅僅一頁。每個高速緩存可以由多個slab組成,下圖顯示的就是高速緩存,slab,數據結構對象三者的關系:

每個slab都包含一些數據成員,這裡的成員指的是緩存的數據結構。每個slab處於三種狀態之一:滿,部分滿或空。

當內核的某一部分需要一個對象時,就要由slab分配了,首先考慮的是部分滿的slab,如果不存在部分滿的slab則去空的slab分配,如果也不存在空的slab,則內核需要申請頁重新分配高速緩存。

slab層的管理是在每個高速緩存的基礎上的,通過給整個內核一個簡單的接口來完成的。通過接口就可以創建和撤銷高速緩存,並在高速緩存內分配和釋放對象。高速緩存及其slab的復雜管理完全通過slab層的內部機制來處理。當你創建了一個高速緩存之後,slab層所起的作用就像一個專用的分配器,可以為具體的對象類型進行分配。

Copyright © Linux教程網 All Rights Reserved