8Gb の RAM を搭載したマシンで Linux (64 ビット、カーネル 2.6、glibc 2.4) OS を実行しているとします。参照されるすべてのプログラムは C 実装です。
プログラム A が開始され、5 GB のメモリを割り当てる (そして内部に情報を書き込む) (malloc を実行する) とします。この後、事前に割り当てられたすべてのメモリが解放されます。これは、かつてメモリにロードされた 5Gb のメモリを使用していたプロセスが、現在非常に低いメモリ使用量で実行されていることを意味します。
プログラム A がまだ実行中で、メモリが使用されていない間に、同じプログラムの別のインスタンス (これをプログラム B と呼びます) を開始し、5Gb のメモリを割り当てようとします。
私が観察しているのは、理論的には十分な空き RAM があるはずですが、プログラム B がすべてのメモリを予約できず、OS がスワップを開始することです。結論として、プログラム A は将来の使用のために 5 Gb の空き RAM を保持し、他のプログラムには使用できないということです。
大量のメモリを割り当てる必要がある OS またはその他のプログラムの観点から、プログラムによって解放されたメモリはどうなりますか? プログラムAを停止せずにOSから強制的にこのメモリを解放する方法はありますか?
単純化しすぎてすみません。
前もって感謝します!
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;
}