JDK 1.1 開発ガイド (Solaris 編)

Solaris 上の Java マルチスレッドの利点

Solaris のマルチスレッドカーネルは、Solaris オペレーティングシステムの特に重要な構成要素の 1 つです。このマルチスレッドカーネルによって Solaris オペレーティングシステムは、効率的な並列処理を実現し、高機能を備えている、唯一の標準的なオペレーティングシステムになっています。

Solaris 上の Java は、カーネルのマルチスレッド機能を利用しています。開発者は、単純なプログラミングインタフェースを使用して、マルチプロセッサあるいはシングルプロセッサシステム用の、数千のユーザーレベルのスレッドを持つ Java アプリケーションを作成することができます。

Solaris 上の Java 環境は、「複数対複数」のスレッドモデルをサポートします。図 2-4 に示すように、Solaris の 2 レベルアーキテクチャは、軽量プロセス (LWP) と呼ばれる中間層を提供することによって、プログラミングインタフェースと実装とを分離します。LWP が提供されることにより、アプリケーション開発者は、汎用のアプリケーションレベルのインターフェースを使用して、高速で負荷が軽いスレッドを短期間に作成できます。スレッドを利用するようにアプリケーションを作成しておけば、実行時環境側でスレッドライブラリの実装に基づいて実行可能なスレッドを実行時資源 (LWP) に多重化し、スケジューリングしてくれます。

各 LWP は、コードやシステムコールを実行する仮想の CPU のような動作をします。LWP は、スケジューリングクラスと優先順位に従って、カーネルによって個々にディスパッチされる (振り分けられる) ため、独立にシステムコールを行なったり、独立にページフォルトを発生させたり、複数のプロセッサ上で並列的に動作したりすることができます。スレッドライブラリは、システムのスケジューラとは別のユーザーレベルのスケジューを提供します。ユーザーレベルのスレッドは、カーネルのスケジューリングが可能な LWP によってカーネル内でサポートされます。カーネルの LWP プール上に、多数のユーザースレッドが多重化されます。

図 2-4 Solaris の 2 レベルアーキテクチャ

Graphic

Solaris スレッドでは、ユーザーレベルのスレッドを LWP に結合するかあるいは LWP に結合しないままにするかを、アプリケーションが選択することができます。ユーザーレベルのスレッドと LWP とは、排他的に結合されます。スレッドの結合は、リアルタイムの応答を必要とするアプリケーションなど、自身の多重性 (並列処理) を厳密に制御する必要があるアプリケーションにとっては便利です。スレッド結合を行う Java API はありません。大部分の Java アプリケーションでは、スレッド結合は必要ないと考えられるためです。結合が必要な場合は、Solaris のネイティブメソッド呼び出しを行なって結合することができます。

このため、すべての Java スレッドはデフォルトでは非結合状態になっています。ユーザーレベルの非結合スレッドの並列処理は、スレッドライブラリが制御します。スレッドライブラリは、アプリケーションが必要とする非結合スレッドに合わせて LWP プールを大きくしたり小さくしたりします。

Solaris 環境のすべての Java アプリケーションで、Solaris 上の Java スレッドに固有の次の機能をデフォルトで使用できます。


注 -

一般的に、ネイティブスレッドを使用する Solaris のネイティブ機能を、Java アプリケーションが使用しないようにしてください。Java アプリケーションが Solaris プラットフォーム用に限定されてしまい、他のプラットフォームで動作しなくなる可能性があります。また、100% Pure JavaTM にも準拠しなくなります。


Java アプリケーションから Solaris 固有の機能にアクセスすることは推奨できませんが、次に Solaris のマルチスレッドアーキテクチャの豊富な機能の例を紹介します。

Solaris の 2 レベルモデルでは、多数の異なるプログラミング要件を満たすことができるよう、従来では見られないような高い柔軟性が提供されます。ウィンドウプログラムのように (少なくとも) 見かけ上は多くの要求を並列に処理する必要があるプログラもあれば、行列の乗算を行うプログラムのように並列演算を実際に使用可能な数のプロセッサに割り当てる必要のあるプログラムもあります。2 レベルモデルであることによって、カーネルは、システムサービスに対するスレッドからのアクセスをブロックしたり制限したりせずに、あらゆる種類のプログラムの並列処理要求に応えることができます。

Solaris 上の Java は、システム資源を効率的に使用するように設計されています。スレッドを使用することによるオーバーヘッドを最低限に抑えながら、アプリケーションに数千のスレッドを持たせることができます。スレッドはそれぞれ独立して動作し、同じプロセス中の他のスレッドとプロセス命令を共有したり、データを透過的に共有したりします。またスレッドは、プロセスのオペレーティングシステム状態の多くを共有するので、あるスレッドで開いたファイルを他のスレッドから読み込むこともできます。また程度の差はありますが、別々のプロセス間の同期をとることもできます。

Solaris のスレッドモデルに基づく Java は、速度、多重性、機能、カーネル資源の利用の面で、最良の組み合わせを提供します。