読者です 読者をやめる 読者になる 読者になる
スポンサーリンク

Windowsのプロセスとスレッドの勉強メモ

Windows ハードウェア

以下のページを読み進めて,覚えておきたい事項をメモ。

Windows の限界に挑む: プロセスとスレッド
http://technet.microsoft.com/ja-jp/wi...

序論

  • Linuxシリーズのことを,MS陣では「UNIXバリアント」と呼び捨てる。
  • プロセス数とスレッド数がOS内で到達できる上限値を考慮する場合,まずスレッド数の上限を考えるべき。なぜなら,各プロセスは最低一つのスレッドを持つから。

プロセスとスレッド

  • プロセスとは,バイナリの実行をホストするコンテナである。しかし,実際に実行されているのはその内部のスレッドである。

スレッドの制限

  • メモリ内では,スレッドを増やすたびに,「スレッドごとに各々専用の」スタック領域が与えられる。なお,メモリ内で割り当てられた領域のことをコミット済みの領域という。
  • あるスレッド用のスタック内で,コミット済みつまり使用中の領域と,予約用に準備された領域に加えて,その間にはガードページがある。ここにアクセスすると,予約部分から新規領域が自動コミットされる仕組み。元ページの図を参照。
  • 標準的なEXEモデルでは,スレッドスタックのサイズに関する値も初期値が決まっている。予約領域が1MBで,初期の自動コミット分が1ページつまり4KB。アプリケーションのビルド時に変更可能(1MBも使わないことが明らかな場合とかにオーバーライドして変更)だが,基本的にはこのサイズ。
  • したがって,プロセスが作成できるスレッド数の上限は,プロセスが利用するアドレス空間のサイズを,このスタックサイズで割った分だけの個数になる。で,32ビットOSの場合は具体的にいくつなのか?

32 ビット スレッドの制限

  • 32ビットアプリケーションが利用できるアドレス空間は2GBであり,さきほどのスレッドスタックサイズが1MBである事を考えると,割り算すれば1プロセスあたり2000個ぐらいのスレッドが上限数。理屈上の値なので,実際にはもっと少ない。
  • 32ビットアプリケーションを64ビットOS上で実行した場合,作成可能なスレッド数の上限は,単純に2倍にはならない。3000個ぐらいになる。理由は,スレッドスタックとして32ビット用と64ビット用の両方が作成されるから。
    • testlimitというツールで具体的な数を算出できる。詳細は元記事を参照。キャプチャも載っている。
  • さらに細かく言うと,各スレッドが持つスレッドスタックは,前述の1MB標準の「ユーザモードスレッドスタック」以外にも,カーネルモード用のスレッドスタックがある。スレッドがアクティブな時には全社が使用され,そうでないときには後者のスタック領域が使われる。

64 ビット スレッドの制限

  • 32ビットアプリケーションの場合と同じく,64ビットアプリケーションの場合にも,スレッドスタックのサイズは初期値では1MB。そして64ビットOSでは理論上では8TBまで1プロセス用にアドレス空間がある。
  • だけど実際にはそこまでのリソースをマシンに積んでいないから,64ビットOSで1プロセスが作成できるスレッド数の上限は,物理的なリソースに左右されることになる。
  • ここまでがスレッドの話。スレッドの制約が理解できれば,次はプロセスの制約の話に進む事ができる。

プロセスの制限

  • プロセス生成時には,OSにより,プロセスの実行に最低限必要なだけの,つまり「プロセスの最小ワーキングセットサイズに対応できるだけの」メモリが確保されるのだが,その量は200KBがデフォルトである。

スレッドとプロセスの十分な数とは

  • 結論として,スレッド数とプロセス数の上限は,状況によって異なる。異ならせる要素としては,アプリケーションビルド時に設定されたスレッドスタックサイズや,マシンのメモリ量,またOSのアドレス空間のモデル。

補足

冒頭のページの存在を教えて下さったのは,id:psne氏だ。感謝。

要は、コマンドプロンプトをたくさん起動しても、途中でメモリがいっぱいになって、新たにcmdを起動できないという状況になるたけであり、OSを落とすどころかフリーズさせる事すら不可能、ということですね。

バッチファイルを考える - ネタまとめ
http://d.hatena.ne.jp/psne/20131118/p1


発端になった質問
http://q.hatena.ne.jp/1384673961#a121...