NetWareオペレーティングシステムの中心は統合カーネルです。MPK (マルチプロセッシングカーネル)は、スレッドの管理、プロセッサリソースのスケジューリング、割り込みと例外の処理、およびメモリとI/Oサブシステムへのアクセス管理を行います。
詳細については、次のセクションを参照してください。
スレッドは、命令を個別に実行できる制御のストリームです。単純な定義によれば、スレッドは実行の単位です。コードそのものではありません。
ヒント: スレッドの詳細については、Bil Lewis、Daniel J. Berg著『Threads Primer: A Guide to Multithreaded Programming』((C) Sun Microsystems, Inc.)を参照してください。先に示した「スレッド」の定義は、この書籍から引用しています。
カーネルは、実行キューという名前のデータ構造を保持しており、ここにレディ状態のスレッドが格納されます。ユニプロセッサシステムの場合は、実行キューは1つだけで、プロセッサはこのキューからスレッドを取得して実行します。
複数のプロセッサを使用できるマルチプロセッシングシステムの場合は、複数のソリューションが可能です。マルチプロセッサへのスレッドの分散は、グローバル実行キューまたはプロセッサごとの実行キューによって行われます。前者は、すべてのプロセッサが1つの実行キューを共有するものであり、後者は、ローカル実行キューまたは分散型実行キューとも呼ばれています。両者が組み合わされることもあります。
各アプローチの特徴は次のとおりです。
グローバル実行キュー このアプローチでスレッドを分散する場合、負荷分散が自動的に行われるという利点があります。レディ状態のスレッドが実行キューにある限り、プロセッサがアイドル状態になることがないのが、その理由です。ただし、グローバルソリューションは、システム内のプロセッサ数が増えるとボトルネックになるという欠点を持ち合わせています。それでも、特定のスケジューリングポリシー(リアルタイムスケジューリングポリシーなど)では、グローバルキューが必要な場合があります。
プロセッサごとの実行キュー このアプローチには、キャッシュの親和性を利用できるという利点があります。つまり、スレッドは、前回実行されたプロセッサで優先的にスケジュールされます。また、このアプローチの場合、グローバル実行キューのアプローチに見られるようなボトルネックの問題はありません。 ただし、ローカルキューの場合は、プロセッサ上の負荷、つまりキュー内のスレッド数が、極端に均衡を欠くことがないように注意する必要があります。あるプロセッサにスレッドが集中し、別のプロセッサはアイドル状態のままであるような負荷の不均衡に対処するために、負荷分散のメカニズムが必要です。
NetWareカーネルでは、プロセッサごとの実行キューを使用しています。その結果、プロセッサは、各自のローカル実行キューからのみスレッドを取得して実行できます。このため、NetWareスケジューラは、グローバル実行キューを使った実装に比べて、格段に拡張性があります。負荷の不均衡を解決するために、NetWareでは、優れた負荷分散アルゴリズムが使用されています。
すべての負荷分散方式に共通する2つの重要な要件は、安定性(小さな負荷の不均衡に対して過剰に反応しない)と、処理する負荷をすばやく分散できることです。
NetWareスケジューラは、しきい値を使用することで、安定性の要件に対処しています。システムにおける負荷の不均衡がしきい値を超えると、負荷分散メカニズムが起動します。
しきい値を低く設定すると、高い場合に比べて、負荷の不均衡に対する許容度が低くなります。このため、低い値の場合は、負荷分散が頻繁に発生し、スレッドの移動が過度に行われます。高い値の場合は、負荷の不均衡に対する許容度は高まりますが、その結果、負荷分散メカニズムの起動回数が減少します。ただし、しきい値の最適値を設定することによって、過剰なスレッドの移行を防ぐことができ、その一方で負荷の不均衡を必要な場合のみ是正できます。
NetWareスケジューラは定期的にシステム全体の負荷と平均負荷を計算し、後者を使って負荷を比較して、各プロセッサが過負荷または負荷不足の状態にないかどうかを判別します。
負荷分散のしきい値と計算された平均負荷を元に、高トリガ負荷と低トリガ負荷が決まります。
この状況の場合、過負荷プロセッサのスレッドが負荷不足プロセッサに移動され、負荷が分散されます。平均負荷、負荷分散しきい値、高トリガ負荷、および低トリガ負荷の関係について、次の図を参照してください。
図: 1
平均負荷、しきい値、高トリガ負荷、および低トリガ負荷
しきい値に幅がないと、スレッドはあるプロセッサから別のプロセッサへと絶えず移動することになり、システムの生産性が損なわれます。
警告: しきい値は各自で設定可能ですが、あらかじめ設定されている最適値をそのまま使用することを強くお勧めします。検討の結果、しきい値を変更することになった場合は、独立したシステムでテストしてから、実際の稼動環境で値を変更します。しきい値を変更する場合は、これを常に最適値にリセットできることを念頭に置いてください。
しきい値は、NetWare Remote Managerを使って変更できます。詳細については、「負荷分散のしきい値の設定」を参照してください。
NetWareでは、これまでも常にスレッド(一般的にはプロセスと呼ばれています)が使用されてきましたが、NetWare 6までは、マルチスレッドコードによる並列処理の効果が発揮されてはいませんでした。マルチスレッドによって、コードパスをとおして並列実行の複数のパスが実現されます。ソフトウェア開発者の役割は、一定の実行順序に依存することなく同時に実行できるタスクを識別し、複数のスレッドにタスクを割り当てるメカニズムと、スレッドで共有するデータを保護するための適切な同期のメカニズムを提供することです。
ユニプロセッサ環境の場合は、マルチスレッドコードを実行するとスレッドが同時に実行します。これは、1つ以上のスレッドが同じプロセッサ上でアクティブになるということです。スレッドは、同時に実行するかのように見えますが、実際には同時に実行していません。たとえば、あるスレッドがコードを実行している間は、別のスレッドはブロックしています。プロセッサがきわめて高速で、時間の単位がきわめて小さいために、同時に実行しているかのように感じるのです。
これに対して、複数のプロセッサが搭載されたハードウェアシステムの場合は、複数のスレッドが別々のプロセッサ上でまったく同じ時間に実際に実行することが可能です。スレッドが複数のプロセッサ上で同時に実行する場合、これはスレッドが並列に実行していることになります。マルチスレッドコードは、並列処理を利用することで、より効果的にプロセッサを利用できます。
NetWare 6の環境では、マルチプロセッサ(MP)ハードウェアで実現される並列処理と、サーバオペレーティングシステムにおける並列処理のサポートを利用してアプリケーションを作成できます。また、システムは、GroupWise(R)などのサーバアプリケーションによるパフォーマンスの向上やスケーリングの恩恵を受けることができます。
注: NetWareカーネルはマルチスレッド対応なので、1つのバイナリで、ユニプロセッサシステムとマルチプロセッサシステムの両方をそのままサポートできます。
NetWareでは、制約の範囲内でスレッドのプリエンプションが可能です。プリエンプションが可能なNetWareモジュールを新しく作成することができます。
注: 以前のバージョンのNetWareでは、プリエンプティブではなく、ラウンドロビン(ファーストイン、ファーストアウト)式のスケジューリングポリシーが実装されていました。このため、スレッドは、実行キューに入れられた順序で実行がスケジュールされていました。ユニプロセッサシステムでは、NetWareは高速で、きわめて効率的です。
アプリケーションをプリエンティブで処理するためには、プリエンプティブ対応のコードを明示的に記述する必要があります。クリティカルセクションの境界は、クリティカルコードセクションであることを通知するスケジューラのAPI関数を呼び出すことで識別されます。クリティカルセクションは、プログラムデータの整合性を維持し、同時実行に適さないコードが同時に実行するのを防ぐために使用されます。スレッドがクリティカルセクションにある場合は、プリエンプティブにはなりません。
デフォルトでは、アプリケーションスレッドが実行している場合、次の条件が満たされない限り、スレッドはプリエンプティブではありません。
プリエンプティブ対応にすることで、次の状態が実現します。
カーネル自体は、プリエンプティブではありません。
NetWareは別にして、マルチプロセッサコンピュータ上でマルチプロセッシングを実現するために必要なのは、使用しているハードウェアプラットフォームとNetWareに適した、プラットフォームサポートモジュール(PSM)だけです。他のモジュールは必要ありません。
注: インストール時にロードするPSMを使用します。PSMs for NetWare 4.11 SMP.NLMは、NetWare 5以降では動作しません。
PSMは、マルチプロセッサの割り込みを抽象化したものです。プロセッサのデバイスドライバとして、ハードウェア依存やプラットフォーム固有の情報をNetWareに対して隠す役割を果たします。セカンダリプロセッサのオンラインとオフラインを切り替えることもできます。
インストール時、NetWareは、BIOS内のMP環境設定テーブルを読み込んでマルチプロセッサを検出し、使用可能なNetWareプラットフォームサポートモジュール(PSM)の中で、MPハードウェアプラットフォームに一致するものを判別します。
ネットワーク管理者は、PSMをロードするか、プロセッサ0上でのみNetWareを実行するかを選択できます。サーバの起動時にPSMがロードされるように、インストールプログラムによってSTARTUP.NCFファイルが変更されます。
Novell(R)が提供するMPS14.PSMは、Intel*のマルチプロセッサ仕様1.1および1.4に準拠するハードウェアプラットフォームをサポートします。Compaq*も、自社のシステム要件に適したPSMを提供しています。Tricord*のNetWare用PSMについては、Tricordに問い合わせてください。
NetWareのマルチプロセッシングによって、拡張性に加えて、次の利点が提供されます。