1

C プログラミング言語とNPTL 2.6を使用して、マルチスレッド モジュラー アプリケーションを開発しています。プラグインごとに、POSIX スレッドが作成されます。問題は、各スレッドが独自のスタック領域を持っていることです。デフォルトのスタック サイズはユーザーの選択に依存するため、場合によっては大量のメモリが消費される可能性があります。

不必要なメモリの使用を防ぐために、次のようなものを使用して、各スレッドを作成する前にスタック サイズを変更しました。

pthread_attr_t attr;
pthread_attr_init (&attr);
pthread_attr_getstacksize(&attr, &st1);
if(pthread_attr_setstacksize (&attr, MODULE_THREAD_SIZE) != 0) perror("Stack ERR");
pthread_attr_getstacksize(&attr, &st2); 
printf("OLD:%d, NEW:%d - MIN: %d\n", st1, st2, PTHREAD_STACK_MIN);
pthread_attr_setdetachstate(&attr, PTHREAD_CREATE_DETACHED);
/* "this" is static data structure that stores plugin related data */
pthread_create(&this->runner, &attr, (void *)(void *)this->run, NULL);

EDIT I: pthread_create() セクションが追加されました。

これは期待どおりに機能しませんでした。によって報告されたスタック サイズpthread_attr_getstacksize()は変更されましたが、アプリケーションの合計メモリ使用量 (ps/top/pmap 出力から) は変更されませんでした。

旧:10485760、新:65536 - 最小:16384

ulimit -s MY_STACK_SIZE_LIMITアプリケーションを開始する前に使用すると、期待される結果が得られます。

私の質問は次のとおりです。

1-) アプリケーションの起動後 (もちろんスレッドを作成する前) に (デフォルトの) スレッドスタックサイズを変更する移植可能な (UNIX バリアント間の) 方法はありますか?

2-) すべてのスレッドに同じスタック領域を使用することは可能ですか?

3-) あまり苦労せずにスレッドのスタックを完全に無効にすることは可能ですか?

4

2 に答える 2

2

#2 と #3 の答えはノーとノーです。各スレッドにはスタックが必要で (他にローカル変数と戻りアドレスはどこに行くのでしょうか?)、それらはスレッドごとに一意である必要があります (そうしないと、スレッドが互いのローカル変数と戻りアドレスを上書きし、全員がクラッシュします)。

#1に関しては...スタックサイズの設定呼び出しがまさにこれに対する答えです。スレッドを作成するのに許容できるサイズを見つけて設定することをお勧めします。

なぜ物事があなたに正しく見えないのかについてはtop.... topメモリ使用量についての悪名高い嘘つきです。:-) ものは実際に割り当てに失敗したり、OOM で強制終了されたりしていますか? スレッドの作成は失敗していますか? パフォーマンスが低下し、ディスクへのページングが増加していますか? これらの質問に対する答えが「いいえ」である場合、心配する必要はあまりないと思います。

以下と上記のいくつかのコメントに基づいて更新します。
まず、16KB は、多くのスタックスペースを必要としないと言うものにはまだかなり大きいです。本当に小さくしたい場合は、x86 Linux で 4096 または 8192 と言いたくなるでしょう。第二に、はい、CPU のスタック ポインターを別のものに設定できmalloc()ますmmap()。スタックポインタを別のものに設定することがどのように役立つと思うかわかりません。main()とは言うものの、もしあなたが呼び出しているスレッドのスタックが大きすぎて (ちょっとクレイジーだと思いpthread_attr_setstacksize()ます)、十分に小さくできない (?)と本当に強く感じているのなら、おそらくあなたは non-を呼び出してスレッドを作成するような移植可能なものclone()syscall を呼び出し、メイン スレッドのスタック ポインターに基づいてスタックを指定したり、他の場所からのバッファーなどを指定したりします。しかし、それでもスレッドごとにスタックが必要であり、私topはまだあなたを失望させるだろうと感じています. 期待値が少し高いのかもしれません。

于 2009-12-04T06:20:58.777 に答える
1

私もこの問題を見てきました。スタックがどのように考慮されるかは不明ですが、「余分な」スペースは合計 VM に対してカウントされ、プロセス境界に達すると問題が発生します (スペースを使用していなくても)。実行している Linux のバージョン (2.6 ファミリ内であっても)、および 32 ビットか 64 ビットかに依存しているようです。

于 2010-05-15T17:39:37.487 に答える