[SCore-users-jp] メモリの解放について

Hisaki Honjo honjo @ murata.co.jp
2004年 4月 27日 (火) 11:11:20 JST


はじめまして。
本庄と申します。

SCoreを使ってPCクラスタを構築しているのですが、
どうしても分からないことがあり、投稿させていただきました。

現在、ある程度大きなメモリを「一時的」に必要とするシステムを作成しています。
この、「一時的」なメモリは不要になったらすぐに解放しているのですが、
どうも、プロセスが終了するまで解放されていないような挙動を示します。

試しに、簡単なプログラム(添付)を作成し、
topコマンドにて各ノードのメモリ消費量を監視してみると、
やはり、プロセスが終了するまでメモリが解放されていません。
本来なら、「pause 2」の時点で解放されているはず…

ただし、1ノードのみの実行だと解放実行直後に
ちゃんとメモリが解放されていることが確認されています。
つまり、複数台で並列化した場合のみ発生します。

これはなぜなのでしょうか?
プログラムに問題がある場合はアドバイス頂けないでしょうか。

MLの過去ログなども調べてみたのですが、該当する内容が見当たりませんでした。

よろしくお願いいたします。

補足:システムはテスト段階のため、非力なPCを使用しています。
   そのため、一時領域を作成する時点で物理メモリが圧倒的に不足しており、
   殆どスワップメモリが使用されます。

---[環境]-------------------------------------
RedHat Linux 7.3 (Kernel 2.4.21-1SCORE)
SCore 5.6.1
Memory 物理:192MB, スワップ:1GB
CPU : PentiumIII 466MHz Single x 4
----------------------------------------------

---[ソース]-----------------------------------
#include <stdio.h>
#include <stdlib.h>
#include <mpi.h>

int main(int argc, char **argv)
{
	int       nProcess;
	int       nID;
	double  * pData;
	int       i;

	// MPI初期化
	MPI_Init( &argc, &argv );
	MPI_Comm_size( MPI_COMM_WORLD, &nProcess );
	MPI_Comm_rank( MPI_COMM_WORLD, &nID );

	// メモリ確保(500MB)
	pData = (double *)malloc( sizeof(double) * ( 8096 * 8095 ) );
	for ( i=0; i<nSize; i++ ) pData[i] = 0.0;

	// メモリ確保後の確認
	printf( "pause 1 @ %d\n", nID );
	getchar();
	MPI_Barrier( MPI_COMM_WORLD );

	// メモリ解放
	printf( "delete @ %d\n", nID );
	free( pData );

	// メモリ解放後の確認
	printf( "pause 2 @ %d\n", nID );
	getchar();
	MPI_Barrier( MPI_COMM_WORLD );

	// MPI終了
	MPI_Finalize();

	return 0;
}
----------------------------------------------

---[コンパイルおよび実行時のパラメータ]-------
コンパイル> mpicc main.c -o test
実行(OK)  > scrun -nodes=1 ./test
実行(NG)  > scrun -nodes=2 ./test
----------------------------------------------

------------------------
本庄 央樹(Honjo Hisaki)
------------------------



SCore-users-jp メーリングリストの案内