假设我有一个 Linux(64 位,内核 2.6,glibc 2.4)操作系统,运行在具有 8Gb RAM 的机器上。所有引用的程序都是 C 实现。
程序 A 启动,假设它分配(并在其中写入信息)5 Gb 内存(执行 malloc)。在此之后,它会释放所有预分配的内存。这意味着我们有一个进程曾经使用加载到内存中的 5Gb 内存,现在正在以非常低的内存使用率运行。
当程序 A 仍在运行并且没有使用内存时,我启动了同一程序的另一个实例(我称之为程序 B),试图分配 5Gb 的内存。
我观察到的是程序 B 无法保留所有内存并且操作系统开始交换,尽管理论上它应该有足够的空闲 RAM。结论是程序 A 保留了 5 Gb 的空闲 RAM 以供自己将来使用,并且不能用于任何其他程序。
从操作系统或任何其他需要分配大量内存的程序的角度来看,程序释放的内存会发生什么?有没有办法在不停止程序 A 的情况下强制操作系统释放此内存?
对不起,过于简单化了。
提前致谢!
PS:使用的代码与此类似:
#include <stdlib.h>
#include <stdio.h>
#include <string.h>
#include <math.h>
int main(int argc, char** argv) {
int max = -1;
int mb,x = 0;
char* buffer[1000];
if(argc > 1)
max = atoi(argv[1]);
while((buffer[mb]=malloc(50*1024*1024)) != NULL && mb != max) {
memset(buffer[mb], 0, 50*1024*1024);
mb++;
printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50);
sleep(1);
if((mb%15)==0)
{
for(x=0;x<5;x++)
{
mb--;
free(buffer[mb]);
printf("Allocated %d Mem Blocks, totalling %d\n", mb,mb*50);
sleep(2);
}
}
}
return 0;
}