白话 __vm_enough_memory,检查内存是否充足
来源:互联网 发布:直播摄像头美颜软件 编辑:程序博客网 时间:2024/05/19 09:09
__vm_enough_memory(nr_pages){ if(sysctl_overcommit_memory == OVERCOMMIT_ALWAYS) /* 1 */ 不检查 直接返回 return OK; if (sysctl_overcommit_memory == OVERCOMMIT_GUESS) { /* 0 */ default ,考察如果把可回收内存都回收的话,是否正好满足本次分配。在此模式下,就算返回成功,后续也可能会触发oom,因为此模式对分配者的要求比较宽松。 free = page_cache+ swap + slab_reclaim; if(free > nr_pages) return OK; n = buddy_system; //伙伴系统空闲内存是否已经到水线 if(n < reserve) return FAILED; n -= reserve; //回收完pagecache和slab ,此次分配再从伙伴系统中挖走一些内存来充数 free += n; if(free > nr_pages) //满足不? return OK; //此情况下返回成功的话,后续很可能触发oom,因为从伙伴系统挖了很多内存 else return FAILED; } if (sysctl_overcommit_memory == OVERCOMMIT_NEVER{ /* 2 */ means never over commit 考察的是系统已分配的内存是否达到上限,最严格的内存分配限制,一般不会触发oom, 但用户进程很可能分配失败。 allow = totalram* ration + swap; if(allow > vm_committed_space-nr_pages) //实际占用的物理页帧个数比上限多了 return FAILED; else return OK; } }