在Linux上malloc
表现机会性,仅在首次访问时通过实际内存支持虚拟内存。是否可以修改calloc
以便它也以这种方式运行(在首次访问时分配和归零页面?)
答案 0 :(得分:2)
malloc()
的一个特征不是让它“机会主义”。这是内核的一个功能,malloc()
无需做任何事情。
malloc()
会要求内核获取一记内存,并且内核在没有实际提供内存的情况下每次都说“是的,确定,你拥有它”。它也是通过提供零内存页来处理后续页面错误的内核。请注意,由于安全考虑,内核提供的任何内存都已被清零,因此它同样适用于malloc()
和calloc()
。
也就是说,除非calloc()
实现通过无条件地清除页面本身(生成提示内核实际提供内存的页面错误)来破坏这一点,否则它将具有与{{相似的“机会主义”行为。 1}}。
在我的系统上,以下程序在只有2 GiB内存的系统上成功分配了1个TiB(!):
malloc()
我认为,可以肯定地说,至少我框上的#include <stdlib.h>
#include <stdio.h>
int main() {
size_t allocationCount = 1024, successfullAllocations = 0;
char* allocations[allocationCount];
for(int i = allocationCount; i--; ) {
if((allocations[i] = calloc(1, 1024*1024*1024))) successfullAllocations++;
}
if(successfullAllocations == allocationCount) {
printf("all %zd allocations were successfull\n", successfullAllocations);
} else {
printf("there were %zd failed allocations\n", allocationCount - successfullAllocations);
}
}
实现“机会主义”。
答案 1 :(得分:1)
来自proc
中的相关/proc/sys/vm/overcommit_memory
部分:
目前在系统上分配的内存量。提交的内存是进程分配的所有内存的总和,即使它尚未被它们“使用”。一个分配1GB内存的进程(使用 malloc(3)或类似的),但只触及300MB的内存只会显示为使用300MB内存,即使它有分配给的内存空间整个1GB。这1GB是由VM“提交”的内存,可以由分配应用程序随时使用。在系统上启用严格过度使用(模式2 / proc / sys / vm / overcommit_memory)时,将不允许超过CommitLimit(上面详述)的分配。如果需要保证在成功分配内存后由于内存不足而导致进程不会失败,这非常有用。
虽然没有明确说明,但我认为类似在这里意味着calloc
和realloc
。因此,calloc
已经在机会上表现为malloc
。