閱讀413 返回首頁    go 阿裏雲 go 技術社區[雲棲]


Linux內核中常見內存分配函數(一)

linux內核中采 用了一種同時適用於32位和64位係統的內存分頁模型,對於32位係統來說,兩級頁表足夠用了,而在x86_64係 統中,用到了四級頁表。
  * 頁全局目錄(Page Global Directory)
  * 頁上級目錄(Page Upper Directory)
  * 頁中間目錄(Page Middle Directory)
  * 頁表(Page Table)
  頁全局目錄包含若幹頁上級目錄的地址,頁上級目錄又依次包含若幹頁中間目錄的地址
,而頁中間目錄又包含若幹頁表的地址,每一個頁表項指 向一個頁框。linux中采用4KB大小的 頁框作為標準的內存分配單元。
  多級分頁目錄結構
  夥伴係統算法
  在實際應用中,經常需要分配一組連續的頁框,而頻繁地申請和釋放不同大小的連續頁
框,必然導致在已分配頁框的內存塊中分散了許多小塊的 空閑頁框。這樣,即使這些頁框是空閑的,其他需要分配連續頁框的應用也很難得到滿足。
  為了避免出現這種情況,linux內核中引入了夥伴係統算法(buddy system)。把所有的空
       閑頁框分組為11個 塊鏈表,每個塊鏈表分別包含大小為1,2,4,8,16,32,64,128,256,512和1024個連續頁框的頁框塊。最大可以申請1024個連續頁框,對應4MB大小的連續內存。每個頁框塊的第一個頁框的物理地址是該塊大小的整數倍。
  假設要申請一個256個頁框的塊,先從256個頁框的鏈表中查找空閑塊,如果沒有,就
512個 頁框的鏈表中找,找到了則將頁框塊分為2個256個 頁框的塊,一個分配給應用,另外一個移到256個頁框的鏈表中。如果512個頁框的鏈表中仍沒有空閑塊,繼續向1024個頁 框的鏈表查找,如果仍然沒有,則返回錯誤。
  頁框塊在釋放時,會主動將兩個連續的頁框塊合並為一個較大的頁框塊。
  slab分 配器
  slab分配器源於 Solaris 2.4 的分配算法,工作於物理內存頁框分配器之上,管理特
定大小對象的緩存,進行快速而高效的內存分配。
  slab分配器為每種使用的內核對象建立單獨的緩衝區。linux 內核已經采用了夥伴係統
管理物理內存頁框,因此 slab分配器直接工作於夥伴係統之上。每種緩衝區由多個 slab
組成,每個 slab就是一組連續的物理內存頁框,被劃分成了固定數目的對象。根據對象大小的不同,缺省情況下一個slab 最多可以由 1024個頁框構成。出於對齊等其它方麵的要求,slab 中分配給對象的內存可能大於用戶要求的對象實際大小,這會造成一定的內存浪費。

最後更新:2017-04-03 16:48:51

  上一篇:go apache2中修改錯誤日誌中的錯誤級別
  下一篇:go Android如何查找應用中調用的係統資源