为什么这种奇怪的内存分配行为

时间:2013-07-06 19:22:23

标签: c memory-management ambiguous

这个有趣的代码总是在Linux系统中分配3 GB内存,即使物理RAM小于3 GB。

如何? (我的系统中有一个2.7 GB的RAM,这段代码分配了3.054 MB内存!)

    #include <stdio.h>
    #include <string.h>
    #include <stdlib.h>
    int main(int argc, char *argv[])
    {
        void *ptr;
        int n = 0;
        while (1) {
            // Allocate in 1 MB chunks
            ptr = malloc(0x100000);
            // Stop when we can't allocate any more
            if (ptr == NULL)
                break;
            n++;
        }
        // How much did we get?
        printf("malloced %d MB\n", n);
        pause();
    }

2 个答案:

答案 0 :(得分:2)

当机器耗尽物理RAM来解决时,他们可以使用硬盘空间“充当RAM”。这显着降低,但仍可以完成。

通常,机器可以使用多个级别来访问信息:

  1. 缓存(最快)
  2. RAM
  3. 硬盘(最慢)
  4. 它会在可用时使用最快,但正如您所指出的那样,它有时需要使用其他资源。

答案 1 :(得分:1)

默认情况下,在Linux中,在实际尝试修改RAM之前,实际上并没有获得RAM。您可以尝试按如下方式修改程序,看看它是否会更快死亡:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char *argv[])
{
    char *ptr;
    int n = 0;
    while (1) {
        // Allocate in 4kb chunks
        ptr = malloc(0x1000);
        // Stop when we can't allocate any more
        if (ptr == NULL)
            break;
        *ptr = 1;  // modify one byte on the page
        n++;
    }
    // How much did we get?
    printf("malloced %d MB\n", n / 256);
    pause();
}

如果你有足够的交换但RAM不足,那么这段代码将开始大量颠覆交换文件。如果你没有足够的交换,它可能会在它到达终点之前崩溃。

正如其他人所指出的,Linux是一个虚拟内存操作系统,当机器的RAM少于应用程序请求时,它将使用磁盘作为后备存储。您可以使用的总空间受到三件事的限制:

  • 分配给交换的RAM和磁盘的总量
  • 虚拟地址空间的大小
  • ulimit
  • 施加的资源限制

在32位Linux中,操作系统为每个任务提供3GB的虚拟地址空间。在64位Linux中,我相信这个数字是100兆兆字节。不过,我不确定默认ulimit是什么。因此,找到一个64位系统并尝试修改后的程序。我想你会待一个漫长的夜晚。 ; - )

编辑:这是我的64位Ubuntu 11.04系统上的默认ulimit值:

$ ulimit -a
core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 20
file size               (blocks, -f) unlimited
pending signals                 (-i) 16382
max locked memory       (kbytes, -l) 64
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) unlimited
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited

因此,似乎没有任务的默认内存大小限制。