Linux操作系統分析8 memory.ppt_第1頁
Linux操作系統分析8 memory.ppt_第2頁
Linux操作系統分析8 memory.ppt_第3頁
Linux操作系統分析8 memory.ppt_第4頁
Linux操作系統分析8 memory.ppt_第5頁
已閱讀5頁,還剩55頁未讀, 繼續(xù)免費閱讀

下載本文檔

版權說明:本文檔由用戶提供并上傳,收益歸屬內容提供方,若內容存在侵權,請進行舉報或認領

文檔簡介

1、Linux操作系統分析,中國科學技術大學計算機系 陳香蘭(051287161312) Autumn 2010,內存管理,2020/8/3,Linux OS Analysis,3/59,內存管理,在前面已經提到: Linux如何有效地利用x86的分段和分頁機制把邏輯地址轉換為物理地址 RAM的某些部分永久地分配給內核,用以存放內核代碼以及靜態(tài)數據 RAM的其余部分稱為動態(tài)存儲器(dynamic memory),2020/8/3,Linux OS Analysis,4/59,Linux內核的前512個頁框(假定內核所需內存1MB,from ULK2),不可用的頁框,可用的頁框,內核代碼,初始化過的

2、內核數據,未初始化過的內核數據,2020/8/3,Linux OS Analysis,5/59,動態(tài)存儲器,進程和內核都需要動態(tài)存儲器 屬于稀缺資源 整個系統的性能取決于如何有效地管理動態(tài)存儲器 對動態(tài)存儲器的使用要進行優(yōu)化 原則:對于動態(tài)存儲器要盡可能做到: 按需分配,不需要時釋放,2020/8/3,Linux OS Analysis,6/59,主要內容,內核如何給自己分配動態(tài)存儲器 頁框管理 小內存管理 非連續(xù)存儲區(qū)管理,2020/8/3,Linux OS Analysis,7/59,1、頁框管理,Linux采用頁作為內存管理的基本單位 Linux采用的標準的頁框大小為4KB 由分頁單元引

3、發(fā)的缺頁異常很容易得到解釋 4KB是大多數磁盤塊大小的倍數 傳輸效率高 管理方便 例如:512M的物理內存對應于?個頁框?,2020/8/3,Linux OS Analysis,8/59,內核必須記錄每個頁框的當前狀態(tài) 哪些屬于進程,哪些存放了內核代碼/數據 對于動態(tài)存儲器中的頁框:是否空閑,即是否可用 如果一個頁框不可用,內核需要知道是誰在用這個頁框 用戶態(tài)進程、動態(tài)分配的內核數據結構、靜態(tài)的內核代碼、頁面cache、設備驅動程序緩沖的數據等等,2020/8/3,Linux OS Analysis,9/59,頁描述符,內核使用頁描述符來跟蹤管理物理內存 每個物理頁框都用一個頁描述符表示 頁描

4、述符用struct page的結構描述 參見mm_types.h 所有物理頁框的描述符,組織在mem_map的數組中,2020/8/3,Linux OS Analysis,10/59,mem_map數組,每個物理頁框,使用一個struct page表示,它們組織在mem_map數組中,相當于物理內存的一個縮影,2020/8/3,Linux OS Analysis,11/59,頁描述符中的各個字段將在用到時再逐步介紹,首先看一下 count:頁的使用引用計數器 0:空閑 0:頁已經分配給一個或多個進程或用戶某些內核數據結構 flags:頁框狀態(tài),最多可以有32個,每個使用一個位表示,2020/8

5、/3,Linux OS Analysis,12/59,頁框狀態(tài),2020/8/3,Linux OS Analysis,13/59,頁描述符將會占用很大的一段空間,由于每個struct page結構小于64個字節(jié),因此1MB的內存需要使用約4個頁面來存放mem_map數組 假若系統中存在512MB的內存,那么大約需要?,2020/8/3,Linux OS Analysis,14/59,關于NUMA,不考慮 物理內存被劃分為若干個node 存取時間不等 考慮CPU局部性 Node使用數據結構pg_data_t描述 每個node被劃分成若干個zone,2020/8/3,Linux OS Analys

6、is,15/59,存儲區(qū)(Memory Zones),在一個理想的體系結構中,一個頁框就是一個物理存儲單元,可以用于任何事情,例如 存放內核數據/用戶數據/緩存磁盤數據等 實際上存在硬件制約:一些頁框由于自身的物理地址的原因不能被一些任務所使用,例如 ISA總線的DMA控制器只能對ram的前16M尋址 在一些具有大容量ram的32位計算機中,CPU不能直接訪問所有的物理存儲器,因為線性地址空間不夠,2020/8/3,Linux OS Analysis,16/59,zone,為了應付這種限制,Linux把具有同樣性質的物理內存劃分成區(qū)(zones) Linux把物理存儲器劃分為4個區(qū) ZONE_

