成人免费xxxxx在线视频软件_久久精品久久久_亚洲国产精品久久久_天天色天天色_亚洲人成一区_欧美一级欧美三级在线观看

Linux頁框分配器之內存碎片化整理

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

[[357683]]

本文轉載自微信公眾號「人人都是極客」,作者布道師Peter 。轉載本文請聯(lián)系人人都是極客公眾號。 

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

  1. static inline struct page * 
  2. __alloc_pages_slowpath(gfp_t gfp_mask, unsigned int order
  3.       struct alloc_context *ac) 
  4.   page = __alloc_pages_direct_compact(gfp_mask, order,  
  5.       alloc_flags, ac, 
  6.       INIT_COMPACT_PRIORITY, 
  7.       &compact_result); 
  8.   ...... 
  9.   page = __alloc_pages_direct_reclaim(gfp_mask, order, alloc_flags, ac,  
  10.        &did_some_progress); 
  11.   ...... 

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

什么是內存碎片化

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

內部碎片化:

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

外部碎片化:

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

碎片化整理算法

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

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

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

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

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

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

碎片化整理的三種方式

  1. static struct page * 
  2. __alloc_pages_direct_compact(gfp_t gfp_mask, unsigned int order
  3.   unsigned int alloc_flags, const struct alloc_context *ac, 
  4.   enum compact_priority prio, enum compact_result *compact_result) 
  5.  struct page *page; 
  6.  unsigned int noreclaim_flag; 
  7.  
  8.  if (!order
  9.   return NULL
  10.  
  11.  noreclaim_flag = memalloc_noreclaim_save(); 
  12.  *compact_result = try_to_compact_pages(gfp_mask, order, alloc_flags, ac, 
  13.          prio); 
  14.  memalloc_noreclaim_restore(noreclaim_flag); 
  15.  
  16.  if (*compact_result <= COMPACT_INACTIVE) 
  17.   return NULL
  18.  
  19.  count_vm_event(COMPACTSTALL); 
  20.  
  21.  page = get_page_from_freelist(gfp_mask, order, alloc_flags, ac); 
  22.  
  23.  if (page) { 
  24.   struct zone *zone = page_zone(page); 
  25.  
  26.   zone->compact_blockskip_flush = false
  27.   compaction_defer_reset(zone, ordertrue); 
  28.   count_vm_event(COMPACTSUCCESS); 
  29.   return page; 
  30.  } 
  31.  
  32.  count_vm_event(COMPACTFAIL); 
  33.  
  34.  cond_resched(); 
  35.  
  36.  return NULL

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

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

這里就不展開源碼的解析了,有了宏觀的理解然后再去網(wǎng)上搜下具體實現(xiàn)細節(jié)相信不是什么難事,OK,我們進入下面的文章內容:內存回收(memory reclaim)。

 

責任編輯:武曉燕 來源: 人人都是極客
相關推薦

2013-10-12 11:15:09

Linux運維內存管理

2023-04-03 08:25:02

Linux內存slub

2021-08-03 09:02:58

LinuxSlab算法

2024-10-11 10:00:20

2009-12-25 15:34:54

slab分配器

2025-04-11 00:44:00

2024-12-11 08:18:11

2025-05-27 02:45:45

2020-07-07 07:57:39

Linux內存碎片化

2017-01-20 14:21:35

內存分配器存儲

2017-01-17 16:17:48

C++固定分配器

2017-02-08 08:40:21

C++固定內存塊

2021-05-27 05:28:18

Linux 內存管理

2020-03-11 13:44:20

編程語言PythonJava

2022-02-23 16:49:19

Linux內存數(shù)據(jù)結構

2014-09-01 10:09:44

Linux

2013-10-14 10:41:41

分配器buddy syste

2025-02-10 07:30:00

malloc內存分配器內存

2023-12-22 07:55:38

Go語言分配策略

2024-10-28 11:25:21

豐巢快遞jemalloc
點贊
收藏

51CTO技術棧公眾號

主站蜘蛛池模板: 玖玖色在线视频 | 国产日产精品一区二区三区四区 | 欧美亚州综合 | 亚洲精品久久久久久一区二区 | 亚洲精品乱码久久久久v最新版 | 免费亚洲一区二区 | 久久久123 | 日韩成人在线一区 | 亚洲一区二区视频 | 99精品视频在线观看免费播放 | 九九国产| 久久毛片网站 | 91视频.| 中文日韩在线 | 超碰成人免费观看 | 亚洲视频一区二区三区 | 成人欧美一区二区三区 | 久久免费大片 | 中文字幕三区 | 亚洲精品久久久久中文字幕欢迎你 | 日韩免费看片 | 国产精品久久久久久久久久久免费看 | 成人在线免费视频 | 国产精品视频网 | 女同videos另类 | 国产成人啪免费观看软件 | 最新av中文字幕 | 日本一区二区三区在线观看 | 精品成人一区 | 精品国产不卡一区二区三区 | 色精品视频 | 欧美精品一区二区三区四区 在线 | 91资源在线观看 | 91九色porny首页最多播放 | 欧美一区日韩一区 | 国产精品久久久久久久久久久久久久 | 精品一区二区久久久久久久网站 | 波霸ol一区二区 | 黑人巨大精品欧美一区二区一视频 | 亚洲欧美日韩精品久久亚洲区 | 欧产日产国产精品视频 |