Linux分區頁框分配器

2020-09-04 布道師Peter

我們現在知道物理內存是以頁框為最小單位存在的,那麼內核中分配頁框的方法是什麼呢?

分區頁框分配器

頁框分配在內核裡的機制我們叫做分區頁框分配器(zoned page frame allocator),在linux系統中,分區頁框分配器管理著所有物理內存,無論你是內核還是進程,都需要請求分區頁框分配器,這時才會分配給你應該獲得的物理內存頁框。當你所擁有的頁框不再使用時,你必須釋放這些頁框,讓這些頁框回到管理區頁框分配器當中。

有時候目標管理區不一定有足夠的頁框去滿足分配,這時候系統會從另外兩個管理區中獲取要求的頁框,但這是按照一定規則去執行的,如下:

  • 如果要求從DMA區中獲取,就只能從ZONE_DMA區中獲取。

  • 如果沒有規定從哪個區獲取,就按照順序從 ZONE_NORMAL -> ZONE_DMA 獲取。

  • 如果規定從HIGHMEM區獲取,就按照順序從 ZONE_HIGHMEM -> ZONE_NORMAL -> ZONE_DMA 獲取。

其函數接口

內核中根據不同的分配需求有6個函數接口來請求頁框,最終都會調用到__alloc_pages_nodemask。

可以看頁框分配器的核心函數是__alloc_pages_nodemask,在講這個函數之前我們先看下兩個標誌:

  • gfp_mask

  1. __GFP_DMA:請求在ZONE_DMA區域中分配頁面;

  2. __GFP_HIGHMEM:請求在ZONE_HIGHMEM區域中分配頁面;

  3. __GFP_MOVABLE:ZONE_MOVALBE可用時在該區域分配頁面,同時表示頁面分配後可以在內存壓縮時進行遷移,也能進行回收;

  4. __GFP_RECLAIMABLE:請求分配到可恢復頁面;

  5. __GFP_HIGH:高優先級處理請求;

  6. __GFP_IO:請求在分配期間進行 I/O 操作;

  7. __GFP_FS:請求在分配期間進行文件系統調用;

  8. __GFP_ZERO:請求將分配的區域初始化為 0;

  9. __GFP_NOFAIL:不允許請求失敗,會無限重試;

  10. __GFP_NORETRY:請求不重試內存分配請求;

  • alloc_flags

  1. ALLOC_WMARK_MIN:僅在最小水位water mark及以上限制頁面分配;

  2. ALLOC_WMARK_LOW:僅在低水位water mark及以上限制頁面分配;

  3. ALLOC_WMARK_HIGH:僅在高水位water mark及以上限制頁面分配;

  4. ALLOC_HARDER:努力分配,一般在gfp_mask設置了__GFP_ATOMIC時會使用;

  5. ALLOC_HIGH:高優先級分配,一般在gfp_mask設置了__GFP_HIGH時使用;

  6. ALLOC_CPUSET:檢查是否為正確的 cpuset;

  7. ALLOC_CMA:允許從 CMA 區域進行分配;

__alloc_pages_nodemask

struct page *
__alloc_pages_nodemask(gfp_t gfp_mask, unsigned int order, int preferred_nid,
nodemask_t *nodemask)
{
page = get_page_from_freelist(alloc_mask, order, alloc_flags, &ac);//fastpath分配頁面:從pcp(per_cpu_pages)和夥伴系統中正常的分配內存空間
......
page = __alloc_pages_slowpath(alloc_mask, order, &ac);//slowpath分配頁面:如果上面沒有分配到空間,調用下面函數慢速分配,允許等待和回收
......
}

在頁面分配時,有兩種路徑可以選擇,如果在快速路徑中分配成功了,則直接返回分配的頁面;快速路徑分配失敗則選擇慢速路徑來進行分配。總結如下:

  • 正常分配(或叫快速分配):

  1. 如果分配的是單個頁面,考慮從per CPU緩存中分配空間,如果緩存中沒有頁面,從夥伴系統中提取頁面做補充。

  2. 分配多個頁面時,從指定類型中分配,如果指定類型中沒有足夠的頁面,從備用類型鍊表中分配。最後會試探保留類型鍊表。

  • 慢速(允許等待和頁面回收)分配:

  1. 當上面兩種分配方案都不能滿足要求時,考慮頁面回收、殺死進程等操作後在試。


