1

即使物理 RAM 小于 3 GB,这个有趣的代码总是在 Linux 系统中分配 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();
    }
4

2 回答 2

2

When machines run out of physical RAM to address they can use hard drive space to "act as RAM". This is SIGNIFICANTLY SLOWER but can still be done.

In general there are several levels that the machine can use to access information:

  1. Cache (fastest)
  2. RAM
  3. Hard disk (slowest)

It'll use the fastest when available but as you pointed out sometimes it will need to use other resources.

于 2013-07-06T19:24:59.593 回答
1

默认情况下,在 Linux 中,除非您实际尝试修改它,否则您实际上不会获得 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 TB。不过,我不确定默认值ulimit是什么。因此,找到一个 64 位系统并在其上尝试修改后的程序。我想你会在这里度过一个漫长的夜晚。;-)

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

$ 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

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

于 2013-07-06T19:36:26.707 回答