2009年3月12日から15日までの4日間、東京において「AsiaBSDCon 2009」が開催された。本誌では、同カンファレンスの中から特に興味深いセッションをピックアップしてお伝えする。

FreeBSDロック処理の背後にあるコンセプト - よく理解して使うこと

Attilio Rao氏 - The FreeBSD Projec

マルチコア/プロセッサ化に対応すべく、FreeBSDはカーネルからサブシステムに至るまで改善に取り組んできた。このFreeBSDロック処理の取り組みの背後には、開発者に対して「ロックを使うところでは問題や動作をよく理解したうえで、適切で正しいプリミティブを使うこと」といったように、ロックを使う側でロック問題への理解やカーネルが提供しているロック手段といった2つの物事への理解を求めている。

AsiaBSDCon 2009ではAttilio Rao氏がFreeBSDカーネルにおけるロック機能の解説をおこなった。FreeBSDカーネルが提供しているロック機構やその分類、特徴、どういったロックを使うべきかが見渡せる発表だ。FreeBSDカーネルの開発に限らず、ロック処理を実装する場合の参考になる内容といえる。

FreeBSD 4とSMPngプロジェクト前夜 - 事の発端は

ロック処理の話を知るにあたっては、なぜ現在の実装へ至ることになったのか、その最初を知っておくとわかりやすい。それはFreeBSD 4系における問題の明確化が事の発端になっている。FreeBSD 4系ではマルチスレッドプリエンプションを実現すべく開発が行われたものの、スキーマにある問題が明かになり実行中のスレッドがプリエンプションされるとアクティブに戻った段階でエラーが起こったりリソースにアクセスできないという問題があることが明かになった。

この問題を避けるために、カーネルスペースで実行中のスレッドに対してはプリエンプションを許可しないとかロックとしての割り込みを実行させないといった実装をおこなうものの、この方法ではマルチプロセッサでは性能がスケールせず好ましくない。1度にカーネルで実行できるスレッドは1つまでという制限を課すことになるため、コアやプロセッサが増えるほど不利になるという状況になった。これがSMPngへつながっていく。

SMPngプロジェクト (2003-2007, 5.0-RELEASE-7.0-RELEASE)とポストSMPng

こうした問題を解決し、マルチスレッドプリエンプションに対応した再入不能なカーネルを開発しようというプロジェクトがSMPngプロジェクトだ。最終的には適切なロック機構の実装、新しいカーネルメモリアロケータの実装、スケジューラアクティビティからBKLの削除と適切なスピンmutexへの置き換え、ithreadの実装などがおこなわれた。

BKLから適切なロックの置き換えと、もう一つ注目されるのはithreadの実装だ。ithreadが実装されたことでドライバが割り込みハンドラをインストールして自身のコンテキストを実行時にアサインできるようになった。つまりすべての割り込みハンドラがスリープ可能ロックを使うことが出きるようになったり、さらにほかの機能も使えるようになった。ネットワークサブシステムの並列度向上にもithreadが使われている。カーネル内処理の並列度を向上させるうえで欠かせない機構だ。

SMPngプロジェクト終了後は、古いロック機構を使っている部分の書き換えや、ithreadをさらに拡張するinterrupt filtering機能の実装がおこなわれている。最近のFreeBSD開発でよくキーワードとして見かけるithreadやr/w lock、rm lock、mutexなどはこのあたりの話をひと通り把握しておくとわかりやすくなる。