マルチスレッドアプリケーションにおける同期プリミティブ

Systems Performance 5.2.5 Concurrency and Parallelism に各種同期プリミティブについて書かれている。

マルチスレッドプログラミングは、マルチプロセスプログラミングのIPCのような、オーバヘッドのあるインタフェースなしで、スレッドが同じメモリに読み書きできるので、同じアドレス空間を共有する。

データの整合性のために、同期プリミティブが使われ、その結果、複数のスレッドが同時に読み書きしてもデータを壊さない。 同期プリミティブは性能向上のために、ハッシュテーブルと連携して使われることもある。

同期プリミティブ

  • Mutex locks: 一つのスレッドだけがロックを獲得できる。その他のスレッドはブロックして、off-CPUで待つ
  • Spin locks: スレッドがループ(スピン)内でon-CPUでロックを要求しながら、ロックが解放されるかをチェックする。スピンロックは低レイテンシでロックにアクセスできる、ブロックされたスレッドはCPUから離れない。そして、一旦ロックが利用可能になれば数サイクルで、スレッドが起動する準備ができる。ただし、スレッドがスピンして待っている間CPUリソースを無駄に消費する。
  • RW locks(Reader/Writer locks): 複数のReaderだけを許可するか、または、Readerなしで1つのWriterだけで許可することにより、データの整合性を保証する。

Mutex locksはライブラリまたは、Adaptive mutex locksとしてカーネルにより実装されることもある。 Adaptive mutex locksはSpin locksとMutex locksのハイブリッドである。 ロック獲得しているスレッドが現在他のCPUで実行中の場合はスピンする。他のCPUでなければブロックするか、スピンの閾値を超えたらブロックする。 Adaptive mutex locksはCPUリソースを無駄にせず、低レイテンシなロックアクセスができるように最適化されている。 長年、Solarisベースのシステムで使われてきた。 2009年にLinuxで実装されている。mutex: implement adaptive spinning [LWN.net]

参考

前回の ハードウェア仮想化に対するOS仮想化の利点と欠点 - 速いは正義 で、Adaptive mutex locksという言葉がでてきたので調べた。