小编典典

mmap或malloc是否分配RAM?

linux

我知道这可能是一个愚蠢的问题,但是我已经寻找了一段时间,找不到确切的答案。如果我使用mmapmalloc(在Linux机器上的C语言中),是否有人在RAM中分配空间?例如,如果我有2GB的RAM并想使用所有可用的RAM,我可以只使用malloc/memset组合键mmap,还是还有我不知道的另一种选择?

我想编写一系列简单的程序,这些程序可以同时运行,并保留进程中使用的所有RAM来强制使用交换,并且频繁交换页面。我已经在下面的程序中尝试过了,但这并不是我想要的。它确实分配了内存(RAM?),并强制使用交换(如果正在运行足够的实例),但是当我sleep不打电话时,这只是锁定了内存的使用(因此,实际上没有交换任何东西)程序?),还是我误会了一些东西。

例如,如果我运行了3次,我是否会在前两个实例中使用2GB(全部)RAM,然后第三个实例将前两个实例之一(从RAM中)和当前实例交换到RAM中?还是仅使用磁盘或虚拟内存运行实例3?

这就提出了另一点,我是否需要分配足够的内存来使用所有可用的虚拟内存以及要使用的交换分区?

最后,mmap这样做是否会更好(或其他任何C函数。地狱,甚至其他语言,如果适用)?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MB(size) ( (size) * 1024 * 1024)
#define GB(size) ( (size) * 1024 * 1024 * 1024)


int main(){
    char *p;
    p = (char *)malloc(MB(512));
    memset(p, 'T', MB(512));
    printf(".5 GB allocated...\n");

    char *q;
    q = (char *)malloc(MB(512));
    memset(q, 'T', MB(512));
    printf("1 GB allocated...\n");
    printf("Sleeping...\n");

    sleep(300);
}

**编辑:我正在为我的OS使用CentOS 6.4(带有3.6.0内核),如果有帮助的话。


阅读 466

收藏
2020-06-07

共1个答案

小编典典

这非常依赖于OS /计算机。

在大多数操作系统中,都不分配RAM。它们都分配VM空间。它们使一定范围的进程虚拟内存有效使用。通常,操作系统会在第一次写入时稍后分配RAM。在此之前,这些分配不会使用RAM(除了将它们列为有效VM空间的页表之外)。

如果要分配物理RAM,则必须使每个页面(sysconf(_SC_PAGESIZE)使您的系统页面大小)变脏。

在Linux中,您可以在中查看包含所有详细信息的VM映射/proc/self/smapsRss是该映射的驻留集(RAM中驻留了多少),其他所有脏的东西都将被交换掉。所有非脏内存将可供使用,但在那之前将不存在。

您可以使用以下方法使所有页面变脏

size_t mem_length;
char (*my_memory)[sysconf(_SC_PAGESIZE)] = mmap(
      NULL
    , mem_length
    , PROT_READ | PROT_WRITE
    , MAP_PRIVATE | MAP_ANONYMOUS
    , -1
    , 0
    );

int i;
for (i = 0; i * sizeof(*my_memory) < mem_length; i++) {
    my_memory[i][0] = 1;
}

在某些实现中,也可以通过将MAP_POPULATE标志传递给来实现mmap,但是(取决于您的系统)如果尝试映射更多内容而没有可用的RAM
mmapENOMEM则可能会失败。

2020-06-07