你知道linuxkernel内存回收机制是怎样的?


无论计算机上有多少内存都是不够的,因而     linux   kernel需要回收一些很少使用的内存页面来保证系统持续有内存使用。页面回收的方式有页回写、页交换和页丢弃三种方式:如果一个很少使用的页的后备存储器是一个块设备(例如文件映射),则可以将内存直接同步到块设备,腾出的页面可以被重用;如果页面没有后备存储器,则可以交换到特定swap分区,再次被访问时再交换回内存;如果页面的后备存储器是一个文件,但文件内容在内存不能被修改(例如可执行文件),那么在当前不需要的情况下可直接丢弃。

1 回收的时机

 你知道linuxkernel内存回收机制是怎样的?_设计制作_存储技术



2 哪些内存可以回收
2.1 页框的回收
LRU(Least Recently Used),近期最少使用链表,是按照近期的使用情况排列的,最少使用的存在链表末尾,通过以下宏定义即可看出:
#define lru_to_page(_head) (list_entry((_head)->prev, struct page, lru))
每个zone有5个LRU链表用以存放各种最近使用状态的页面。
enum lru_list {
LRU_INAC     TI   VE_ANON = LRU_BASE,
LRU_AC  TI VE_ANON = LRU_BASE + LRU_AC  TI VE,
LRU_INAC  TI VE_FILE = LRU_BASE + LRU_FILE,
LRU_AC  TI VE_FILE = LRU_BASE + LRU_FILE + LRU_ACTIVE,
LRU_UNEVICTABLE,
NR_LRU_LISTS
};
其中INACTIVE_ANON、ACTIVE_ANON、INACTIVE_FILE、ACTIVE_FILE 4个链表中的页面是可以回收的。ANON代表匿名映射,没有后备存储器;FILE代表文件映射。
页面回收时,会优先回收INACTIVE的页面,只有当INACTIVE页面很少时,才会考虑回收ACTIVE页面。
为了评估页的活动程度,kernel引入了PG_referend和PG_active两个标志位。为什么需要两个位呢?假定只使用一个PG_active来标识页是否活动,在页被访问时,设置该位,但是何时清楚呢?为此需要维护大量的内核     定时器   ,这种方法注定是要失败的。
使用两个标志,可以实现一种更精巧的方法,其核心思想是:一个表示当前活动程度,一个表示最近是否被引用过,下图说明了基本算法。

 你知道linuxkernel内存回收机制是怎样的?_设计制作_存储技术



基本上有以下步骤:
(1)如果页是活动的,设置PG_active位,并保存在ACTIVE LRU链表;反之在INACTIVE;
(2)每次访问页时,设置PG_referenced位,负责该工作的是mark_page_accessed函数;
(3)PG_referenced以及由逆向映射提供的信息用来确定页面活动程度,每次清除该位时,都会检测页面活动程度,page_referenced函数实现了该行为;
(4)再次进入mark_page_accessed。如果发现PG_referenced已被置位,意味着page_referenced没有执行检查,因而对于mark_page_accessed的调用比page_referenced更频繁,这意味着页面经常被访问。如果该页位于INACTIVE链表,将其移动到ACTIVE,此外还会设置PG_active标志位,清除PG_referenced;
(5)反向的转移也是有可能的,在页面活动程度减少时,可能连续调用两次page_referenced而中间没有mark_page_accessed。
如果对内存页的访问是稳定的,那么对page_referenced和mark_page_accessed的调用在本质上是均衡的,因而页面保持在当前LRU链表。这种方案同时确保了内存页不会再ACTIVE与INACTIVE链表间快速跳跃。
2.2 slab缓存回收
slab缓存回收相对比较灵活,所有注册到shrinker_list中的方法都会被执行。
内核默认针对每个文件系统都注册了prune_super方法,这个函数用来回收文件系统中不再使用的dentry和inode缓存;
    android   的lowmemorykiller机制注册了选择性杀死进程的方法,回收进程使用的内存。
3怎样回收页框

 你知道linuxkernel内存回收机制是怎样的?_设计制作_存储技术



其中shrink_page_list是真正回收页面的过程

 你知道linuxkernel内存回收机制是怎样的?_设计制作_存储技术



4周期性回收的频率
4.1 kswapd
kswapd是内核为每个内存node创建的内存回收线程,为什么有了紧缺回收机制还需要周期性回收呢?因为有些内存分配是不允许阻塞等待回收的,比如中断和异常处理程序中的内存分配;还有些内存分配不允许激活I/O访问的。只有少数情况的内存紧缺可以完整执行回收过程,所以利用系统空闲时间回收内存非常必要。
该函数记录了上一次均衡操作时所用的分配order,如果kswapd_max_order大于上一次的值,或者classzone_idx小于上一次的值,则调用balance_pgdat再次均衡该内存域,否则可以进行短暂休眠,休眠的时间是HZ/10,对于     arm   (HZ=100)来说,休眠的时间就是1ms。
balance_pgdat均衡操作直到该内存域的zone_war     te   rmark_ok为止。
4.2 cache_reap
cache_reap用来回收slab中的空闲对象,如果空闲对象可以还原成一个页面,则释放回buddy system。每次调用cache_reap会把所有的slab_caches遍历一遍,之后休眠2*HZ,对于arm(HZ=100)来说,周期就是20ms。



25
162
0
18

相关资讯

  1. 1、马伊斗婆婆小三《青春期2》打响婚姻保卫战1737
  2. 2、《西游记后传》20年了,乔灵儿外貌不变,他成了知名抗日剧演员3374
  3. 3、华谊兄弟“本命年”公布20部影片,内容回归引期待3174
  4. 4、《山河令》加更打投:比起五湖盟,CP磕到上头的剧粉更需要“琉璃甲”2531
  5. 5、《悬崖之上》致敬无名英雄,但我们记住了张译的角色——张宪臣4550
  6. 6、网友偶遇郑爽拍戏,黑衣墨镜酷女范十足,打100分都不够2024
  7. 7、辛芷蕾翟天临疑似恋情曝光,同时现身机场,女方全副武装怕被发现1437
  8. 8、《送你一朵小红花》票房破11亿,横店影视、中国电影、猫眼娱乐等公司出品3573
  9. 9、五一档总票房超16.82亿元,真正的“爆款”为何难现?3986
  10. 10、明星怎么帮家人?李连杰10万让哥哥当助理,他用一部剧捧妻子4085
全部评论(0)
我也有话说
0
收藏
点赞
顶部