自拍偷在线精品自拍偷,亚洲欧美中文日韩v在线观看不卡

Linux中的slab分配器講解

運維 系統(tǒng)運維
Linux最近幾年的發(fā)展迅速,很多中小企業(yè)網站都安裝了Linux操作系統(tǒng)。本文將著重介紹Linux內核的內存管理,尤其是slab分配提供的機制。將探索slab分配器背后所采用的思想,并介紹這種方法提供的接口和用法。

Linux最近幾年的發(fā)展迅速,很多中小企業(yè)網站都安裝了Linux操作系統(tǒng)。本文將著重介紹Linux內核的內存管理,尤其是slab分配提供的機制。將探索slab分配器背后所采用的思想,并介紹這種方法提供的接口和用法。

slab 緩存

Linux所使用的slab分配器的基礎是Jeff Bonwick為SunOS操作系統(tǒng)首次引入的一種算法。Jeff 的分配器是圍繞對象緩存進行的。在內核中,會為有限的對象集(例如文件描述符和其他常見結構)分配大量內存。Jeff發(fā)現(xiàn)對內核中普通對象進行初始化所需的時間超過了對其進行分配和釋放所需的時間。

因此他的結論是不應該將內存釋放回一個全局的內存池,而是將內存保持為針對特定目而初始化的狀態(tài)。例如,如果內存被分配給了一個互斥鎖,那么只需在為互斥鎖首次分配內存時執(zhí)行一次互斥鎖初始化函數(mutex_init)即可。后續(xù)的內存分配不需要執(zhí)行這個初始化函數,因為從上次釋放和調用析構之后,它已經處于所需的狀態(tài)中了。

Linux slab分配器使用了這種思想和其他一些思想來構建一個在空間和時間上都具有高效性的內存分配器。

圖 1 給出了slab結構的高層組織結構。在最高層是cache_chain,這是一個slab緩存的鏈接列表。這對于best-fit算法非常有用,可以用來查找最適合所需要的分配大小的緩存(遍歷列表)。cache_chain的每個元素都是一個 kmem_cache 結構的引用(稱為一個 cache)。它定義了一個要管理的給定大小的對象池。

圖 1. slab 分配器的主要結構

     圖  1. slab 分配器的主要結構 

每個緩存都包含了一個 slabs 列表,這是一段連續(xù)的內存塊(通常都是頁面)。存在 3 種 slab:

slabs_full
完全分配的 slab
slabs_partial
部分分配的 slab
slabs_empty
空slab,或者沒有對象被分配
注意 slabs_empty 列表中的 slab是進行回收(reaping)的主要備選對象。正是通過此過程,slab 所使用的內存被返回給操作系統(tǒng)供其他用戶使用。

slab列表中的每個slab都是一個連續(xù)的內存塊(一個或多個連續(xù)頁),它們被劃分成一個個對象。這些對象是從特定緩存中進行分配和釋放的基本元素。注意 slab 是 slab分配器進行操作的最小分配單位,因此如果需要對slab進行擴展,這也就是所擴展的最小值。通常來說,每個slab被分配為多個對象。

由于對象是從slab中進行分配和釋放的,因此單個slab可以在 slab 列表之間進行移動。例如,當一個slab中的所有對象都被使用完時,就從slabs_partial 列表中移動到 slabs_full 列表中。當一個 slab 完全被分配并且有對象被釋放后,就從 slabs_full 列表中移動到 slabs_partial 列表中。當所有對象都被釋放之后,就從 slabs_partial 列表移動到 slabs_empty 列表中。

slab背后的動機

與傳統(tǒng)的內存管理模式相比, slab緩存分配器提供了很多優(yōu)點。首先,內核通常依賴于對小對象的分配,它們會在系統(tǒng)生命周期內進行無數次分配。slab 緩存分配器通過對類似大小的對象進行緩存而提供這種功能,從而避免了常見的碎片問題。slab分配器還支持通用對象的初始化,從而避免了為同一目而對一個對象重復進行初始化。最后,slab分配器還可以支持硬件緩存對齊和著色,這允許不同緩存中的對象占用相同的緩存行,從而提高緩存的利用率并獲得更好的性能。

【編輯推薦】

  1. 輕松應用Linux連接校園網
  2. 全面了解Linux進程技術
  3. Linux中的password命令介紹
  4. 學好Linux 了解Linux監(jiān)管命令
  5. Linux查看所有進程ps -aux命令介紹
責任編輯:小霞 來源: 百度
相關推薦

2021-08-03 09:02:58

LinuxSlab算法

2024-12-11 08:18:11

2023-04-03 08:25:02

Linux內存slub

2013-10-12 11:15:09

Linux運維內存管理

2024-10-11 10:00:20

2020-12-15 08:54:06

Linux內存碎片化

2025-04-11 00:44:00

2013-10-14 10:41:41

分配器buddy syste

2017-02-08 08:40:21

C++固定內存塊

2017-01-17 16:17:48

C++固定分配器

2017-01-20 14:21:35

內存分配器存儲

2020-03-11 13:44:20

編程語言PythonJava

2014-09-01 10:09:44

Linux

2023-04-13 14:42:26

PoE供電器PoE交換機

2025-02-10 07:30:00

malloc內存分配器內存

2024-10-28 11:25:21

豐巢快遞jemalloc

2023-12-22 07:55:38

Go語言分配策略

2022-02-23 16:49:19

Linux內存數據結構

2020-07-07 07:57:39

Linux內存碎片化

2009-12-25 15:24:16

內存管理
點贊
收藏

51CTO技術棧公眾號