Rya*_*yan 12 c linux malloc memory-management
所以我有这个程序分配256 MB的内存,并在用户按下ENTER后释放内存并终止.
#include <stdio.h>
#include <stdlib.h>
int main(void) {
char *p, s[2];
p = malloc(256 * 1024 * 1024);
if ( p == NULL)
exit(1);
printf("Allocated");
fgets(s, 2, stdin);
free(p);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我多次运行这个程序并对每个程序进行后台处理,直到没有足够的内存可以分配.但是,这从未发生过.我运行了一个linux top
命令,甚至在多次运行这个程序之后,空闲内存永远不会下降到256 MB.
但是,另一方面,如果我使用calloc
而不是malloc
那时有一个巨大的差异:
p = calloc(256 * 1024 * 1024, 1);
现在,如果我运行该程序并对其进行后台处理,并重复,每次运行它时,可用内存将减少256 MB.为什么是这样?为什么不会malloc
导致可用的可用内存发生变化,但是calloc
呢?
chu*_*ica 23
malloc()
它不使用内存.它分配它.
分配内存后,通过分配一些数据来使用它.
size_t Size = 256 * 1024 * 1024;
p = malloc(Size);
if (p != NULL) {
memset(p, 123, Size);
}
Run Code Online (Sandbox Code Playgroud)
某些平台实现malloc()
的方式是,在访问该字节(或更可能是组内的字节或字节的"页")之前,不会发生内存的物理消耗.
calloc()
可能会也可能不会真正使用内存.系统可以将大量内存映射到相同的物理归零内存,至少在数据变得有趣之前.请参阅
为什么malloc + memset比calloc慢?
Yu *_*Hao 12
内存可能不是真的可用,特别是你没有p
在你的例子中做任何事情,除了检查它是否NULL
.来自man malloc
默认情况下,Linux遵循乐观的内存分配策略.这意味着当
malloc()
返回非时NULL
,不能保证内存确实可用.如果事实证明系统内存不足,那么一个或多个进程将被OOM杀手杀死.欲了解更多信息,请参阅的说明/proc/sys/vm/overcommit_memory
,并/proc/sys/vm/oom_adj
在proc(5)
和Linux内核源代码文件文档/vm/overcommit-accounting
.
在您的系统上calloc
,\xe2\x80\xa0 实际上通过清除内存来触及内存,并且在许多系统上,内存并未真正分配(因此 \xe2\x80\x9 被占用\xe2\x80\x9d),直到它被它被分配到的进程。因此,仅仅这样做malloc
不会 \xe2\x80\x9cuse\xe2\x80\x9d 内存,直到你使用它。
\xe2\x80\xa0 查看评论
\n 归档时间: |
|
查看次数: |
2424 次 |
最近记录: |