您尚未登录。

#1 2020-04-22 20:58:09

nsfoxer
会员
注册时间: 2020-04-17
帖子: 14

linux下的内存分配问题

操作系统中的虚拟内存分配,就是当物理内存不足时,系统将暂时不用的页面换进磁盘,
     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;
}

内存如下:free -h 256MB (total)
磁盘使用ext4格式,只有14.7G
而运行程序到:malloc 33461MB才崩溃,这是为什么?

离线

#2 2020-04-22 21:25:19

依云
会员
所在地: a.k.a. 百合仙子
注册时间: 2011-08-21
帖子: 6,041
个人网站

Re: linux下的内存分配问题

内存压力大的时候,内核不一定需要把页面交换进交换空间。有一些页面是可以丢弃的——干净的 I/O 缓存、文件的 mmap(比如可执行文件的文本段、动态库文件)。如果内容不能直接丢弃,那么就是进了交换空间,也就是 swap。swap 不一定是分区,它还可以是文件,或者是内存(比如 zswap,Android 上都在用的)。

这个和 overcommit 有关。如果允许 overcommit 的话(这是一个内核参数),那么内核只管分配、而不管是不是有这么多内存给你用。你实际使用的时候,才会给你分配到实际的内存。如果这时候发现没内存可用了,那么你(或者别的内核认为压力太大的进程)会被 OOM Killer 杀掉。如果禁用 overcommit 的话,malloc 才有可能返回 NULL 指示内存不够用了。

离线

#3 2020-04-22 22:30:38

nsfoxer
会员
注册时间: 2020-04-17
帖子: 14

Re: linux下的内存分配问题

感谢大佬,虽然还有点模糊。类似写时分配加上

memset(ptr, 0, 1024*1024);

后,发现 内存分配明显减少,./c.out > log.txt 自己都被杀掉了,崩溃后log.txt都是空的。。。

最近编辑记录 nsfoxer (2020-04-22 22:38:46)

离线

页脚