7、DMA ZONE_DMA32 (未見用) ZONE_NORMAL ZONE_HIGHMEM 參見枚舉類型zone_type,ZONE_DMAZONE_NORMALZONE_HIGHMEM,物理內存,0,16MB,896MB,MAX,2020/8/3,Linux OS Analysis,17/59,ZONE_DMA 和ZONE_NORMAL區(qū)包含存儲器的“常規(guī)”頁,通過把它們映射到線性地址空間的3GB以上,內核就可直接訪問 而ZONE_HIGHMEN區(qū)中包含的存儲器頁面不能由內核直接訪問,MAX,ZONE_DMA ZONE_NORMALZONE_HIGHMEM,物理內存,0,16MB,896MB

8、,線性空間,3G,3GB,4GB,3GB+16MB,3GB+896MB,2020/8/3,Linux OS Analysis,18/59,每個zone使用struct zone表示 關鍵:free_area 小結: Mem_map、node、zone之間的關系,2020/8/3,Linux OS Analysis,19/59,動態(tài)內存,內存布局: 動態(tài)內存及引用它的一些值,2020/8/3,Linux OS Analysis,20/59,請求頁框,內核實現了一種底層的內存分配機制,并提供了幾個接口供其他內核函數調用。 分配: alloc_pages/alloc_page/alloc_pages

9、_node/alloc_pages_current/ _get_free_pages/_get_free_page/_get_dma_pages/get_zeroed_page 釋放 free_pages/_free_pages/free_page/_free_page,2020/8/3,Linux OS Analysis,21/59,調用關鍵函數:get_page_from_freelist,2020/8/3,Linux OS Analysis,22/59,類似alloc_pages,但是返回第一個 所分配頁框的線性地址,分配一個頁框,返回值同上,用來分配適用于DMA的頁框,2020/8/3

10、,Linux OS Analysis,23/59,這個函數與_get_free_page基本等價, 差別在于它把所分配頁框中的頁面數據 全部清0。 這在給用戶態(tài)的空間分配頁框時候很有 用。因為這個頁框雖然是可被分配的, 但是里面的數據可能包含了內核的一些 敏感信息。 清0,可以避免信息泄露,2020/8/3,Linux OS Analysis,24/59,關于unsigned int gfp_mask,指明可在何處并以何種方式查找空閑的頁框 GFP_ATOMIC,這種分配是高優(yōu)先級的并且不能睡眠。一般在中斷處理程序,下半部分和其他不能睡眠的場合下使用 GFP_KERNEL,這是普通的分配模式,

11、允許睡眠。一般在用戶進程可能調用到的內核函數中使用,這個時候進程是可以安全的睡眠的 GFP_DMA,設備驅動程序需要DMA內存時使用,2020/8/3,Linux OS Analysis,25/59,關于gfp_mask的進一步解釋,標志位及其含義,2020/8/3,Linux OS Analysis,26/59,2020/8/3,Linux OS Analysis,27/59,等等,2020/8/3,Linux OS Analysis,28/59,釋放頁框,如果page對應的頁框不是被保留的頁框(PG_reserved標志為0),就 把描述符的count字段減1。如果count變?yōu)?,就調用

12、釋放,與上一個函數類似,只是第一個參數是要釋放的 第一個頁框的線性地址addr,2020/8/3,Linux OS Analysis,29/59,在內核中釋放頁框時要非常小心,必須確保只釋放了所請求的頁框,否則內核可能會崩潰,page = _get_free_page(GFP_KERNEL,3); If (!page) /*如果內存不足,分配失敗,必須在這里處理這個失敗*/ /*現在page變量指向了8個連續(xù)頁框的起始線性地址*/ free_pages(page,3); /*現在頁框被釋放,不應該再對page中存放的線性地址進行操作*/,2020/8/3,Linux OS Analysis,3

13、0/59,頁框的管理,內核要為分配一組連續(xù)的頁框建立一種穩(wěn)定、高效的分配策略 這種策略要解決(外部)碎片問題: 頻繁的請求和釋放不同大小的一組連續(xù)頁框,必然導致在物理頁框中分散許多小塊的空閑頁框 這樣,即使有足夠的空閑頁框滿足請求,但要分配一個大塊的連續(xù)頁框可能就無法滿足了,2020/8/3,Linux OS Analysis,31/59,有兩種辦法可以避免這樣的碎片 利用MMU把一組非連續(xù)的物理空閑頁框映射到連續(xù)的線性地址空間 使用一種適當的技術來記錄現存的空閑連續(xù)頁框的情況,以盡量避免為滿足對小塊的請求而把大塊的空閑塊進行分割 基于下面的原因,Linux內核首選第二種方法 在某些情況下,必

