页次: 1
操作系统中的虚拟内存分配,就是当物理内存不足时,系统将暂时不用的页面换进磁盘,
1. 我想知道,在linux下,这里的磁盘是否指的就是swap分区?
2. 在virtualbox中,测试程序如下:
#include <stdio.h>
#include <stdlib.h>
int main(){
char *ptr;
int i;
i = 0;
while (1) {
++i;
ptr = (char *)malloc(1024*1024);
if (ptr == NULL)
exit(1);
printf("Now allocate %d MB\n", i);
sprintf(ptr, "Hello");
}
return 0;
}
内存如下:
磁盘使用ext4格式,只有14.7G
而运行程序到:malloc 33461MB才崩溃,这是为什么?
离线
内存压力大的时候,内核不一定需要把页面交换进交换空间。有一些页面是可以丢弃的——干净的 I/O 缓存、文件的 mmap(比如可执行文件的文本段、动态库文件)。如果内容不能直接丢弃,那么就是进了交换空间,也就是 swap。swap 不一定是分区,它还可以是文件,或者是内存(比如 zswap,Android 上都在用的)。
这个和 overcommit 有关。如果允许 overcommit 的话(这是一个内核参数),那么内核只管分配、而不管是不是有这么多内存给你用。你实际使用的时候,才会给你分配到实际的内存。如果这时候发现没内存可用了,那么你(或者别的内核认为压力太大的进程)会被 OOM Killer 杀掉。如果禁用 overcommit 的话,malloc 才有可能返回 NULL 指示内存不够用了。
离线
感谢大佬,虽然还有点模糊。类似写时分配加上
memset(ptr, 0, 1024*1024);
后,发现 内存分配明显减少,./c.out > log.txt 自己都被杀掉了,崩溃后log.txt都是空的。。。
最近编辑记录 nsfoxer (2020-04-22 22:38:46)
离线
页次: 1