2013-06-02 11 views
6

私はメモリの制限のセット(理想的には、データセグメント、同様のスタックとヒープ)でプロセスを実行したい 私のコードはセットC中のプロセスのメモリ制限

child = fork(); 
if (child == 0) 
{ 
    ... 
    execv(program, args); 
} 
wait(&status); 
ようになります

この構造浮き袋する必要があり、私は(実行時間などを計測リダイレクトSTDIN /アウト、)それにいくつかのものを行う

私の質問:どのように私はプログラムプロセスのメモリ制限を設定し、親に知らせることができ、それを超えたら?プロセスはsigsegvで殺されるべきではありません、私は知りたい、プロセスはこのメモリ制限のために殺されました。 それが完了したら、このプロセスのメモリ使用量を取得する方法はありますか?プロセスが終了した後、最大使用メモリを比較することができます。

私は実行時間を遅くすることはできないため、valgrind(または類似のもの)を使用することはできません。

答えて

3

子プロセスの確認後で、execv()コールの前にsetrlimit()に電話をかけることができます。私は親に通知する方法を知らないが、おそらくこれは正しい方向にあなたを指し示します。

+0

setrlimitは制限を適切に設定しますが、メモリをmallocして使用すると、プロセスがsigsegvを呼び出すため、待機状態になります。私はこれらを区別したい。 –

+0

子が終了して待機した後、 'RUSAGE_CHILDREN'と一緒に' getrusage() 'を使って、子が使うリソースを数えます。 – caf

+0

getrusageは素晴らしい機能ですが、 "常駐セットサイズ"は私に役立ちません(それは?)残りはLinuxでは使用されていません。 –

1

system(またはsetrlimit、マイクの書いたとおり)の中にulimitと電話することができます。プログラムがその限界に達すると、mallocは失敗します(つまりNULLを返します)。その状況を処理する必要があります(エラーで終了するか、ヌルポインタにアクセスしようとするとSIGSEGVで終了します)。

親にシグナリングについて...子プログラムを変更できますか?特定の終了コードを返すことができます。

+0

いいえ、私は子プログラムを変更できません。 Setrlimitは動作しますが、sigsegvを送信します。/ Mallocエラー処理は保証されていません。 私はsystem()を使用したくありません –

+0

このようなプログラムはどうしたらいいですかhttp://www.pixelbeat.org/scripts/ps_mem.py?あなたはプログラムにいかなる制限も使用しませんが、使用されたメモリの量を測定することができます。 –

+0

残念ながら。私はそれを定期的に呼び出す必要があります、それを解析し、最大値を選択してください。それでも、それは非常に不正確です。 –

1

この問題を解決するには、独自のメモリマネージャを作成してください。

morden OS用に書かれた多くのアプリケーションでは、libcのmalloc/freeは問題ありませんが、大きなメモリが必要なアプリケーションではありません。 glibcのmalloc/freeのラッパーであるツリー構造のメモリコンテキストクラスを書くことができます。これは、メモリを割り当て、このメモリコンテキストで使用されるメモリを予約し、メモリを解放したときに予約された値から値を差し引いたものです。実際に使用したメモリサイズを知ることができます。