c-为什么会出现这种奇怪的内存分配行为



这段有趣的代码在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 MBn", n);
        pause();
    }

当机器没有物理RAM来寻址时,它们可以使用硬盘空间"充当RAM"。这是明显缓慢的,但仍然可以做到。

一般来说,机器可以使用几个级别来访问信息:

  1. 缓存(最快)
  2. 闸板
  3. 硬盘(最慢)

它将在可用时使用最快的资源,但正如您所指出的,有时它需要使用其他资源。

默认情况下,在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 MBn", 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

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

相关内容

  • 没有找到相关文章

最新更新