Native POSIX Thread Library
Native POSIX Thread Library(NPTL)とは、POSIXスレッドを使ったプログラムをLinuxカーネル上で効率的に動作可能とするソフトウェア機能である。
評価結果によると、IA-32上で2秒間で10万スレッドを起動できる。同じ事を NPTL を使わないで行うと、約15分かかった[1][2]。
歴史
[編集]Linuxカーネル 2.4 以前では、プロセスがスケジュール対象であり、スレッドはカーネルでは扱われていなかった。しかし、2.6 で clone()
システムコールがサポートされ、アドレス空間を共有したプロセスのコピーを作成できるようになった。LinuxThreadsプロジェクトはこのシステムコールを使って、カーネルレベルのスレッドをサポートした(それ以前のLinuxでは、POSIXスレッドはユーザーランドで実装されていた)。しかし、POSIXに完全準拠するには問題が多く、特にシグナル制御、スケジューリング、プロセス間同期プリミティブに問題があった。
LinuxThreads の改善には、カーネルサポートとスレッドライブラリの書き換えが必要であることは明らかであった。この要求を満たすべく、2つの競合するプロジェクトが開始された。NGPT(Next Generation POSIX Threads)はIBMを中心とするチームが行い、NPTL はレッドハットが行った。NGPT は2003年中ごろに中止となり、同じころ NPTL がリリースされた。
NPTL は Red Hat Linux 9 で最初にリリースされた。従来の Linux でのPOSIXスレッドは、プロセッサが空いていても使えないことがあり、Windows の方が実装としては優れているとされていた。レッドハットは NPTL がこの問題を解決したとJavaに関するウェブサイトの記事で主張した。
NPTL は Red Hat Enterprise Linux のバージョン3から搭載され、現在では GNU Cライブラリの一部となっている。
設計
[編集]NPTL では、カーネルには依然としてプロセスをスケジューリング対象としているように見せ、スレッドを clone()
システムコールで生成する(NPTLライブラリから呼び出す)。ただし、カーネルサポートが必要な同期プリミティブなどを新たに追加している。このプリミティブを futex と呼ぶ。
NPTL は、いわゆる 1×1 スレッドライブラリであり、ユーザーが pthread_create()
で生成するスレッドは全てカーネル内のプロセスに対応している。これはスレッド実装としては最も単純である。
NPTL の 1×1 モデル以外に、m×n モデルがあり、その場合はユーザーランドのスレッド数がカーネル内でスケジュール対象となるスレッド数よりも多くなる。この場合、スレッドライブラリがユーザースレッドのスケジューリングを行う。スレッド間のコンテキストスイッチが非常に高速になるが、ユーザーランドとカーネルの二段階でスケジュールを管理することで複雑さが増し、優先順位の逆転も起きやすくなる。
関連項目
[編集]脚注
[編集]- ^ Introducing the 2.6 Kernel LINUX Journal、2003年5月1日
- ^ The Native POSIX Thread Library for Linux Red Hat, Inc. 2005年2月21日
外部リンク
[編集]- NPTL Trace Tool NPTLを使ったマルチスレッド・アプリケーションのトレースおよびデバッグツール(オープンソース)
- Linux threading models compared: LinuxThreads and NPTL[リンク切れ]