14、須使用連續(xù)的頁框,如DMA 盡量少的修改內核頁表,2020/8/3,Linux OS Analysis,32/59,buddy算法(伙伴算法),Linux使用著名的伙伴算法來解決碎片問題。 把所有空閑頁框分組為10(Linux2.6.26為11)個塊鏈表,每個塊鏈表分別包含大小為1,2,4,8,16,32,64,128,256和512個連續(xù)的頁框 每個塊的第一個頁框的物理地址是該塊大小的整數倍 例如:大小為16個頁框的塊,其起址是164KB的倍數,2020/8/3,Linux OS Analysis,33/59,伙伴的定義,例如:0和1是伙伴,1和2不是伙伴 兩個伙伴的大小必須相同,物理地址必

15、須連續(xù) 假定伙伴的大小為b 那么第一個伙伴的物理地址必須是2b4KB對齊 事實上伙伴是通過對大塊的物理內存劃分獲得的 假如從第0個頁面開始到第3個頁面結束的內存 每次都對半劃分,那么第一次劃分獲得大小為2頁的伙伴 進一步劃分,可以獲得大小為1頁的伙伴,例如0和1,2和3,0,1,2,3,0,1,2,3,2020/8/3,Linux OS Analysis,34/59,數據結構,Linux為每個zone使用各自獨立的伙伴系統 每個伙伴系統使用的主要數據結構為: 空閑內存管理數組free_area,2020/8/3,Linux OS Analysis,35/59,mem_map數組 前面介紹過的頁

16、描述符數組 每個頁描述符描述一個物理頁框 整個mem_map數組描述整個zone中的所有的物理內存 空閑內存管理數組 空閑內存按照伙伴管理的方法進行組織 使用free_area結構,2020/8/3,Linux OS Analysis,36/59,伙伴,當兩個伙伴都為空閑的時候,就合并成一個更大的塊 該過程將一直進行,直到找不到可以合并的伙伴為止 尋找伙伴 給定一個要釋放的空閑塊 找到其伙伴 查看其狀態(tài):合并 or 不合并,2020/8/3,Linux OS Analysis,37/59,舉例,假設有128MB的ram。 128MB最多可以分成215=32768個頁框,214=16384個8K

17、B(2頁)的塊或213=8192個16KB(4頁)的塊,直至64個大小為512個頁的塊 假設要請求一個大小為128個頁框的塊(0.5MB)。 算法先free_area7中檢查是否有空閑塊(塊大小為128個頁框) 若沒有,就到free_area8中找一個空閑塊(塊大小為256個頁框) 若存在這樣的塊,內核就把256個頁框分成兩等份,一半用作滿足請求,另一半插入free_area7中 如果在free_area8中也沒有空閑塊,就繼續(xù)找free_area9中是否有空閑塊。,2020/8/3,Linux OS Analysis,38/59,若有,先將512分成伙伴,一個插入free_area8中,另一

18、個進一步劃分成伙伴,取其一插入free_area7中,另一個分配出去 如果free_area9也沒有空閑塊,內存不夠,返回一個錯誤信號,2020/8/3,Linux OS Analysis,39/59,內存的分配與回收,閱讀相關代碼 關鍵:nr_free _free_one_page _rmqueue,buffered_rmqueue,get_page_from_freelist,_alloc_pages_internal,_alloc_pages,free_one_page,_free_pages_ok,_free_pages,mm/page_alloc.c,2020/8/3,Linux O

19、S Analysis,40/59,2020/8/3,Linux OS Analysis,41/59,2020/8/3,Linux OS Analysis,42/59,線 性 空 間 ( 3GB4GB),頁框管理小結,頁描述符 Mem_map數組 Zone 空閑頁框的管理,線性空間(3GB),物理內存:highmem,Mem_map 數 組,物理內存: DMA,物理內存: Normal,Zone_dma,Zone_normal,Zone_highmem,空閑頁框管理,空閑頁框管理,空閑頁框管理,伙伴算法,2020/8/3,Linux OS Analysis,43/59,2、內存區(qū)管理(memor

20、y area),單單分配頁面的分配器肯定是不能滿足要求的 內核中大量使用各種數據結構,大小從幾個字節(jié)到幾十上百k不等,都取整到2的冪次個頁面那是完全不現實的 早期內核的解決方法是提供大小為2,4,8,16,.,131056字節(jié)的內存區(qū)域 需要新的內存區(qū)域時,內核從伙伴系統申請頁面,把它們劃分成一個個區(qū)域,取一個來滿足需求 如果某個頁面中的內存區(qū)域都釋放了,頁面就交回到伙伴系統,2020/8/3,Linux OS Analysis,44/59,但這種分配方法有許多值得改進的地方: 不同的數據類型用不同的方法分配內存可能提高效率。比如需要初始化的數據結構,釋放后可以暫存著,再分配時就不必初始化了

