Linux內(nèi)存管理詳解實用教案_第1頁
Linux內(nèi)存管理詳解實用教案_第2頁
Linux內(nèi)存管理詳解實用教案_第3頁
Linux內(nèi)存管理詳解實用教案_第4頁
Linux內(nèi)存管理詳解實用教案_第5頁
已閱讀5頁,還剩21頁未讀, 繼續(xù)免費閱讀

下載本文檔

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

文檔簡介

1、AgendaLinux對外提供的內(nèi)存對外提供的內(nèi)存(ni cn)管理接口管理接口linux 內(nèi)存內(nèi)存(ni cn)鏡像圖鏡像圖3 13 23 4Linux 內(nèi)存管理算內(nèi)存管理算法法(sun f)介紹介紹3 3Linux如何防止內(nèi)如何防止內(nèi)存碎片存碎片第1頁/共25頁第一頁,共26頁。Linux Image藍色字體部分(b fen)可用空間第2頁/共25頁第二頁,共26頁。Linux 如何防止內(nèi)存如何防止內(nèi)存(ni cn)碎片碎片 內(nèi)存碎片內(nèi)存碎片 內(nèi)部碎片內(nèi)部碎片: 系統(tǒng)為了滿足一小段內(nèi)存區(qū)(連續(xù))的需要系統(tǒng)為了滿足一小段內(nèi)存區(qū)(連續(xù))的需要(xyo),不得不分配了一大區(qū)域連續(xù)內(nèi)存給它,從而,

2、不得不分配了一大區(qū)域連續(xù)內(nèi)存給它,從而造成了空間浪費造成了空間浪費 外部碎片外部碎片系統(tǒng)雖有足夠的內(nèi)存,但卻是分散的碎片,無法滿足對大塊系統(tǒng)雖有足夠的內(nèi)存,但卻是分散的碎片,無法滿足對大塊“連續(xù)內(nèi)存連續(xù)內(nèi)存”的需求的需求 第3頁/共25頁第三頁,共26頁。Linux 如何如何(rh)防止內(nèi)存碎片防止內(nèi)存碎片 linux減少外部碎片減少外部碎片 伙伴系統(tǒng)伙伴系統(tǒng)(buddy算法算法)把內(nèi)存塊按大小分組管理,一定程度上減輕了外部碎片把內(nèi)存塊按大小分組管理,一定程度上減輕了外部碎片的危害,因為頁框分的危害,因為頁框分 配不在盲目,而是按照大小依次有序進行,不過伙伴關系配不在盲目,而是按照大小依次有序

3、進行,不過伙伴關系只是只是(zhsh)減輕了外部碎片,但并未徹底消除減輕了外部碎片,但并未徹底消除 ,但是伙伴系統(tǒng)同時又帶來很多但是伙伴系統(tǒng)同時又帶來很多的內(nèi)部碎片的內(nèi)部碎片 linux減少外部碎片減少外部碎片 SLAB,SLUB,SLOB分配器使得一個頁面內(nèi)眾多小塊內(nèi)存可獨立被分配使用,避分配器使得一個頁面內(nèi)眾多小塊內(nèi)存可獨立被分配使用,避免了內(nèi)部分片,節(jié)約了空閑內(nèi)存免了內(nèi)部分片,節(jié)約了空閑內(nèi)存 第4頁/共25頁第四頁,共26頁。Linux 如何防止如何防止(fngzh)內(nèi)存碎片內(nèi)存碎片linux 內(nèi)存內(nèi)存(ni cn)管理層次關系圖管理層次關系圖1第5頁/共25頁第五頁,共26頁。Linu

