linux内核 -内存管理模块概图
1.從進程(task)的角度來看內存管理
- 每個進程對應一個task_struct;
- 每個task_struct 里面包含指向mm_struct 的指針mm,
mm_struct 里面的主要成員:
a. 指向vma鏈表的頭指針:mmap
b. 指向vma紅黑樹的根節(jié)點: mm_rb
c. 指向進程列表的指針pgb; - vma(vm_area_struct): 進程虛存管理的最基本的管理單元應該是struct vm_area_struct了,它描述的是一段連續(xù)的、具有相同訪問屬性的虛存空間,該虛存空間的大小為物理內存頁面的整數(shù)倍。通常,進程所使用到的虛存空間不連續(xù),且各部分虛存空間的訪問屬性也可能不同。所以一個進程的虛存空間需要多個vm_area_struct結構來描述。
結構體的主要成員:
a. vma的起始和結束地址;
b. 指向vma 前后節(jié)點的指針
c. 指向當前vma在紅黑樹中的位置指針;
d. 指向當前vma所歸屬的mm_struct 的指針;
2.從物理頁面(page)的角度來看待內存管理
- mem_map[] 里面包含了所有的物理頁面,可以通過索引來訪問。
每一個物理頁面用 struct page來表示,page 里面的主要成員介紹:
a. flags里面包含了當前頁面的標志
另外也包含了其所屬的zone的標志。
b. mapping:表示這個頁面指向的地址空間。反響映射(reverse mapping)時使用,比如頁面回收時。
c. _mapcount:表示這個頁面被進程映射的個數(shù)。
d. _count:內核中引用該頁面的次數(shù),當其為0時,表示這個頁面空閑。struct zone:
zone 里面的主要成員介紹:
a. watermark[]: zone的3個水位值:min/low/high, 在kswapd頁面回收中會用到;
b. lowmem_reserve[]: zone中遺留的內存:
https://blog.csdn.net/kickxxx/article/details/883573
kernel在分配內存時,可能會涉及到多個zone,分配會嘗試從zonelist第一個zone分配,如果失敗就會嘗試下一個低級的zone(這里的低級僅僅指zone內存的位置,實際上低地址zone是更稀缺的資源)。我們可以想像應用進程通過內存映射申請Highmem 并且加mlock分配,如果此時Highmem zone無法滿足分配,則會嘗試從Normal進行分配。這就有一個問題,來自Highmem的請求可能會耗盡Normal zone的內存,而且由于mlock又無法回收,最終的結果就是Normal zone無內存提供給kernel的正常分配,而Highmem有大把的可回收內存無法有效利用。
因此針對這個case,使得Normal zone在碰到來自Highmem的分配請求時,可以通過lowmem_reserve聲明:可以使用我的內存,但是必須要保留lowmem_reserve[NORMAL]給我自己使用。
同樣當從Normal失敗后,會嘗試從zonelist中的DMA申請分配,通過lowmem_reserve[DMA],限制來自HIGHMEM和Normal的分配請求。
c. zone_pgdat: 指向內存節(jié)點
在UMA系統(tǒng)上,只使用一個NUMA結點來管理整個系統(tǒng)內存
d. lruvec: LRU的鏈表集合,用于內存頁面回收(page reclaim)
共5個鏈表:
匿名頁面的不活躍鏈表、匿名頁面的活躍鏈表
文件頁面的不活躍鏈表、文件頁面的活躍鏈表
不可回收頁面鏈表
struct lruvec {struct list_head lists[NR_LRU_LISTS];struct zone_reclaim_stat reclaim_stat;
#ifdef CONFIG_MEMCGstruct zone *zone;
#endif
};
enum lru_list { LRU_INACTIVE_ANON = LRU_BASE, LRU_ACTIVE_ANON = LRU_BASE + LRU_ACTIVE, LRU_INACTIVE_FILE = LRU_BASE + LRU_FILE, LRU_ACTIVE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,LRU_UNEVICTABLE,NR_LRU_LISTS
};
3.task里面的vma和page怎么關聯(lián)呢?
下一節(jié)詳細研究
總結
以上是生活随笔為你收集整理的linux内核 -内存管理模块概图的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 二维指针删除单向链表
- 下一篇: 硬盘多少钱