Kernel那些事儿之内存管理(2) --- 百闻不如一见
上次介紹了物理內存管理中三位主要人物中的node 和zone。這兩位是當官的,一個是縣長,一個是里長,不敢不先介紹啊。接下來出場的就是我們的老百姓了 --- page frame。
Page frame是物理內存的基本組成單位,在Kernel中由結構體?struct page 來描述。
struct?page?{unsigned?long?flags;atomic_t?_count;union?{atomic_t?_mapcount;unsigned?int?inuse;};union?{struct?{unsigned?long?private;struct?address_space?*mapping;?};struct?kmem_cache?*slab;????/*?SLUB:?Pointer?to?slab?*/struct?page?*first_page;????/*?Compound?tail?pages?*/};union?{pgoff_t?index;??????/*?Our?offset?within?mapping.?*/void?*freelist;?????/*?SLUB:?freelist?req.?slab?lock?*/};struct?list_head?lru;?????? };這個結構體是不是長得很有特色?它里面的'union'特別多。
在中國,有好多大家不喜歡的制度,歸根到底就一個原因 --- 人多。所以才有了戶口制度來限制城市人口,所以才會采用高考制度來篩選人才。。。
在內存管理中,我們也面臨著相同的問題 --- 內存頁太多。假設我們有1G內存,采用4K的分頁,則會有262144 (26萬)個內存頁,相應的就需要26萬個struct page結構體。如果該結構體的大小增加一點點,放大26萬倍,增加的內存消耗就很可觀了。
為此,Kernel是絞盡了腦汁來減少該結構體的大小。畢竟全國百姓那么多,每個人多分配點田地,那整體的田地消耗太大。不像縣長或里長這些當官的,數量有限,每個人多貪污點也影響不大。
Kernel采取的措施就是盡可能地重用同一個成員變量。房子大小有限,只能是白天當書房,晚上當臥室。
這就是為啥這個結構體中大量的使用了union。
flags: 用來描述page frame的屬性或狀態。
_count:這個沒啥好說的,使用計數器。
_mapcount:也是個計數器,不過這里只是統計頁表中有多少頁表項指向該page frame。
inuse, slab, freelist:由slub使用,暫且略去不講。
private:這個。。不同的使用場景下表示的含義也不同。為了節省空間而重用成員變量的另一種形式。是攻還是受,得看遇到了誰。
mapping:這個也是個多重人格,攻受兼備的主。一般會和 index 配合,表示在page cache中該page frame屬于哪個address space。以后會詳細講到。
first_page: 在compound page中指向帶頭大哥。
lru: 還記不記得在結構體zone中有兩個鏈表:active_list, inactive_list。嗯,lru就是干這個用的。
百聞不如一見。我們拿一個具體的例子,看看這三位人物的主要屬性是怎么賦值的。
該實例中物理內存被分為兩個node。
struct?pglist_data?{node_zones?=?ffff810000008101,node_zonelists?=?ffff81000000ad01,nr_zones?=?3,node_mem_map?=?0xffff8117df000000,node_start_pfn?=?0,node_present_pages?=?25162223,node_spanned_pages?=?25427968,node_id?=?0,kswapd_wait?=?ffff81000000d619,kswapd?=?0xffff8117a27e3300,kswapd_max_order?=?0 }我們以第一個Node為例,它被分成了三個zones:DMA, DMA32 and Normal。
??node_zones?=?{{pages_min?=?0,pages_low?=?0,pages_high?=?0,lowmem_reserve?=?{0,?2978,?96722,?96722},node?=?0,free_area?=active_list?=?{next?=?0xffff810000008a91,prev?=?0xffff810000008a91},inactive_list?=?{next?=?0xffff810000008aa1,prev?=?0xffff810000008aa1},nr_scan_active?=?0,nr_scan_inactive?=?0,pages_scanned?=?0,prev_priority?=?12,wait_table?=?0xffff810000001000,wait_table_hash_nr_entries?=?16,wait_table_bits?=?4,zone_pgdat?=?0xffff810000008101,zone_start_pfn?=?0,spanned_pages?=?4096,present_pages?=?1233,name?=?0xffffffff8058c55c?"DMA"},?{pages_min?=?216,pages_low?=?270,pages_high?=?324,lowmem_reserve?=?{0,?0,?93744,?93744},node?=?0,free_area?=?active_list?=?{next?=?0xffff810000009591,prev?=?0xffff810000009591},inactive_list?=?{next?=?0xffff8100000095a1,prev?=?0xffff8100000095a1},nr_scan_active?=?0,nr_scan_inactive?=?0,pages_scanned?=?0,prev_priority?=?12,wait_table?=?0xffff810001000000,wait_table_hash_nr_entries?=?4096,wait_table_bits?=?12,zone_pgdat?=?0xffff810000008101,zone_start_pfn?=?4096,spanned_pages?=?1044480,present_pages?=?762517,name?=?0xffffffff8056824d?"DMA32"},?{pages_min?=?6819,pages_low?=?8523,pages_high?=?10228,lowmem_reserve?=?{0,?0,?0,?0},node?=?0,free_area?=active_list?=?{next?=?0xffff81180da37e68,prev?=?0xffff81183d80b528},inactive_list?=?{next?=?0xffff81180f4e6be8,prev?=?0xffff81183d823b68},nr_scan_active?=?0,nr_scan_inactive?=?0,pages_scanned?=?0,prev_priority?=?12,wait_table?=?0xffff810001020000,wait_table_hash_nr_entries?=?4096,wait_table_bits?=?12,zone_pgdat?=?0xffff810000008101,zone_start_pfn?=?1048576,spanned_pages?=?24379392,present_pages?=?23998464,name?=?0xffffffff80568253?"Normal" }至此物理內存管理中三位主要人物就介紹完了。他們之間都有些什么恩怨情仇血雨腥風的故事呢?敬請期待!
轉載于:https://blog.51cto.com/richardguo/1663808
創作挑戰賽新人創作獎勵來咯,堅持創作打卡瓜分現金大獎總結
以上是生活随笔為你收集整理的Kernel那些事儿之内存管理(2) --- 百闻不如一见的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: GridView应用整理
- 下一篇: 解决问题:HTTP 错误 401.1 -