4、x 如何如何(rh)防止內(nèi)存碎片防止內(nèi)存碎片linux 內(nèi)存管理內(nèi)存管理(gunl)層次關系層次關系圖圖2第6頁/共25頁第六頁,共26頁。Linux 內(nèi)存管理算法內(nèi)存管理算法(sun f)介紹介紹 Buddy System算法原理算法原理 Buddy System是一種經(jīng)典的內(nèi)存管理是一種經(jīng)典的內(nèi)存管理算法。在算法。在Unix和和Linux操作系統(tǒng)中都有操作系統(tǒng)中都有用到。其作用是減少存儲空間中的空洞、用到。其作用是減少存儲空間中的空洞、減少碎片、增加利用率。避免外碎片的減少碎片、增加利用率。避免外碎片的方法有兩種:方法有兩種: a.利用分頁單元把一組非連續(xù)的空閑頁利用分頁單元把一組非連續(xù)的

5、空閑頁框映射到連續(xù)的線性地址區(qū)間。框映射到連續(xù)的線性地址區(qū)間。 b.開發(fā)適當?shù)募夹g來記錄現(xiàn)存的空閑連開發(fā)適當?shù)募夹g來記錄現(xiàn)存的空閑連續(xù)頁框塊的情況,以盡量避免為滿足對續(xù)頁框塊的情況,以盡量避免為滿足對小塊的請求而把大塊的空閑塊進行分割。小塊的請求而把大塊的空閑塊進行分割。 基于下面三種原因,內(nèi)核選擇第二種避基于下面三種原因,內(nèi)核選擇第二種避免方法:免方法: a.在某些情況下,連續(xù)的頁框確實必要。在某些情況下,連續(xù)的頁框確實必要。 b.即使連續(xù)頁框的分配不是很必要,它即使連續(xù)頁框的分配不是很必要,它在保持內(nèi)核頁表不變方面所起的作用也在保持內(nèi)核頁表不變方面所起的作用也是不容忽視的。假如修改頁表,則

6、導致是不容忽視的。假如修改頁表,則導致平均訪存次數(shù)增加,從而頻繁刷新平均訪存次數(shù)增加,從而頻繁刷新TLB。 c.通過通過4M的頁可以訪問大塊連續(xù)的物理的頁可以訪問大塊連續(xù)的物理內(nèi)存,相對內(nèi)存,相對(xingdu)于于4K頁的使用,頁的使用,TLB未命中率降低,加快平均訪存速度。未命中率降低,加快平均訪存速度。第7頁/共25頁第七頁,共26頁。 buddy算法將所有空閑頁框分組為算法將所有空閑頁框分組為11個塊鏈表,每個塊鏈表分別包含個塊鏈表,每個塊鏈表分別包含1,2,4,8,16,32,64,128,256,512,1024個連續(xù)的頁框,每個塊的第一個頁框的個連續(xù)的頁框,每個塊的第一個頁框的物

7、理地址是該塊大小的整數(shù)倍。如,大小為物理地址是該塊大小的整數(shù)倍。如,大小為16個頁框的塊,其起始地址是個頁框的塊,其起始地址是16*212的倍數(shù)。的倍數(shù)。 例,假設要請求例,假設要請求(qngqi)一個一個128個頁框的塊,算法先檢查個頁框的塊,算法先檢查128個頁框的鏈表個頁框的鏈表是否有空閑塊,如果沒有則查是否有空閑塊,如果沒有則查256個頁框的鏈個頁框的鏈 表,有則將表,有則將256個頁框的塊分裂兩個頁框的塊分裂兩份,一份使用,一份插入份,一份使用,一份插入128個頁框的鏈表。如果還沒有,就查個頁框的鏈表。如果還沒有,就查512個頁框的鏈個頁框的鏈表,有的話就分裂為表,有的話就分裂為 1

8、28,128,256,一個,一個128使用,剩余兩個插入對應鏈表。使用,剩余兩個插入對應鏈表。如果在如果在512還沒查到,則返回出錯信號。還沒查到,則返回出錯信號。 回收過程相反回收過程相反第8頁/共25頁第八頁,共26頁。第9頁/共25頁第九頁,共26頁。第10頁/共25頁第十頁,共26頁。 static inline struct page *alloc_pages(gfp_t gfp_mask, unsigned int order) void _free_pages(struct page *page, unsigned int order) 分配內(nèi)存的單位為頁面數(shù)分配內(nèi)存的單位為頁面

