2012-04-26 20 views
3

スレッドのスタック使用量を監視しようとしています。これを行うには、スレッドスタックのアドレスを知る必要があります。これを行うには、pthread_attr_setstack()を使用してスタックを設定するしかありません。pthreadスタックにメモリを正しく割り当てる方法

私は現在、メモリを割り当てるためにはmmapを使用しています:

pthread_attr_t ptAttr; 
    pthread_t pth; 
    pthread_attr_init(&ptAttr); 
    void *stack = mmap(NULL, stksize, PROT_WRITE|PROT_READ, MAP_ANONYMOUS|MAP_SHARED, -1, 0); 
    pthread_attr_setstack(&ptAttr, stack, stksize); 
    pthread_create(&pth,&ptAttr,threadFunc,&info); 

だから、最初の質問を、これはmmapでメモリを割り当てるのは良い方法ですか?フラグは正しいですか?代わりにmallocを使用する必要がありますか?これは、仮想/スワップメモリ​​を持たない低リソースデバイス上で実行されます。

2番目の質問ですが、このメモリはスレッドが終了すると自動的に解放されますか?あなたがわからない場合は、それがリリースされているかどうかを調べる方法はありますか?

答えて

7

"モニタ"とはどういう意味ですか?スタックのためにあまりにも多くのスペースが無駄にならないようにするには(32ビットシステムやRAM +スワップの少ないスレッドに多くのスレッドを持たないようにする)、単にpthread_attr_setstacksize関数を使うべきです。 pthread_attr_setstack。この方法では、スタックの割り当てを自分で行う必要はありません。スレッドが一度に複数のページをスタックに割り当てることを心配している場合は、防護として大きな保護ゾーンを確保するために、オプションでpthread_attr_setguardsizeを使用することもできますが、これは仮想アドレス空間を消費することに注意してください。

実際に測定値を使用する場合は、おそらくpthread_attr_setstackが正しいツールですが、それはまったく単純ではありません。私はmmapとメモリを割り当て、それを読み取り専用にします。その後、エラーのあるページ書き込み可能なmprotectSIGSEGVハンドラをインストールし、カウンタをインクリメントしてリターンします。これはスレッドが実際に触れるページの数をカウントします。シグナルハンドラはフォールティングスレッドで実行されるので(これは同期信号なので保証されます)、スレッドローカルストレージ変数にカウントを保持して、複数のスレッドでカウントを実行できます。

最初の書き込みの試みは、おそらく親スレッドから発生します、そしてあなたならば、あなたはおそらく」は実行されているシグナルハンドラをしたくないので、あなたが実際に、しかし、pthread_createを呼び出す前に、最後のページまたは2を書き込み可能にする必要があるかもしれませんスレッドローカルストレージに結果を格納しようとしています。最後に、あなたの特定の質問にアクセスするには

  1. あなたはMAP_SHAREDを望んでいません。このフラグは、プロセス間で共有されるメモリ用のフラグです。あなたの場合はおそらく怪我をしませんが、誤解を招きます。 MAP_PRIVATEを使用してください。

  2. メモリは解放されません。形式的には、は決してとなります。 POSIXは、スレッドに与えられたスタックを再利用したり解放したりするための未定義の振る舞いを明示しています。pthread_joinが返っても、スレッドが最後のいくつかの命令をまだ実行しているのでスタックにまだ触れていて、それが無期限に長く停滞している可能性があります)。私はこれがではないと信じています glibc/NPTL上で、スレッド終了時にアロケートでpthread_joinというシグナルを出すために、スレッド出口でカーネル生成のfutexウェイクイベントを使用する方法があるためにNPTLがスレッドに寄付したスタックをキャッシュし、 (あなたはあなた自身を再利用/自由にすることは許されていないので)ソースを確認する必要があることを確認します。そのため、私は、生産コードでは全くpthread_attr_setstackを使用してませをお勧めします。 pthread_attr_setstacksizeを使用してください。 pthread_attr_setstackはあなたが今やっているかもしれないもののように、開発時のハックのために使用すべきです。あなたの答えのための

+0

感謝。実際には開発用であり、生産用ではありません。安定性の問題の測定として、時間の経過とともに最大スタック使用量を測定しようとしています。私たちが計画していることは、特定の文字や単語にスタックメモリを初期化し、しばらくの間、スレッド実行させ、その後、我々はパターンが破壊される前に、これがあるスタックのどれくらいを見つける取得どのくらいスタックダウンチェックすることです使用された。あなたが言及したように、私はいくつかの余分なメモリを割り当て、mprotectを使ってガードページを作成します。 – barsju

+0

メモリを解放すると、それは我々がとにかく停止されることはありませんに興味があるものから、大きな問題になることはありません。 – barsju

+0

あなたの方法(上書きさパターンをチェックする)は、おそらく実際に動作し、それは私が説明した設定よりも簡単です。 –

関連する問題