中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Linux頁框分配器的內存碎片化整理是什么

發布時間:2021-11-23 15:25:56 來源:億速云 閱讀:198 作者:iii 欄目:系統運維

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

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

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);   ...... }

出于篇幅設計,這次我們只講內存的碎片化整理,下文再講內存回收。

什么是內存碎片化

Linux物理內存碎片化包括兩種:內部碎片化和外部碎片化。

內部碎片化:

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

外部碎片化:

指系統中無法利用的小內存塊。例如系統剩余內存為16K bytes,但是這16K bytes內存是由4個4K  bytes的頁面組成,即16K內存物理頁幀號#1不連續。在系統剩余16K  bytes內存的情況下,系統卻無法成功分配大于4K的連續物理內存,該情況就是內存外碎片導致。

碎片化整理算法

Linux內存對碎片化的整理算法主要應用了內核的頁面遷移機制,是一種將可移動頁面進行遷移后騰出連續物理內存的方法。

假設存在一個非常小的內存域如下:

Linux頁框分配器的內存碎片化整理是什么

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

下面演示一下內存規整的簡化工作原理,內核會運行兩個獨立的掃描動作:第一個掃描從內存域的底部開始,一邊掃描一邊將已分配的可移動(MOVABLE)頁面記錄到一個列表中:

Linux頁框分配器的內存碎片化整理是什么

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

Linux頁框分配器的內存碎片化整理是什么

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

Linux頁框分配器的內存碎片化整理是什么

碎片化整理的三種方式

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算法的代碼實現。

在linux內核里一共有3種方式可以碎片化整理,我們總結如下:

Linux頁框分配器的內存碎片化整理是什么

到此,相信大家對“Linux頁框分配器的內存碎片化整理是什么”有了更深的了解,不妨來實際操作一番吧!這里是億速云網站,更多相關內容可以進入相關頻道進行查詢,關注我們,繼續學習!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

利津县| 华容县| 白银市| 皋兰县| 西丰县| 阿拉善盟| 镇安县| 洪湖市| 法库县| 兴仁县| 武鸣县| 靖边县| 汉川市| 攀枝花市| 万荣县| 福建省| 德兴市| 昆明市| 汉源县| 洛川县| 吉隆县| 双峰县| 田东县| 宜春市| 招远市| 迭部县| 沙洋县| 翼城县| 波密县| 绍兴市| 景洪市| 江源县| 墨江| 阜阳市| 中卫市| 盖州市| 华蓥市| 昌黎县| 三门峡市| 秀山| 棋牌|