Linux頁框分配器的內(nèi)存碎片化整理是什么

本篇內(nèi)容主要講解“Linux頁框分配器的內(nèi)存碎片化整理是什么”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實(shí)用性強(qiáng)。下面就讓小編來帶大家學(xué)習(xí)“Linux頁框分配器的內(nèi)存碎片化整理是什么”吧!

成都創(chuàng)新互聯(lián)公司服務(wù)項(xiàng)目包括錦屏網(wǎng)站建設(shè)、錦屏網(wǎng)站制作、錦屏網(wǎng)頁制作以及錦屏網(wǎng)絡(luò)營銷策劃等。多年來,我們專注于互聯(lián)網(wǎng)行業(yè),利用自身積累的技術(shù)優(yōu)勢、行業(yè)經(jīng)驗(yàn)、深度合作伙伴關(guān)系等,向廣大中小型企業(yè)、政府機(jī)構(gòu)等提供互聯(lián)網(wǎng)行業(yè)的解決方案,錦屏網(wǎng)站推廣取得了明顯的社會(huì)效益與經(jīng)濟(jì)效益。目前,我們服務(wù)的客戶以成都為中心已經(jīng)輻射到錦屏省份的部分城市,未來相信會(huì)繼續(xù)擴(kuò)大服務(wù)區(qū)域并繼續(xù)獲得客戶的支持與信任!

頁框分配器在慢速分配中包括內(nèi)存碎片化整理和內(nèi)存回收,代碼如下:

static inline struct page * __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order,       struct alloc_context *ac) {   page = __alloc_pages_direct_compact(gfp_mask, order,        alloc_flags, ac,       INIT_COMPACT_PRIORITY,       &compact_result);   ......   page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac,         &did_some_progress);   ...... }

出于篇幅設(shè)計(jì),這次我們只講內(nèi)存的碎片化整理,下文再講內(nèi)存回收。

什么是內(nèi)存碎片化

Linux物理內(nèi)存碎片化包括兩種:內(nèi)部碎片化和外部碎片化。

內(nèi)部碎片化:

指分配給用戶的內(nèi)存空間中未被使用的部分。例如進(jìn)程需要使用3K  bytes物理內(nèi)存,于是向系統(tǒng)申請了大小等于3Kbytes的內(nèi)存,但是由于Linux內(nèi)核伙伴系統(tǒng)算法最小顆粒是4K  bytes,所以分配的是4Kbytes內(nèi)存,那么其中1K bytes未被使用的內(nèi)存就是內(nèi)存內(nèi)碎片。

外部碎片化:

指系統(tǒng)中無法利用的小內(nèi)存塊。例如系統(tǒng)剩余內(nèi)存為16K bytes,但是這16K bytes內(nèi)存是由4個(gè)4K  bytes的頁面組成,即16K內(nèi)存物理頁幀號(hào)#1不連續(xù)。在系統(tǒng)剩余16K  bytes內(nèi)存的情況下,系統(tǒng)卻無法成功分配大于4K的連續(xù)物理內(nèi)存,該情況就是內(nèi)存外碎片導(dǎo)致。

碎片化整理算法

Linux內(nèi)存對碎片化的整理算法主要應(yīng)用了內(nèi)核的頁面遷移機(jī)制,是一種將可移動(dòng)頁面進(jìn)行遷移后騰出連續(xù)物理內(nèi)存的方法。

假設(shè)存在一個(gè)非常小的內(nèi)存域如下:

Linux頁框分配器的內(nèi)存碎片化整理是什么

藍(lán)色表示空閑的頁面,白色表示已經(jīng)被分配的頁面,可以看到如上內(nèi)存域的空閑頁面(藍(lán)色)非常零散,無法分配大于兩頁的連續(xù)物理內(nèi)存。

下面演示一下內(nèi)存規(guī)整的簡化工作原理,內(nèi)核會(huì)運(yùn)行兩個(gè)獨(dú)立的掃描動(dòng)作:第一個(gè)掃描從內(nèi)存域的底部開始,一邊掃描一邊將已分配的可移動(dòng)(MOVABLE)頁面記錄到一個(gè)列表中:

Linux頁框分配器的內(nèi)存碎片化整理是什么

另外第二掃描是從內(nèi)存域的頂部開始,掃描可以作為頁面遷移目標(biāo)的空閑頁面位置,然后也記錄到一個(gè)列表里面:

Linux頁框分配器的內(nèi)存碎片化整理是什么

等兩個(gè)掃描在域中間相遇,意味著掃描結(jié)束,然后將左邊掃描得到的已分配的頁面遷移到右邊空閑的頁面中,左邊就形成了一段連續(xù)的物理內(nèi)存,完成頁面規(guī)整。

Linux頁框分配器的內(nèi)存碎片化整理是什么

碎片化整理的三種方式

static struct page * __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order,   unsigned int alloc_flags, const struct alloc_context *ac,   enum compact_priority prio, enum compact_result *compact_result) {  struct page *page;  unsigned int noreclaim_flag;   if (!order)   return NULL;   noreclaim_flag = memalloc_noreclaim_save();  *compact_result = try_to_compact_pages(gfp_mask, order, alloc_flags, ac,          prio);  memalloc_noreclaim_restore(noreclaim_flag);   if (*compact_result <= COMPACT_INACTIVE)   return NULL;   count_vm_event(COMPACTSTALL);   page = get_page_from_freelist(gfp_mask, order, alloc_flags, ac);   if (page) {   struct zone *zone = page_zone(page);    zone->compact_blockskip_flush = false;   compaction_defer_reset(zone, order, true);   count_vm_event(COMPACTSUCCESS);   return page;  }   count_vm_event(COMPACTFAIL);   cond_resched();   return NULL; }

這也是上面memory compaction算法的代碼實(shí)現(xiàn)。

在linux內(nèi)核里一共有3種方式可以碎片化整理,我們總結(jié)如下:

Linux頁框分配器的內(nèi)存碎片化整理是什么

到此,相信大家對“Linux頁框分配器的內(nèi)存碎片化整理是什么”有了更深的了解,不妨來實(shí)際操作一番吧!這里是創(chuàng)新互聯(lián)網(wǎng)站,更多相關(guān)內(nèi)容可以進(jìn)入相關(guān)頻道進(jìn)行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!

文章名稱:Linux頁框分配器的內(nèi)存碎片化整理是什么
文章URL:http://bm7419.com/article12/pcehgc.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供云服務(wù)器、Google微信小程序、品牌網(wǎng)站建設(shè)、小程序開發(fā)網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

綿陽服務(wù)器托管