マルチスレッドプログラミング

最近、マルチスレッドを使ったプログラムを書くことがあって、これを機にオライリーの「Pthreadsプログラミング」を読んでみました。本書はタイトルの通りPOSIXスレッドAPIの解説書ですが、マルチスレッドプログラミング自体の概要を押さえるのにも役に立つ内容ではないでしょうか。おかげでこれまで曖昧にしていた知識の補完ができて大変参考になりました。

  • プロセスとスレッドの違い
    • スレッドコンテキストとは、すなわちスタックポインタとプログラムカウンタ等のレジスタセットのこと。
    • このコンテキストを切り替えることで、メモリを共有しながら同じプログラム内の異なる命令を並行して実行できる。
  • 並列処理と並行処理の違い
    • 並列処理とは、異なるタスクを同時に実行すること。
    • 並行処理とは、異なるタスクを任意の順番で実行すること。
    • したがって、並列ならば並行は成立するがその逆は成立しない。
  • マルチスレッドプログラムの設計モデル
    • ボス・ワーカーモデル、ピアモデル、パイプラインモデル。
  • Pthreadsの実装方法の種類
    • ユーザースレッドとカーネルスレッド、2レベルスケジューリングスレッド。

それでも、分かったのはせいぜい抽象的な概念のみ。実装レベルに踏み込むと途端に理解があやふやです。試しにid:naoyaさんのスケジューリング・スレッドに関する過去記事を読んでみましたが、頭が追いつかず途中で息切れしてしまいました。まずはマルチスレッドを利用した小さいサーバーでも書いてみましょうか。実際に手を動かしてみた方が理解が深まりそうですし。

ちなみに、MacOSX(というかDarwin)はというと、LinuxのNPTLと同じくユーザースレッドとカーネルスレッドが1対1で対応する1:1モデル。MacOSXは複数のスレッディングAPIを提供していて、各APIの関係は下記のような階層構造になっています。

※ADC Technical Note TN2028より。
この階層図を見て分かるとおり、Machスレッドの上位にPOSIXスレッドが位置し、そのPOSIXスレッドの上位にCoccoa・NSThreadやCarbon・MPタスク等が位置しています。このように、Machスレッドと上位APIの間にPOSIXスレッドを挟んだ設計のおかげで、UnixソフトウェアとMacアプリケーションが同じ環境下で動作可能な仕組みになっているのですね。なお、参考にした資料が、MacOSXがリリースされて間もない頃の内容で、現在のアーキテクチャがどうなっているかは分かりません。どなたかご存じの方がいらっしゃったらご指摘いただけると幸いです。


参考資料

Pthreadsプログラミング

Pthreadsプログラミング