白话 __vm_enough_memory,检查内存是否充足

__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;
     }
   
}


你可能感兴趣的:(白话 __vm_enough_memory,检查内存是否充足)