我知道这可能是一个愚蠢的问题,但我一直在寻找一段时间,无法找到明确的答案。如果我使用mmap
或malloc
(在C中,在一台Linux机器上)是否要在RAM中分配空间?例如,如果我有2GB的RAM,并且想要使用所有可用的RAM,我可以只使用malloc/memset
组合,mmap
,还是有其他选项我不知道?mmap或malloc分配RAM吗?
我想写一个系列,可以同时运行,并保持在这个过程中用来强制互换使用的所有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);
}
**编辑:我为我的操作系统使用CentOS 6.4(内核为3.6.0),如果有帮助的话。
我会建议看看'mlock()'或'mlockall()',因为他们在文档中说他们可以将进程的虚拟地址空间锁定到RAM中。 – Macattack
非常依赖操作系统,但由于操作系统管理的优先级,我不认为RAM会保持使用,如果你加载另一个程序,运行的程序将使用RAM,其他人将去交换 –
这里是一个更长的解释,如果你想更详细地去: http://stackoverflow.com/questions/2688466/why-mallocmemset-is-slower-than-calloc/2688522#2688522 [1]:http://stackoverflow.com/questions/2688466/why-mallocmemset-is-slow-calloc/2688522#2688522 – Alex