【发布时间】:2014-02-02 20:54:15
【问题描述】:
我知道这可能是一个愚蠢的问题,但我一直在寻找一段时间,无法找到明确的答案。如果我使用mmap 或malloc(在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 内核),如果有帮助的话。
【问题讨论】:
-
我建议查看
mlock()或mlockall(),因为他们在文档中说他们可以将进程的虚拟地址空间锁定到 RAM 中。 -
非常依赖于操作系统,但由于操作系统管理优先级,我认为如果您加载另一个程序,RAM 将不会继续使用,运行的程序将使用 RAM,其他程序将去交换
-
这里有一个更详细的解释,如果你想更详细:stackoverflow.com/questions/2688466/… [1]:stackoverflow.com/questions/2688466/…
-
"只使用磁盘或虚拟内存运行" - 请注意,这些不是替代方案。虚拟内存描述了将底层存储从您手中抽象出来的整个操作系统机制。数据可以物理存储在磁盘或 RAM 中,或者根本不存储(在未提交内存的情况下)。
标签: c linux memory malloc mmap