c - mmap 或 malloc 是否分配 RAM?

标签 c linux memory malloc mmap

我知道这可能是一个愚蠢的问题,但我一直在寻找一段时间,无法找到明确的答案。如果我使用 mmapmalloc (在 C 语言中,在 linux 机器上)是否会在 RAM 中分配空间?例如,如果我有 2GB 的 RAM 并且想要使用所有可用的 RAM,我可以只使用 malloc/memset 组合、mmap,还是有其他我不使用的选项?不知道吗?

我想编写一系列可以同时运行的简单程序,并保留进程中使用的所有 RAM 以强制使用交换,并频繁换入/换出页面。我已经用下面的程序试过了,但这并不是我想要的。它确实分配了内存(RAM?),并强制使用交换(如果有足够的实例正在运行),但是当我调用 sleep 时,这并不仅仅是锁定内存不被使用(所以没有什么是实际上是从其他进程中换入或换出的?),还是我误解了什么。

例如,如果我运行 3 次,我将使用前两个实例的 2GB(全部)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);
}

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

最佳答案

这非常依赖于操作系统/机器。

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

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

在 Linux 中,您可以在 /proc/self/smaps 中查看包含所有详细信息的 VM 映射。 Rss 是该映射的常驻集(有多少驻留在 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 来实现,但是(取决于您的系统)它可能会失败 mmapENOMEM 如果你尝试映射更多,那么你有可用的 RAM。

关于c - mmap 或 malloc 是否分配 RAM?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21119617/

相关文章:

linux - BASH: 发送 SIGTSTP 信号 (ctrl+z)

c# - 用 Mono 编译 csharp 项目

php - 如何故意造成 "Fatal error: Allowed memory size of xxx bytes exhausted"

memory - Redis - 监控内存使用情况

c++ - Windows 上的 CMake

c++ Windows - 如何从其路径获取进程PID

c - 使用定义不同于内部使用的外部头文件

在 C 中创建字符串值并将其添加到二维数组

linux - 将 AWK 应用于具有相同扩展名的文件集

c - 段错误: 11 Pointers and Structures