3

スレッドのスタック使用状況を監視しようとしています。そのためには、スレッドスタックのアドレスを知る必要があります。それを行う唯一の方法は、を使用してスタックを設定することpthread_attr_setstack()です。

私は現在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番目の質問、このメモリはスレッドが停止したときに自動的に解放されますか?よくわからない場合は、リリースされているかどうかを確認する方法はありますか?

4

1 に答える 1

7

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

スタックの使用状況を本当に測定したい場合pthread_attr_setstackは、おそらく適切なツールですが、それはまったく簡単ではありません。でメモリを割り当て、mmap読み取り専用にします。SIGSEGV次に、書き込み可能な障害のあるページにハンドラーをインストールしmprotect、カウンターをインクリメントして戻ります。これにより、スレッドが実際にアクセスしたページ数がカウントされます。また、シグナルハンドラーは障害のあるスレッドで実行されるため(同期シグナルであるため、これは保証されます)、スレッドローカルストレージ変数にカウントを保持して、複数のスレッドでカウントを実行できます。

pthread_createただし、最初の書き込み試行はおそらく親スレッドから行われる可能性があり、保存しようとしている場合はシグナルハンドラーをそこで実行したくないため、呼び出す前に実際に最後の1〜2ページを書き込み可能にする必要があります。結果としてスレッドローカルストレージになります。

最後に特定の質問にアクセスするには:

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

  2. メモリは解放されず、正式には解放されません。POSIXは、スレッドに与えられたスタックを再利用または解放することは未定義の動作であると明確に述べています。これは、存続期間を確実に決定できないためです(pthread_join戻った後でも、スレッドが終了する最後のいくつかの命令を実行している可能性があります。スタックに触れると、そのように無期限にストールしたままになる可能性があります)。glibc / NPTLでは、スレッド出口でカーネル生成のfutex wakeイベントを使用してシグナルを送信するため、これは不可能だと思います。pthread_joinアトミックにはスレッド出口を使用しますが、NPTLは、このようなスレッドに寄付したスタックをキャッシュして再利用する場合があります(とにかく自分でスタックを再利用/解放することは許可されていないため)。ソースを確認する必要があることを確認してください。そのため、本番コードではまったく使用しないことをお勧めします。pthread_attr_setstackを使用しpthread_attr_setstacksizeます。pthread_attr_setstack現在行っているような開発時のハッキングにのみ使用する必要があります。

于 2012-04-26T14:44:11.780 に答える