malloc是否仅在实际内存的线性区域结构vm_area_t中分配空间

时间:2012-05-31 09:50:57

标签: c linux linux-kernel

我在“理解linux内核”中读到,当malloc在用户空间中调用时,内核只在vm_area_t结构中添加一个线性区域,在内存中分配空间,这称为响应分配,这个空间在线性区域中分配只能在发生页面中断时使用。但是如果在页面中断期间没有分配页面,那么当用户调用malloc时是不是被欺骗了?

2 个答案:

答案 0 :(得分:0)

malloc分配的内存在写入之前不在实际内存中。另一方面,calloc在1处分配实内存。

从男人手册页:

  

默认情况下,Linux遵循乐观的内存分配策略。   这意味着当malloc()返回非NULL时,无法保证   内存确实可用。这是一个非常糟糕的错误。在   事实证明,系统内存不足,一个或多个亲   臭名昭着的OOM杀手将杀死cesses。如果Linux是   在不太可取的情况下雇用   denly失去一些随机选择的进程,而且内核   版本是最近的,可以关闭这个过度使用   使用如下命令的行为:

   # echo 2 > /proc/sys/vm/overcommit_memory

在glibc的源头环顾四周,发现这个我认为是calloc:

if (__builtin_expect (hook != NULL, 0)) {
    sz = bytes;
    mem = (*hook)(sz, RETURN_ADDRESS (0));
    if(mem == 0)
      return 0;
#ifdef HAVE_MEMCPY
    return memset(mem, 0, sz);
#else
    while(sz > 0) ((char*)mem)[--sz] = 0; /* rather inefficient */
    return mem;
#endif
  } 

答案 1 :(得分:0)

由glibc包装的malloc()调用将首先从glibc维护的堆内存中分配。 (见what happens in the kernel during malloc?) 如果glibc耗尽堆内存,则调用sys_brk来分配更多内存。 内核仅在首次触及分配内存(主要是页面错误处理程序)时将内存分配给用户请求。 因此,我猜calloc将返回一个真正的分配,因为它将页面初始化为零(来自手册页),通过擦除其内容触摸页面。 如果无法在故障处理程序中分配新页面,这意味着系统内存非常低,无论是在大量交换中还是在进入OOM。

一件小事是Linux在分配给用户进程时总是擦除内存,因为当页面返回到伙伴分配器时它不会这样做。