我在“理解linux内核”中读到,当malloc在用户空间中调用时,内核只在vm_area_t结构中添加一个线性区域,在内存中分配空间,这称为响应分配,这个空间在线性区域中分配只能在发生页面中断时使用。但是如果在页面中断期间没有分配页面,那么当用户调用malloc时是不是被欺骗了?
答案 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在分配给用户进程时总是擦除内存,因为当页面返回到伙伴分配器时它不会这样做。