21、內核的函數常常重復地使用同一類型的內存區(qū),緩存最近釋放的對象可以加速分配和釋放 對內存的請求可以按照請求頻率來分類,頻繁使用的類型使用專門的緩存,很少使用的可以使用通用緩存 使用2的冪次大小的內存區(qū)域時硬件高速緩存沖突的概率較大,有可能通過仔細安排內存區(qū)域的起始地址來減少硬件高速緩存沖突 緩存一定數量的對象可以減少對buddy系統的調用,從而節(jié)省時間并減少由此引起的硬件高速緩存污染,2020/8/3,Linux OS Analysis,45/59,Linux2.6.26中,SLOB Allocator: Simple List Of Blocks NUMA Slab Slub:slab的一個變

22、種 Kmalloc/kfree 本課介紹基本的slab算法,2020/8/3,Linux OS Analysis,46/59,slab分配器,slab分配器體現了這些改進思想 slab分配器把內存區(qū)看成對象 slab分配器把對象分組放進高速緩存。 每個高速緩存都是同種類型內存對象的一種“儲備” 例如當一個文件被打開時,存放相應“打開文件”對象所需的內存是從一個叫做filp(file pointer)的slab分配器的高速緩存中得到的 也就是說每種對象類型對應一個高速緩存,2020/8/3,Linux OS Analysis,47/59,每個高速緩存被分成多個slabs,每個slab由一個或多個

23、連續(xù)的頁框組成,其中包含一定數目的對象,2020/8/3,Linux OS Analysis,48/59,每個slab有三種狀態(tài):全滿,半滿,全空 全滿意味著slab中的對象全部已被分配出去 全空意味著slab中的對象全部是可用的 半滿介于兩者之間 當內核函數需要一個新的對象時, 優(yōu)先從半滿的slab滿足這個請求 否則從全空的slab中取一個對象滿足請求 如果沒有空的slab則向buddy系統申請頁面生成一個新的slab,2020/8/3,Linux OS Analysis,49/59,高速緩存描述符和slab描述符之間的關系,2020/8/3,Linux OS Analysis,50/59,

24、普通和專用高速緩存,每個高速緩存使用kmem_cache表示 普通高速緩存根據大小分配內存 26個,2組(一組用于DMA分配,另一組用于常規(guī)分配) 每組13個,大小從25=32個字節(jié),到217=132017個字節(jié) 數據結構cache_sizes 數組:malloc_sizes 專用高速緩存根據類型分配,2020/8/3,Linux OS Analysis,51/59,閱讀文件kmalloc_sizes.h,2020/8/3,Linux OS Analysis,52/59,2020/8/3,Linux OS Analysis,53/59,slab分配器提供的接口,創(chuàng)建專用高速緩存:kmem_cache_create 撤銷專用高速緩存:kmem_cache_destroy 一般內核撤銷一個模塊時會調用這個函數撤銷屬于那個模塊的cache類型 從專用高速緩沖中分配和釋放 從高速緩存中分配/釋放一個內存對象kmem_cache_alloc/kmem_cache_free 從普通高速緩存中分配和釋放 kmalloc

溫馨提示

  • 1. 本站所有資源如無特殊說明,都需要本地電腦安裝OFFICE2007和PDF閱讀器。圖紙軟件為CAD,CAXA,PROE,UG,SolidWorks等.壓縮文件請下載最新的WinRAR軟件解壓。
  • 2. 本站的文檔不包含任何第三方提供的附件圖紙等,如果需要附件,請聯系上傳者。文件的所有權益歸上傳用戶所有。
  • 3. 本站RAR壓縮包中若帶圖紙,網頁內容里面會有圖紙預覽,若沒有圖紙預覽就沒有圖紙。
  • 4. 未經權益所有人同意不得將文件中的內容挪作商業(yè)或盈利用途。
  • 5. 人人文庫網僅提供信息存儲空間,僅對用戶上傳內容的表現方式做保護處理,對用戶上傳分享的文檔內容本身不做任何修改或編輯,并不能對任何下載內容負責。
  • 6. 下載文件中如有侵權或不適當內容,請與我們聯系,我們立即糾正。
  • 7. 本站不保證下載資源的準確性、安全性和完整性, 同時也不承擔用戶因使用這些下載資源對自己和他人造成任何形式的傷害或損失。

評論

0/150

提交評論