相關焦點

  • Linux分區頁框分配器之水位
    我們講頁框分配器的時候講到了快速分配和慢速分配,其中夥伴算法是在快速分配裡做的,忘記的小夥伴我們再看下:static struct page *get_page_from_freelist(gfp_t gfp_mask, unsigned int order, int alloc_flags,const struct alloc_context *
  • Linux頁框分配器之內存碎片化整理
    頁框分配器在慢速分配中包括內存碎片化整理和內存回收,代碼如下:static inline struct page *__alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,struct alloc_context *ac){page = __alloc_pages_direct_compact
  • GParted如何給Linux系統進行磁碟分區?
    GParted是一款非常好用的linux系統磁碟分區工具,那麼,GParted是怎麼給linux系統進行磁碟分區的呢?今天,我們的電腦使用教程中,就要來跟大家分享一下這個問題的解決方法。
  • linux磁碟分區命令--fdisk與parted
    linux前文簡單總結了如何掛載一個新硬碟進行硬碟分區,詳見Linux存儲管理二:磁碟分區和Linux存儲管理一:磁碟分區相關知識硬碟分區的命令沒來的及整理,今天系統整理一下linux分區常用的兩個命令:fdisk與parted。
  • Linux下使用fdisk擴展分區容量
    的過程中, 有時會因為安裝系統時分區不當導致有的分區空間不足,而有的分區空間過剩的情況,都可以是使用fdisk分區工具來動態調整分區的大小;硬碟空間為20G,使用vSphere Client增加磁碟大小,需要再增加10G空間;擴展完後,重啟系統,再次使用fdisk -l查看
  • linux-磁碟分區策略之邏輯卷lvm
    前言linux在安裝的時候就會涉及到分區的問題,可是如果分區太小了,後期要調整比較麻煩,lvm就是為了解決這種問題,可以實現動態擴容,不需要重新格式化磁碟進行分區了。邏輯卷組建之間的關係分區-->物理卷-->邏輯卷-->格式化成文件系統使用。
  • 只用線條就能搞定的多分區手繪手工書內頁排版,手帳適用
    有見面了~之前為大家分享了單分區的手工書內頁排版。今天為大家分享的是多分區的單線手繪內頁排版。這個排版是最簡單的單線條多分區手繪排版。給大家簡單介紹一下繪畫步驟。在我分享的繪畫步驟視頻中大家可以看到我是沒有起稿,用櫻花的軟頭筆直接畫的,但是在畫之前我在心裡是打了草稿的。第一步還是做分區。
  • linux之磁碟分區與文件系統
    linux之磁碟分區與文件系統磁碟分區與文件系統CPUI/O接口類型:IDE:兩塊設備,有主有從SCSI:並口:可以接多塊設備後64位元組:分區表:每16位元組標識一個分區,一共只能有4個分區最後2位元組:MBR區域的有效性標識;55AA為有效主分區和擴展分區的標識:1-4邏輯分區;5+fdisk命令:
  • Linux中fdisk硬碟分區方法
    一、fdisk 的介紹本文引用地址:http://www.eepw.com.cn/article/150723.htm  fdsik 能劃分磁碟成為若干個區,同時也能為每個分區指定分區的文件系統,比如linux 、fat32、 linux
  • 按時間順序清理linux分區的文件方法
    linux系統和windows系統磁碟分區不一樣。在windows系統我們通俗地稱C盤、D、E、F盤等。但在linux系統換了叫根分區(/),啟動分區(/boot),交換分區(/swap),家目錄分區(/home).文件匯出分區(/repout)等。
  • 如何寫入到Linux中的Windows分區?
    為什麼無法從Linux寫入到Windows分區? 之所以出現這種情況,是由於分區以只讀模式掛載。掛載Windows分區時,一些文件管理器會顯示通知對話框,對此發出警告。另一些文件管理器隻字未提,你根本無法在NTFS文件系統上執行任何寫入操作。
  • linux內核,三十個相關問題
    夥伴系統:(buddy system)需要談一談linux的內存分配系統linux內核採取了一種同時適用於32位和64位系統的內存分頁模型,對於32位系統,兩級頁表足夠用,而64位系統,需要四級頁表。分別為:頁全局目錄:包含一些頁上級目錄地址頁上級目錄:包含頁中間目錄地址頁中間目錄:包含一些頁表地址頁表: 指向頁框,linux中採用4kb大小的頁框作為標準的內存分配單元。
  • 花生殼,linux如何安裝在VM
    VM安裝linux,進行練習,花生殼動態域名伺服器,nat123離不開linux首先到centos鏡像下載站下載centos,然後新建虛擬機,選擇典型選擇下一步.語言選擇簡體中文,鍵盤滑鼠選擇默認,選擇"定製".選擇"手工分區".警告框選擇"是" 。 /boot 分區大小100Mswap交換分區一般是你的物理內存2倍,/ 根分區儘可能大
  • CentOS「linux」學習筆記12:磁碟管理、分區掛載卸載操作
    linux基礎操作:主要介紹了磁碟管理、分區掛載卸載操作。特別說明linux中磁碟表現形式:IDE硬碟在linux中表示方式為"hdx"。SCSI硬碟在linux中表示方式為"sdx"。,a,b,c,d通常是主分區或擴展分區,從第5塊硬碟開始基本都是邏輯分區。例子1:hda1 表示是第一塊IDE硬碟上的第一個分區。例子2:hdb2 表示是第二塊IDE硬碟上的第二個分區。例子3:sda1 表示是第一塊SCSI硬碟上的第一個分區。
  • 分配器原理
    導讀:本文主要介紹的是分配器的原理,感興趣的盆友們快來學習一下吧~~~很漲姿勢的哦~~~本文引用地址:http://www.eepw.com.cn/article/277145.htm1.分配器原理--簡介  分配器是有線電視傳輸系統中分配網絡裡最常用的部件
  • 淺談KunLun物理分區、邏輯分區和IO擴展框
    2018年,KunLun在支持原有的物理分區、邏輯分區的基礎上做了技術升級,同時推出了IO擴展框功能,以更好的滿足客戶對於關鍵業務整合的需求。下面我們就一起來看看物理分區、邏輯分區和IO擴展框有哪些功能,這些功能如何使用,為客戶帶來哪些價值。l  物理分區KunLun支持業界領先的物理分區技術(K-Par),並且具有高可靠、高性能等特點。
  • 什麼是分配器?分配器的用途有哪些?
    在地暖體系中,分配器是用於聯接採暖主幹供水管和回水管的設備。分為分水器和集水器兩部分。分水器是在水體系中,用於聯接各路加熱管供水管的配水設備。集水器是在水體系中,用於聯接各路加熱管回水管的匯水設備。什麼是分配器?分配器的用處有哪些?閥門商城對此做出了介紹。分配器的效果是什麼?
  • Linux加載ntfs和fat32分區
    一、最基本的幾個命令; 1、查看磁碟分區情況的命令fdisk -l ; 比如: 代碼: [root@localhost beinan]# /sbin/fdisk -l  Disk /dev/hda: 80.0 GB, 80026361856 bytes 255 heads, 63 sectors/track, 9729
  • RHCE認證考試模擬題深入講解:利用Fdisk將linux分區!
    RHCE認證考試模擬題深入講解:利用Fdisk將linux分區!本經驗由宗龍龍原創,全文共500多字,閱讀需要14分鐘,如果文中存在錯誤,還請大家多多指點,我會積極改進的!第一步,我們後續的內容還是會繼續使用linux的圖形化界面繼續操作及教學,如果誰有全套的認證考試試題,可以留言,將試題留言,下期可能就是深入講解你分享的認證試題。第二步,我們首先通過輸入sudo fdisk -1,查看磁碟的使用情況,但是,當我們使用zll帳戶的時候,並不能得到我們想要的結果,此時,我們可以嘗試使用root權限,查看磁碟。