0

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;
}
4

2 に答える 2

0

Linux では、このコマンドを使用してメモリとダーティ キャッシュを解放します。

同期; エコー 3 > /proc/sys/vm/drop_caches

これが、使用されていないメモリの解放に役立つことを願っています。

于 2013-05-07T11:58:20.430 に答える