pthreadのデフォルトスタックサイズ

pthreadのデフォルトスタックサイズ

私が理解したのは、Linux上のpthreadのデフォルトのスタックサイズは16Kです。 64ビットUbuntuのインストールで奇妙な結果が表示されます。

$ ulimit -s
8192

返品:

pthread_attr_init(&attr);
pthread_attr_getstacksize(&attr, &stacksize);
printf("Thread stack size = %d bytes \n", stacksize);

Prints
    Thread stack size = 8388608 bytes

スタックサイズが「8388608」ではないと確信しています。何が間違っている可能性がありますか?

ベストアンサー1

実際、あなたの仮想スタックサイズはい8388608バイト(8MB)もちろん、これが本当ではないと結論付けるのは当然です。なぜなら、各スレッドに対してそのスタックは膨大な量のメモリを消費し、99%の場合は数KBで十分であるからです。

良いニュースはスレッドです物理実際に必要なメモリです。これは、プロセッサのハードウェアメモリ管理デバイス(MMU)を使用してオペレーティングシステムが取得する魔法の力の1つです。何が起こるかは次のとおりです。

  1. オペレーティングシステムはスレッドのMMUページテーブルを設定し、スタックに8MBの仮想メモリを割り当てます。ページテーブルエントリのアーカイブにはRAMがほとんど必要ありません。

  2. スレッドが実行され、まだ物理ページが割り当てられていないスタックの仮想アドレスにアクセスしようとすると、MMUは「ページエラー」というハードウェア例外をトリガします。

  3. CPUカーネルは特権実行モード(セルフスタックを使用)に切り替え、カーネルの内部ページエラー例外ハンドラを呼び出してページエラー例外に応答します。

  4. カーネルは物理RAMページをこの仮想メモリページに割り当て、それをユーザー空間スレッドに返します。

この操作はユーザー空間スレッドには表示されません。その観点からは、まるでメモリが常にそこにあったかのようにスタックを使用します。同時に、スタックはスレッドの要件を満たすために自動的に増加または増加しません。

MMUは、今日のコンピュータシステムにとって重要なハードウェアの一部です。特にシステムは多くの「魔法」を担当しているので、MMUの機能と仮想メモリ全体について詳しく学ぶことをお勧めします。また、アプリケーションがパフォーマンスに敏感で大量のデータを処理する場合は、TLB(MMUのページテーブルキャッシュ)がどのように機能するか、およびデータまたはアルゴリズムを再構成してTLBヒット率を最大化する方法を理解する必要があります。

おすすめ記事