9、數(shù),分配時候傳入分配時候傳入order值值, order 為為0 ,1,2,.,n 分別分配分別分配1,2,4,2n個頁面?zhèn)€頁面 伙伴系統(tǒng)伙伴系統(tǒng)(Buddy算法算法(sun f)分配的頁面物理上是連續(xù)的分配的頁面物理上是連續(xù)的,因此使用伙伴因此使用伙伴系統(tǒng)分配的內(nèi)存大小最大為系統(tǒng)分配的內(nèi)存大小最大為210 * PAGESIZE = 4K * 4K = 4M unsigned long _get_free_pages(gfp_t gfp_mask, unsigned int order) void free_pages(unsigned long addr, unsigned int orde

10、r) Buddy算法算法(sun f)雖然能很好的減少外部碎片的產(chǎn)生雖然能很好的減少外部碎片的產(chǎn)生,但是他卻可用導致但是他卻可用導致很多的內(nèi)部碎片很多的內(nèi)部碎片第11頁/共25頁第十一頁,共26頁。slab/slob/slub的作用的作用:以頁為最小單位分配內(nèi)存對于內(nèi)核管理系統(tǒng)物理內(nèi)存來說的以頁為最小單位分配內(nèi)存對于內(nèi)核管理系統(tǒng)物理內(nèi)存來說的確比較方便,但內(nèi)核自身最常使用確比較方便,但內(nèi)核自身最常使用 的內(nèi)存卻往往是很小的內(nèi)存卻往往是很小(遠遠小于一頁)的內(nèi)存塊(遠遠小于一頁)的內(nèi)存塊比如存放文件描述符、進比如存放文件描述符、進程描述符、虛擬內(nèi)存區(qū)域描述符等行為所需的內(nèi)存都不足程描述符、虛擬內(nèi)

11、存區(qū)域描述符等行為所需的內(nèi)存都不足一頁。這些用來存放描述符的一頁。這些用來存放描述符的 內(nèi)存相比頁面而言,就好比內(nèi)存相比頁面而言,就好比是面包屑與面包。一個整頁中可以聚集多個這種這些小塊是面包屑與面包。一個整頁中可以聚集多個這種這些小塊內(nèi)存;而且這些小塊內(nèi)存塊也和面包屑一樣頻繁地生成內(nèi)存;而且這些小塊內(nèi)存塊也和面包屑一樣頻繁地生成/銷銷毀。毀。為了滿足內(nèi)核對這種小內(nèi)存塊的需要為了滿足內(nèi)核對這種小內(nèi)存塊的需要(xyo),Linux系統(tǒng)系統(tǒng)采用了一種被稱為采用了一種被稱為slab分配器的技術。分配器的技術。Slab分配器的實現(xiàn)分配器的實現(xiàn) 相當復雜,但原理不難,其核心思想就是相當復雜,但原理不難,

12、其核心思想就是“存儲池存儲池”的運的運用。內(nèi)存片段用。內(nèi)存片段(小塊內(nèi)存小塊內(nèi)存)被看作對象,當被使用完后,并不被看作對象,當被使用完后,并不直接釋放而是被緩存到直接釋放而是被緩存到“存儲池存儲池”里,留做下里,留做下 次使用,這次使用,這無疑避免了頻繁創(chuàng)建與銷毀對象所帶來的額外負載。無疑避免了頻繁創(chuàng)建與銷毀對象所帶來的額外負載。第12頁/共25頁第十二頁,共26頁。slab 分配器的主要分配器的主要(zhyo)結構結構 第13頁/共25頁第十三頁,共26頁。SLUB 中的中的SLAB內(nèi)存管理代碼將被內(nèi)存管理代碼將被SLUB代替。代替。SLAB是是經(jīng)典的管理內(nèi)核的內(nèi)存的代碼經(jīng)典的管理內(nèi)核的內(nèi)存

13、的代碼,但是但是slab維護了大維護了大量的對象隊列,這些隊列雖然可以很快地被分量的對象隊列,這些隊列雖然可以很快地被分 配,配,但是過于復雜,而且維護所占用的空間會隨著系統(tǒng)但是過于復雜,而且維護所占用的空間會隨著系統(tǒng)節(jié)點的增加而急劇增長。節(jié)點的增加而急劇增長。 slub就是作為就是作為(zuwi)slab的可替代選項出現(xiàn)的。的可替代選項出現(xiàn)的。slub是一種不使用隊列的分配器。是一種不使用隊列的分配器。slub取消了大取消了大量的隊列和相量的隊列和相 關維護費用,獲得了極大的性能和關維護費用,獲得了極大的性能和伸縮性提高,并在總體上簡化了伸縮性提高,并在總體上簡化了slab結構,使用了結構,

14、使用了基于每基于每CPU的緩存,同時保留了的緩存,同時保留了slab的用戶接口,的用戶接口,而且而且slub還提還提 供了強大的診斷和調(diào)試能力供了強大的診斷和調(diào)試能力 第14頁/共25頁第十四頁,共26頁。slobslob是一個相對簡單一些的分配器,主要使用在小型的嵌入式系統(tǒng)。在選擇了是一個相對簡單一些的分配器,主要使用在小型的嵌入式系統(tǒng)。在選擇了CONFIG_EMBEDDED后,就可以選用后,就可以選用CONFIG_SLOB選項,使用選項,使用SLOB 分配分配器中。器中。slob是一個經(jīng)典的是一個經(jīng)典的K&R/UNIX堆分配器堆分配器(想我們目前想我們目前ucos上面的上面的malloc)

15、,其具,其具有一個有一個slab模擬層,和被模擬層,和被slab替代的替代的linux原來的原來的kmalloc分配器比較相似,比分配器比較相似,比slab更有空間效率更有空間效率(xio l),尺寸更小,但是依然存在碎片和難于擴展,尺寸更小,但是依然存在碎片和難于擴展(對所有對所有操作都簡單地上鎖操作都簡單地上鎖)的問題,只適用于小系統(tǒng)。的問題,只適用于小系統(tǒng)。slob獲得的是已經(jīng)對齊的對象。獲得的是已經(jīng)對齊的對象。slob在在MIPS上的粒度是上的粒度是4字節(jié)。字節(jié)。slob堆是一個堆是一個單向列表,連接了從單向列表,連接了從get_free_page獲得的頁面,從堆上按照獲得的頁面,從堆

16、上按照first-fit的原則的原則依照需求增長和分配。依照需求增長和分配。 第15頁/共25頁第十五頁,共26頁。l vmallocl 避免外部分片的最終思路還是落到了如何利用不連續(xù)的內(nèi)存塊組合成避免外部分片的最終思路還是落到了如何利用不連續(xù)的內(nèi)存塊組合成“看起來很大的內(nèi)存塊看起來很大的內(nèi)存塊”這里的情況很類似這里的情況很類似 于用戶空間分配虛擬于用戶空間分配虛擬內(nèi)存,內(nèi)存邏輯上連續(xù),其實影射到并不一定連續(xù)的物理內(nèi)存上。內(nèi)存,內(nèi)存邏輯上連續(xù),其實影射到并不一定連續(xù)的物理內(nèi)存上。Linux內(nèi)核借用了這個技術,允許內(nèi)核程序在內(nèi)核地址空間中分配虛擬內(nèi)核借用了這個技術,允許內(nèi)核程序在內(nèi)核地址空間中分

17、配虛擬地地 址,同樣也利用頁表(內(nèi)核頁表)將虛擬地址影射到分散的內(nèi)存頁址,同樣也利用頁表(內(nèi)核頁表)將虛擬地址影射到分散的內(nèi)存頁上。以此完美地解決了內(nèi)核內(nèi)存使用中的外部分片問題。內(nèi)核提供上。以此完美地解決了內(nèi)核內(nèi)存使用中的外部分片問題。內(nèi)核提供vmalloc函數(shù)分配內(nèi)核虛擬內(nèi)存,該函數(shù)不同于函數(shù)分配內(nèi)核虛擬內(nèi)存,該函數(shù)不同于kmalloc,它可以分,它可以分配較配較Kmalloc大得多的內(nèi)存空間(可遠大于大得多的內(nèi)存空間(可遠大于128K,但必須是頁大小的,但必須是頁大小的倍數(shù)),但相比倍數(shù)),但相比Kmalloc來來 說說Vmalloc需要對內(nèi)核虛擬地址進行重影需要對內(nèi)核虛擬地址進行重影射,

18、必須更新射,必須更新(gngxn)內(nèi)核頁表,因此分配效率上要低一些(用空內(nèi)核頁表,因此分配效率上要低一些(用空間換時間間換時間)) 第16頁/共25頁第十六頁,共26頁。l Mips 32bit 存儲器映射存儲器映射(yngsh)圖圖l 在在mips底下使用底下使用,kseg2 1G大小空間大小空間,從從 0 xC000 0000 0 xFFFF FFFF,也就是也就是說說vmalloc返回的地址值返回的地址值,會落在會落在0 xC000 0000 0 xFFFF FFFF上上第17頁/共25頁第十七頁,共26頁。 Mips linux使用的是二級映射將線性地址轉(zhuǎn)換為物理使用的是二級映射將線性

19、地址轉(zhuǎn)換為物理地址地址 PGD(page direcory),頁面頁面(y min)目錄表目錄表,占用占用10bit 每一每一PGD項占用項占用4字節(jié)字節(jié),所以頁表目錄大小為所以頁表目錄大小為4KB ,正好正好一頁一頁 PTE(page table entry),頁面頁面(y min)目錄入口表目錄入口表,占用占用10bit 每一每一PTE項占用項占用4字節(jié)字節(jié),所以頁表所以頁表(PTE)大小為大小為4KB ,正正好一頁好一頁 每一每一PGD項項,(需要有一個頁表需要有一個頁表(PTE)可以映射可以映射 222 = 4MB 的空間的空間 每一每一PGD項項,對應一個對應一個PTE(page t

20、able entry),頁面頁面(y min)目錄入口表目錄入口表第18頁/共25頁第十八頁,共26頁。 Vmalloc:調(diào)用調(diào)用(dioyng)圖圖第19頁/共25頁第十九頁,共26頁。 內(nèi)核提供內(nèi)存管理接口接口內(nèi)核提供內(nèi)存管理接口接口: gfp_mask: GFP_ATOMIC 用來從中斷處理和進程上下文用來從中斷處理和進程上下文,軟中斷軟中斷,持有自旋鎖以及其他不持有自旋鎖以及其他不能睡眠能睡眠(阻塞阻塞)的地方分配內(nèi)存的地方分配內(nèi)存. 從不睡眠從不睡眠. GFP_KERNEL 內(nèi)核內(nèi)存的正常分配內(nèi)核內(nèi)存的正常分配. 可能睡眠可能睡眠. Slob/slab/slub提供接口提供接口: s

21、tatic struct kmem_cache *skbuff_head_cache _read_mostly;skbuff_head_cache = kmem_cache_create(skbuff_head_cache, sizeof(struct sk_buff), 0, SLAB_HWCACHE_ALIGN|SLAB_PANIC, NULL); SLAB_HWCACHE_ALIGN:指定指定cache對齊對齊(cache line對齊對齊,如如32字節(jié)對齊字節(jié)對齊). SLAB_PANIC:指示創(chuàng)建失敗時候指示創(chuàng)建失敗時候,系統(tǒng)系統(tǒng)halt 除非你覺得分配的內(nèi)存結構體會頻繁除非你覺得分配的內(nèi)存結構體會頻繁(pnfn)地生成地生成/銷毀銷毀,否否則則 請直接使用請直接使用kmalloc分配空間分配空間.第20頁/共25頁第二十頁,共26頁。 除非你覺得分配除非你覺得分配(fnpi)的內(nèi)存結構體會頻繁地生成的內(nèi)存結構體會頻繁地生成/銷毀

溫馨提示

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

評論

0/150

提交評論