資源描述:
《linux內(nèi)存管理詳解》由會員上傳分享,免費(fèi)在線閱讀,更多相關(guān)內(nèi)容在教育資源-天天文庫。
1、LinuxMemoryManagerActionsMicroelectronicsCo.,Ltd.柯錦玲2009-10-21AgendaLinux對外提供的內(nèi)存管理接口linux內(nèi)存鏡像圖313234Linux內(nèi)存管理算法介紹33Linux如何防止內(nèi)存碎片LinuxImage藍(lán)色字體部分可用空間Linux如何防止內(nèi)存碎片內(nèi)存碎片內(nèi)部碎片:系統(tǒng)為了滿足一小段內(nèi)存區(qū)(連續(xù))的需要,不得不分配了一大區(qū)域連續(xù)內(nèi)存給它,從而造成了空間浪費(fèi)外部碎片系統(tǒng)雖有足夠的內(nèi)存,但卻是分散的碎片,無法滿足對大塊“連續(xù)內(nèi)存”的需求Linux如何防止內(nèi)存碎片linux減少外部碎片伙伴系統(tǒng)(buddy算法
2、)把內(nèi)存塊按大小分組管理,一定程度上減輕了外部碎片的危害,因?yàn)轫摽蚍峙洳辉诿つ浚前凑沾笮∫来斡行蜻M(jìn)行,不過伙伴關(guān)系只是減輕了外部碎片,但并未徹底消除,但是伙伴系統(tǒng)同時(shí)又帶來很多的內(nèi)部碎片linux減少外部碎片SLAB,SLUB,SLOB分配器使得一個(gè)頁面內(nèi)眾多小塊內(nèi)存可獨(dú)立被分配使用,避免了內(nèi)部分片,節(jié)約了空閑內(nèi)存Linux如何防止內(nèi)存碎片linux內(nèi)存管理層次關(guān)系圖1Linux如何防止內(nèi)存碎片linux內(nèi)存管理層次關(guān)系圖2Linux內(nèi)存管理算法介紹BuddySystem算法原理BuddySystem是一種經(jīng)典的內(nèi)存管理算法。在Unix和Linux操作系統(tǒng)中都有用到。其作
3、用是減少存儲空間中的空洞、減少碎片、增加利用率。避免外碎片的方法有兩種:a.利用分頁單元把一組非連續(xù)的空閑頁框映射到連續(xù)的線性地址區(qū)間。b.開發(fā)適當(dāng)?shù)募夹g(shù)來記錄現(xiàn)存的空閑連續(xù)頁框塊的情況,以盡量避免為滿足對小塊的請求而把大塊的空閑塊進(jìn)行分割?;谙旅嫒N原因,內(nèi)核選擇第二種避免方法:a.在某些情況下,連續(xù)的頁框確實(shí)必要。b.即使連續(xù)頁框的分配不是很必要,它在保持內(nèi)核頁表不變方面所起的作用也是不容忽視的。假如修改頁表,則導(dǎo)致平均訪存次數(shù)增加,從而頻繁刷新TLB。c.通過4M的頁可以訪問大塊連續(xù)的物理內(nèi)存,相對于4K頁的使用,TLB未命中率降低,加快平均訪存速度。buddy算法將
4、所有空閑頁框分組為11個(gè)塊鏈表,每個(gè)塊鏈表分別包含1,2,4,8,16,32,64,128,256,512,1024個(gè)連續(xù)的頁框,每個(gè)塊的第一個(gè)頁框的物理地址是該塊大小的整數(shù)倍。如,大小為16個(gè)頁框的塊,其起始地址是16*2^12的倍數(shù)。例,假設(shè)要請求一個(gè)128個(gè)頁框的塊,算法先檢查128個(gè)頁框的鏈表是否有空閑塊,如果沒有則查256個(gè)頁框的鏈表,有則將256個(gè)頁框的塊分裂兩份,一份使用,一份插入128個(gè)頁框的鏈表。如果還沒有,就查512個(gè)頁框的鏈表,有的話就分裂為128,128,256,一個(gè)128使用,剩余兩個(gè)插入對應(yīng)鏈表。如果在512還沒查到,則返回出錯(cuò)信號?;厥者^程相反s
5、taticinlinestructpage*alloc_pages(gfp_tgfp_mask,unsignedintorder)void__free_pages(structpage*page,unsignedintorder)分配內(nèi)存的單位為頁面數(shù),分配時(shí)候傳入order值,order為0,1,2,..,n分別分配1,2,4,2^n個(gè)頁面伙伴系統(tǒng)(Buddy算法)分配的頁面物理上是連續(xù)的,因此使用伙伴系統(tǒng)分配的內(nèi)存大小最大為2^10*PAGESIZE=4K*4K=4Munsignedlong__get_free_pages(gfp_tgfp_mask,unsignedin
6、torder)voidfree_pages(unsignedlongaddr,unsignedintorder)Buddy算法雖然能很好的減少外部碎片的產(chǎn)生,但是他卻可用導(dǎo)致很多的內(nèi)部碎片slab/slob/slub的作用:以頁為最小單位分配內(nèi)存對于內(nèi)核管理系統(tǒng)物理內(nèi)存來說的確比較方便,但內(nèi)核自身最常使用的內(nèi)存卻往往是很?。ㄟh(yuǎn)遠(yuǎn)小于一頁)的內(nèi)存塊——比如存放文件描述符、進(jìn)程描述符、虛擬內(nèi)存區(qū)域描述符等行為所需的內(nèi)存都不足一頁。這些用來存放描述符的內(nèi)存相比頁面而言,就好比是面包屑與面包。一個(gè)整頁中可以聚集多個(gè)這種這些小塊內(nèi)存;而且這些小塊內(nèi)存塊也和面包屑一樣頻繁地生成/銷毀。為
7、了滿足內(nèi)核對這種小內(nèi)存塊的需要,Linux系統(tǒng)采用了一種被稱為slab分配器的技術(shù)。Slab分配器的實(shí)現(xiàn)相當(dāng)復(fù)雜,但原理不難,其核心思想就是“存儲池”的運(yùn)用。內(nèi)存片段(小塊內(nèi)存)被看作對象,當(dāng)被使用完后,并不直接釋放而是被緩存到“存儲池”里,留做下次使用,這無疑避免了頻繁創(chuàng)建與銷毀對象所帶來的額外負(fù)載。slab分配器的主要結(jié)構(gòu)SLUB2.6.22中的SLAB內(nèi)存管理代碼將被SLUB代替。SLAB是經(jīng)典的管理內(nèi)核的內(nèi)存的代碼,但是slab維護(hù)了大量的對象隊(duì)列,這些隊(duì)列雖然可以很快地被分配,但是過于復(fù)雜,而