(57)【特許請求の範囲】
【請求項１】
アプリケーションを実行する複数のコンピューティング・ノードと、複数の記憶装置と、複数の記憶装置を管理する複数の入出力ノードと、前記複数のコンピューティング・ノードと前記複数の入出力ノード間の通信を可能にする相互接続ファブリックと、前記複数のコンピューティング・ノードから前記複数の入出力ノードまでの経路上にある複数のノードと、を備えた並列処理コンピュータ・システムにおいて、
前記入出力ノードの各々は、
前記相互ファブリックに接続された前記複数のコンピューティング・ノードの一つに接続する第１の入出力ノードと、前記複数の記憶装置の一つに接続する第２の入出力ノードと、を備え、
前記複数の入出力ノードの各々に割り当てられた入出力ノードのグローバルに一意の入出力ノード識別子と、前記複数の記憶装置に物理的に記憶されたデータ・オブジェクトの識別子と、当該データ・オブジェクトのボリューム・セット識別子と、を生成するステップと、
前記相互接続ファブリックに接続された前記複数のコンピューティング・ノード間のデータの流れを制御するステップと、
前記相互接続ファブリックを介して前記データ・オブジェクトのボリューム・セット識別子を前記相互接続ファブリックに接続されている全ての前記コンピューティング・ノードに同報通信するステップと、の各ステップを実行し、
前記コンピューティング・ノードは、データ送信の際に、前記データ・オブジェクトの前記記憶装置における入口点を作成する、ことを特徴とする並列処理コンピュータ・システムにおけるデータ通信方法。
【請求項２】
前記入出力ノード識別子は、前記記憶装置を管理する管理モジュールから読み取られることを特徴とする請求項１に記載の並列処理コンピュータ・システムにおけるデータ通信方法。
【請求項３】
アプリケーションを実行する複数のコンピューティング・ノードと、複数の記憶装置と、複数の記憶装置を管理する複数の入出力ノードと、前記複数のコンピューティング・ノードと前記複数の入出力ノード間の通信を可能にする相互接続ファブリックと、前記複数のコンピューティング・ノードから前記複数の入出力ノードまでの経路上にある複数のノードと、を備えた並列処理コンピュータ・システムにおいて、
前記入出力ノードの各々は、
前記相互ファブリックに接続された前記複数のコンピューティング・ノードの一つに接続する第１の入出力ノードと、前記複数の記憶装置の一つに接続する第２の入出力ノードと、
前記複数の入出力ノードの各々に割り当てられた入出力ノードのグローバルに一意の入出力ノード識別子と、前記複数の記憶装置に物理的に記憶されたデータ・オブジェクトの識別子と当該データ・オブジェクトのボリューム・セット識別子とを生成する手段と、
前記相互接続ファブリックに接続された前記複数のコンピューティング・ノード間のデータの流れを制御する手段と、
前記相互接続ファブリックを介して前記データ・オブジェクトのボリューム・セット識別子を前記相互接続ファブリックに接続されている全ての前記コンピューティング・ノードに同報通信する手段と、の各手段を有し、
前記コンピューティング・ノードは、データ送信の際に、前記データ・オブジェクトの前記記憶装置における入口点を作成する、ことを特徴とする並列処理コンピュータ・システム。
【請求項４】
前記入出力ノード識別子は、前記記憶装置を管理する管理モジュールから読み取られることを特徴とする請求項３に記載の並列処理コンピュータ・システム。
【発明の詳細な説明】
【０００１】
【産業上の利用分野】
本発明は、一般的にはコンピューティング・システムに関し、特にファブリック取付け名の構成方法及び装置に関する。
【０００２】
【従来の技術】
技術的発展はしばしば、見たところ関係のない一連の技術開発の結果からもたらされる。これらの無関係の開発は個々には重要であるかもしれないが、これらが組み合わされると大きな技術的発展の基礎をなすことがある。歴史的に見れば大規模で複雑なコンピュータシステムにおけるコンポーネントの間の技術成長は不均一であったが、これには例えば、（１）ディスク入出力性能に比べてＣＰＵ性能の急速な進歩、（２）内部的なＣＰＵアーキテクチャの発達、（３）相互接続ファブリックが挙げられる。
【０００３】
過去１０年以上に亘って、ディスク入出力性能は全体として、ノードの性能よりも全体的に遙かに遅い速度で成長してきた。ＣＰＵ性能は年間で４０％から１００％の割合で増加してきたのに、ディスクのシーク時間は年率で僅かに７％改善されてきたにすぎない。もし予想されるようにこの傾向が続けば、典型的なサーバ・ノードが駆動できるディスク駆動機構の数は、最も大きな規模のシステムでは数量的価格的両面でディスク駆動機構が支配的なコンポーネントとなる点に達するであろう。この現象は既に、既存の大規模システムの施設で明らかになっている。
【０００４】
不均一な性能の拡大は、ＣＰＵ内部でも起こりつつある。ＣＰＵ性能を改善するためにＣＰＵ業者は、クロック速度の増加とアーキテクチャの変更との組合せを採用しつつある。これらのアーキテクチャ変更の多くは、並列処理グループから影響を受けた技術であることが分かっている。これらの変更は、不均衡な性能を作りだし、予想よりも少ない性能改善をもたらしている。簡単な例として、ＣＰＵが割込みを指示できる速度は、基本命令と同じ速度で拡大していない。こうして割込み性能に依存するシステム機能（入出力といった）は、コンピューティング・パワーと一緒には拡大していない。
【０００５】
相互接続ファブリックもまた不均一な技術成長特性を示している。数年の間、これらは１０〜２０ＭＢ／ｓｅｃの性能レベルの辺りに停滞している。過去の年には１００ＭＢ／ｓｅｃ（以上の）レベルにまで帯域幅の大きな飛躍も起こっている。この大きな性能改善は、大量に並列処理を行うシステムの経済的な配備を可能にしている。
【０００６】
この不均一な性能は、アプリケーションのアーキテクチャとシステム構成の選択とに対してマイナスに働く。例えばアプリケーション性能に関して、改善されたＣＰＵ性能といったシステムのある部分における性能改善を利用して作業負荷を増やそうとする試みはしばしば、ディスク・サブシステムに同等の性能改善がないことによって妨げられる。ＣＰＵが毎秒のトランザクション数の生成を２倍にできても、ディスク・サブシステムはその増加分の何分の一かしか処理できない。ＣＰＵは、絶えず記憶システムを待っていることになる。不均一なハードウエア性能の成長の全体的な影響は、アプリケーション性能が所定の作業負荷の特性に対する依存度の増大を経験しつつあるということになる。
【０００７】
プラットフォーム・ハードウエア技術における不均一な成長もまた、マルチノード・システムを構成するために利用可能なオプションの数が減少するなどといった、他の重大な問題を引き起こす。良い例は、ＴＥＲＡＤＡＴＡ・４ノード・クリークのソフトウエア・アーキテクチャが記憶装置の相互接続技術の変化によって影響されるということである。ＴＥＲＡＤＡＴＡクリーク・モデルは、単一のクリーク内のノード間で一様な記憶装置間接続を想定している。各ディスク駆動機構は、すべてのノードからアクセス可能である。ここであるノードが故障すると、そのノード専用であった記憶装置は、残りのノード間で分割できる。記憶技術とノード技術とにおける不均一な成長は、共用記憶装置環境において１ノード当たりに接続できるディスクの数を制約することになる。この制約は、入出力チャネルに接続できる駆動機構の数と、４ノード共用入出力トポロジーで接続できるバスの物理数とによって作られる。ノード性能の改善が続けられるにつれて、われわれは性能の利点を実現するために１ノード当たりに接続されるディスク・スピンドルの数を増加させなければならない。
【０００８】
【発明が解決しようとする課題】
クラスタ型大規模並列処理（ＭＭＰ）の設計は、前述の問題を解決しようとするマルチノード・システムの設計の例である。クラスタ型は、拡張性に制約を受けるが、ＭＭＰシステムは、追加ソフトウエアに十分に単純なアプリケーション・モデルを提示することを要求する（商業的なＭＭＰシステムで、このソフトウエアは通常、ＤＢＭＳ（データベース管理システム）である）。ＭＭＰはまた、非常に高い可用性を備えたある形式の内部クラスタリング（クリーク）を必要とする。両者の解は未だ、潜在的に大きな数のディスク駆動機構の管理に難題を作りだしており、また電気機械的装置であるこれらのディスク駆動機構はかなり予測可能な故障率を持っている。ノード相互接続の問題は、ＭＭＰシステムではノード数が通常はるかに大きいので更に悪化する。これら両手法も、非常に大きなデータベースを格納刷るために必要とされる駆動機構の多数さによって再び刺激されて、ディスク接続に難問を作りだす。
【０００９】
上述した大きなデータの処理システムは失敗の許容量とデータの安全性を増大させる。しかし、ファブリック取付け名のための独立しており、又、ビット名の大きさに限定されたＡＰＩデータベースと和合する場所を要求する。本発明の目的は上述の欠点を解決することである。
【００１０】
本発明は、請求項１に詳述したような方法、請求項３に詳述される装置、請求項５及び７に詳述されるような並列処理コンピュータ・システムを提供する。
【００１１】
【課題を解決するための手段】
本発明は、アプリケーションを実行する複数のコンピューティング・ノードと、複数の記憶装置と、複数の記憶装置を管理する複数の入出力ノードと、前記複数のコンピューティング・ノードと前記複数の入出力ノード間の通信を可能にする相互接続ファブリックと、前記複数のコンピューティング・ノードから前記複数の入出力ノードまでの経路上にある複数のノードと、を備えた並列処理コンピュータ・システムにおいて、前記入出力ノードの各々は、前記相互ファブリックに接続された前記複数のコンピューティング・ノードの一つに接続する第１の入出力ノードと、前記複数の記憶装置の一つに接続する第２の入出力ノードと、を備え、前記複数の入出力ノードの各々に割り当てられた入出力ノードのグローバルに一意の入出力ノード識別子と、前記複数の記憶装置に物理的に記憶されたデータ・オブジェクトの識別子と、当該データ・オブジェクトのボリューム・セット識別子と、を生成するステップと、前記相互接続ファブリックに接続された前記複数のコンピューティング・ノード間のデータの流れを制御するステップと、前記相互接続ファブリックを介して前記データ・オブジェクトのボリューム・セット識別子を前記相互接続ファブリックに接続されている全ての前記コンピューティング・ノードに同報通信するステップと、の各ステップを実行し、前記コンピューティング・ノードは、データ送信の際に、前記データ・オブジェクトの前記記憶装置における入口点を作成する、ことを特徴とする。
【００１２】
【発明の実施の形態】
概要
図１は、本発明の同位アーキテクチャの概要である。このアーキテクチャは、一つ以上のコンピューティング資源１０２と、一つ以上の相互接続ファブリック１０６と通信路１０８とを介してコンピューティング資源１０２に通信可能に連結された一つ以上の記憶資源１０４とを含む。ファブリック１０６は、すべてのノードと記憶装置との間の通信手段を提供し、こうしてコンピューティング資源１０２と記憶資源１０４との間の一様な同位アクセスを実現する。
【００１３】
図１に示すアーキテクチャでは、記憶装置はもはや、現在のノード中心のアーキテクチャのように単一のセットのノードに縛られることはなく、またどのノードもすべての記憶装置と通信できる。これは、物理的システム・トポロジーが記憶装置とノード間の通信を制限していて、異なる仕事負荷に対応するためにはしばしば異なるトポロジーが必要になった今日のマルチノード・システムとは対照的である。図１に示すアーキテクチャは、システム・トポロジーの広いスペクトルをサポートする単一の物理アーキテクチャを提供することによって、アプリケーション・ソフトウエアの通信パターンがいかなる時点でもシステムのトポロジーを決定できるようにしており、技術進歩の不均一さに対応している。ファブリック１０６によって与えられる分離は、主要なシステム・コンポーネントの各々について極めて僅かずつの拡張を可能にする。
【００１４】
図２は、本発明の同位アーキテクチャの更に詳細な説明を示す。コンピューティング資源１０２は、一つ以上のコンピューティング・ノード２００によって定義されており、一つ以上のプロセッサを有する各々のコンピューティング・ノードはオペレーティング・システム２０２の制御下で一つ以上のアプリケーション２０４を実現している。コンピューティング・ノード２００には、テープ駆動機構、プリンタ、その他のネットワークといった周辺装置２０８が機能的に連結されている。またコンピューティング・ノード２００には、オペレーティング・システム２０２を含む命令とか、アプリケーション２０４、その他の情報といったコンピューティング・ノード固有の情報を記憶するハードディスクといったローカルの記憶装置２１０が機能的に連結されている。アプリケーションの命令は、分散処理方式で、二つ以上のコンピューティング・ノード２００に亘って格納、および／または実行できるようになっている。一実施例では、プロセッサ２１６は、ＩＮＴＥＬ  Ｐ６といった既製品で商業的に入手可能な多目的プロセッサと、関連のメモリと入出力エレメントとを含む。
【００１５】
記憶資源１０４は、クリーク２２６によって画定されており、これらクリークの各々は、第１の入出力ノードあるいはＩＯＮ２１２と第２の入出力ノードあるいはＩＯＮ２１４とを含み、その各々はシステム相互接続部２２８によって相互接続ファブリック１０６の各々と機能的に連結されている。第１のＩＯＮ２１２と第２のＩＯＮ２１４は、ＪＢＯＤ筐体２２２に関連する一つ以上の記憶ディスク２２４（「ｊｕｓｔ  ａ  ｂｕｎｃｈ  ｄｉｓｋｓほんの一束のディスク）」あるいはＪＢＯＤとして知られている）に機能的に連結されている。
【００１６】
図２は、典型的な２対１のＩＯＮ２１２対コンピューティング・ノード比を持つ中規模システムを示す。本発明のクリーク２２６は、三つ以上のＩＯＮ２１４を用いて、あるいは記憶ノードの可用性に幾分かの損失はあるが単一のＩＯＮ２１２を用いて実現することもできる。クリーク２２６の個数は、複数のＩＯＮ２１２の間で共用ハードウエアが存在しないので、純粋にソフトウエアの問題である。対になったＩＯＮ２１２は、「ダイポール」と呼ばれることもある。
【００１７】
本発明はまた、コンピューティング・ノード２００とＩＯＮ２１２と相互接続ファブリック１０６とにインタフェース接続する管理コンポーネントまたはシステム管理ソフトウエア２３０も含む。
【００１８】
ＩＯＮ２１２とＪＢＯＤ２１２との間の接続は、ここでは単純化された形で示してある。実際の接続は、図示の構成における記憶ディスク２２４の各ランク（行、ここでは４行）に対してファイバ・チャネル・ケーブルを使っている。実際には、各ＩＯＮ２１２は、図示の実施例に示す２０個よりもむしろ４０個と８０個の間の記憶ディスク２２４を管理することになるであろう。
【００１９】
ＩＯＮ（記憶ノード）
内部アーキテクチャ
ハードウエア・アーキテクチャ
図３は、ＩＯＮ２１２の構成と、ＪＢＯＤ２２２に対するそのインタフェースとに関して更に詳細を示す図である。各ＩＯＮ２１２は、ＪＢＯＤ相互接続部２１６を介してＪＢＯＤ２２２アレー内の各記憶ディスク２２４に通信可能に連結するための入出力接続モジュール３０２と、ＩＯＮ２１２機能を実行してここに述べるＩＯＮ物理ディスク・ドライバ５００を実現するＣＰＵおよびメモリ３０４と、ＩＯＮ２１２操作をサポートするために電力を供給する電力モジュール３０６とを含む。
【００２０】
ＪＢＯＤ図４は、ＪＢＯＤ筐体２２２に関して更に詳細を示す図である。監視あるいは制御が可能であるＪＢＯＤ筐体２２２内のすべてのコンポーネントは、エレメント４０２〜４２４と呼ばれる。所定のＪＢＯＤ筐体のためのすべてのエレメント４０２〜４２４は、構成ページ符号を持った受信診断結果コマンドを介して返される。ＩＯＮ２１２は、これらのエレメントを番号付けしているこのエレメント順序付けリストを使用する。記載の第１のエレメント４０２はエレメント０であり、第２のエレメント４０４はエレメント１であり、以下同様である。これらのエレメント番号は、コンポーネントをアドレス指定するためにここに記載の管理サービス層７０６によって使われるＬＵＮ−Ｃを作成するときに使われる。
【００２１】
【表１】
0004618654.tif 000002
筐体の内部では、上の表１に示すようにエレメント位置は、ラック番号とシャシ番号とエレメント番号とによって指定される。ラック番号は、あるダイポールに属するラックに割り当てられたそのダイポールに対する内部番号である。シャシ位置は、キャビネット管理装置によって通知される高さを指す。エレメント番号は、ＳＥＳ構成ページによって返されるエレメント・リストへの指標である。これらのフィールドがＬＵＮ−Ｃフォーマットを構成している。
【００２２】
入出力インタフェース・ドライバ・アーキテクチャ
図５は、ＩＯＮ２１２のための「ＳＣＳＩドライバ」として機能するＩＯＮ物理ディスク・ドライバ５００を含めて、ＩＯＮ２１２入出力アーキテクチャを示す図である。ＩＯＮ物理ディスク・ドライバ５００は、ＲＡＩＤ（ｒｅｄｕｍｄａｎｔ  ａｒｒａｙ  ｏｆ  ｉｎｅｘｐｅｎｓｉｖｅ  ｄｉｓｋｓ：低価格ディスクの冗長アレー）ソフトウエア・ドライバまたはシステム管理ソフトウエア２３０内の管理ユーティリティからの入出力要求を取り入れる責任を持っており、そしてＪＢＯＤ相互接続部２１６の装置側の装置上でその要求を実行する。
【００２３】
本発明の物理ディスク・ドライバ５００は、三つの主要コンポーネント：ハイレベル・ドライバ（ＨＬＤ）５０２とローレベル・ドライバ５０６とを含む。ＨＬＤ５０２は、共通部５０３と装置固有のハイレベル部５０４とローレベル・ドライバ５０６とを含む。共通部５０２と装置固有ハイレベル・ドライバ５０４は、アダプタ独立であって、新しいアダプタ型のために修正を必要としない。ファイバ・チャネル・インタフェース（ＦＣＩ）ローレベル・ドライバ５０６は、ファイバ・チャネル・アダプタをサポートしており、したがってアダプタ固有よりもむしろプロトコル固有である。
【００２４】
ＦＣＩローレベル・ドライバ５０６は、ＳＣＳＩ要求をＦＣＰフレームに変換し、またログイン（Ｌｏｇｉｎ）と処理ログイン（Ｐｒｏｃｅｓｓ  Ｌｏｇｉｎ）のようなファイバ・チャネル共通サービスを取り扱う。ＦＣＩローレベル・ドライバ５０６には、ファイバ・チャネル・プロトコル処理をアダプタ固有ルーチンから分割するハードウエア・インタフェース・モジュール（ＨＩＭ）インタフェース５０８が機能的に連結されている。上述のコンポーネントの更に詳細な説明は、以下に示す。
【００２５】
ハイレベル・ドライバ
ハイレベル・ドライバ（ＨＬＤ）５０２は、どのような型の装置がアクセスされている場合でも、ＩＯＮ２１２に対するすべての要求についての入口点である。ある装置が開かれると、ＨＬＤ５０２はコマンド・ページをその装置に結び付ける。これらの業者固有のコマンド・ページは、固有のＳＣＳＩ機能のためにＳＣＳＩコマンド記述子ブロックがどのように構築されるべきかを指示する。コマンド・ページは、あるＳＣＳＩ機能をＳＣＳＩ仕様の指定とは異なるように取り扱う装置をドライバが容易にサポートできるようにする。
【００２６】
共通（装置固有でない）部
ＨＬＤ５０２の共通部は、下記の入口点を含む。
・ｃｓ−ｉｎｉｔ  ：ドライバ構造を初期化して資源を割り当てる。
・ｃｓ−ｏｐｅｎ  ：装置を使用可能にする。
・ｃｓ−ｃｌｏｓｅ：入出力を完了して装置をサービスから削除する。
・ｃｓ−ｓｔｒａｔｅｇｙ：装置の読み／書き入力を阻止する（Ｂｕｆ−ｔ  ｉｎｔｅｒｆａｃｅ）。
・ｃｓ−ｉｎｔｒ   ：ハードウエア割込みをサービスする。
【００２７】
これらのルーチンは、すべての装置の型について同じ機能を実行する。これらのルーチンの大部分は、装置の型（ディスク、テープ、ｗｏｒｍ（追記型）、ＣＤ  ＲＯＭ等）によって指標付けされたスイッチ（切替え）表によっていかなる装置固有の要件でも取り扱う装置固有ルーチンを呼び出す。
【００２８】
この ｃｓ−ｏｐｅｎ機能は、その装置が存在しており、そこで実行されるべき入出力操作の準備ができていることを保証する。現在のシステム・アーキテクチャとは異なり、共通部５０３は、オペレーティング・システム（ＯＳ）の初期化期間中に既知の装置の表を作成することはない。その代わりにドライバ共通部５０３は自己構成を行う。すなわちドライバ共通部５０３は、その装置の初期オープン時に装置の状態を決定する。これは、ドライバ共通部５０３がＯＳ２０２の初期化段階後にオンラインになった可能性のある装置を「見る」ことができるようにする。
【００２９】
初期オープン期間中、ＳＣＳＩ装置は、目標装置にＳＣＳＩ問合せコマンドを発行することによってコマンド・ページに結合される。もし装置が肯定的に応答すれば、その応答データ（業者ＩＤ、製品ＩＤ、ファームウエア改訂レベルといった情報を含む）がＳＣＳＩ構成モジュール５１６内の既知装置表と比較される。もし一致があれば、その装置は、その表の項目に指定されたコマンド・ページに明示的に結合される。もし一致がなければ、その装置は、一般ＣＣＳ（Ｃｏｍｍｏｎ  Ｃｏｍａｎｄ  Ｓｅｔ：共通コマンド・セット）またはその応答データ・フォーマットに基づくＳＣＳＩ・ＩＩコマンド・ページに暗示的に結合される。
【００３０】
ドライバ共通部５０３は、ローレベル・ドライバ５０６によって使われるルーチンと、資源を割り当て、分散・収集操作のためのＤＭＡリストを作成し、ＳＣＳＩ操作を完了させるコマンド・ページ機能とを含む。
【００３１】
すべてのＦＣＩローレベル・ドライバ５０６ルーチンは、ドライバ共通部５０３から呼び出される。ドライバ共通部５０３は、ハードウエアを設定して動作を開始させるためにハードウエア・インタフェース・モジュール（ＨＩＭ）５０８内の適当なローレベル・ドライバ（ＬＬＤ）ルーチンを呼び出すことによってＳＣＳＩ動作を実際に起動する唯一の層である。ＬＬＤルーチンはまた、ＳＣＳＩ構成モジュール５１６から構成時に割り当てられた、ドライバＩＤによって指標付けされたスイッチ表を介してアクセスされる。
【００３２】
装置固有部
共通部５０２と装置固有ルーチン５０４との間のインタフェースは、共通部へのインタフェースと似ており、また ｃｓｘｘ−ｉｎｉｔ、ｃｓｘｘ−ｏｐｅｎ、ｃｓｘｘ−ｃｌｏｓｅ、ｃｓｘｘ−ｓｔｒａｔｅｇｙというコマンドを含んでいる。“ｘｘ” という記号は、記憶装置の型（例えばディスクについては“ｄｋ”あるいはテープについては“ｔｐ”）を示す。これらのルーチンは、いかなる装置固有要件でも取り扱う。例えばもし装置がディスクであったとすれば、ｃｓｄｋ−ｏｐｅｎはそのディスクの固有領域から区分表情報を読み取らなければならず、またｃｓｄｋ−ｓｔｒａｔｅｇｙはその区分表情報を使って、ブロックが禁止区域にあるかどうかを判定しなければならない。（区分表は各固有の物理ディスク毎に論理ディスクから物理ディスクへのディスク・ブロックのマッピングを定義している。）
【００３３】
ハイレベル・ドライバの誤り／失敗の処理
誤り処理
再試行
ＨＬＤ５０２の最も一般的な回復方法は、失敗した入出力操作を再試行することによっている。所定のコマンド型に関する再試行の回数は、コマンド・ページによって指定される。例えば読取りあるいは書込みコマンドは非常に重要であると見なされるので、それらに関連のコマンド・ページは、再試行回数を３と設定することもできる。問合せコマンドは重要とは見なされないが、一日の初めの操作の時に、一定の再試行回数ではシステムの性能低下を招くので、その試行回数はゼロにされることもある。
【００３４】
初めに要求が発行されると、その再試行回数はゼロに設定される。要求が失敗して回復手順が再試行されることになる度ごとに、再試行回数は増やされる。もし再試行回数がコマンド・ページで指定された最大試行回数より大きくなれば、その入出力操作は失敗となり、要求者にはメッセージが返送される。そうでなければ、それは再発行される。このルールの唯一の例外は、ユニット・アテンションに関するものであって、これは一般には誤りというよりはイベント通知である。もしあるコマンドに関してユニット・アテンションが受け取られ、その最大再試行回数がゼロか１に設定されていれば、ハイレベル・ドライバ５０２は、この特定の入出力のための最大再試行を２に設定する。これは、ユニット・アテンション状態のために早まって失敗と送り返される入出力を防止することになる。
【００３５】
遅延された再試行は、その再試行が所定の時間の間は、待ち行列に再配置されないということを除いて、上述の再試行手順と同じに扱われる。
【００３６】
失敗したＳｃｓｉ−ｏｐｓ
ＦＣＩローレベル・ドライバ５０６に発行されるＳｃｓｉ−ｏｐは、幾つかの状況によって失敗することがある。表２は、ＦＣＩローレベル・ドライバ５０６がＨＬＤ４０２に返すことのできる、起こり得る失敗の型を下に示す。
【００３７】
【表２】
ローレベル・ドライバの誤り条件
0004618654.tif 000003
資源不足
資源不足誤りは、要求時に所望の資源が利用可能でないときに発生する。一般にこれらの資源は、システム・メモリとドライバ構成メモリである。
【００３８】
システム・メモリ不足処理は、セマフォ・ブロッキング（信号阻止）によって遂行される。メモリ資源をブロックするスレッド（プロセスの集まり）は、新しい入出力が発行されるのを防止するであろう。このスレッドは、入出力完了がメモリを解放するまでブロックされたままになっているであろう。
【００３９】
ドライバ構成資源は、Ｓｃｓｉ−ｏｐおよび入出力ベクトル（ＩＯＶ）リスト・プールに関連している。ＩＯＶリストは、ディスクとの間でやり取りされるメモリの開始値と長さ値のリストである。これらのメモリ・プールは、プールのサイズを指定するために調整可能なパラメータを使うことによって一日の初めに初期化される。もしＳｃｓｉ−ｏｐまたはＩＯＶプールが空であれば、新しい入出力が入ってこれらのプールを大きくする結果になるであろう。いずれかのプールを大きくするために一時に１ページ（４０９６バイト）のメモリが割り当てられる。その新しいページからすべてのＳｃｓｉ−ｏｐｓまたはＩＯＶが解放されるまで、そのページは解放されない。もしＩＯＮ２１２がＳｃｓｉ−ｏｐｓに関するページまたはページを絶えず割り当てたり解放したりしているならば、関連するパラメータを調整することが望ましいかもしれない。
【００４０】
すべての資源不足処理はイベントを通じてログ（記録）される。
【００４１】
一日の初めの処理
一日の初めにＨＬＤ５０２は、その必要な構成とプールとを初期化し、そしてアダプタ固有のドライバとハードウエアとを初期化するための呼出しを行う。一日の初め処理は、（１）Ｓｃｓｉ−Ｏｐプールを割り当てることと、（２）ＩＯＶプールを割り当てることと、（３）ファイバ・チャネル構成とハードウエアとを初期化するためにＦＣＩｈｗ−ｉｎｉｔ（）への呼出しを行うことと、（４）割込みサービス・ルーチンｃｓ−ｉｎｉｔｒ（）を適当な割込みベクトルに結合することとを行うｃｓ−ｉｎｉｔ（）への呼出しによって開始される。
【００４２】
失敗の処理
ＩＯＮ２１２ダイポールの二つの半分は、共通セットのディスク装置に付加される。ダイポール２２６内のＩＯＮ２１２、２１４は両者とも何時でも所定のときにすべての装置にアクセスできなくてはならない。ＨＬＤ５０２から見て、失敗のために特別の処理はない。
【００４３】
コマンド・ページ
本発明のＩＯＮ２１２は、ＳＣＳＩコマンドの実際のビルディングから共通部と装置固有部とを抽出するコマンド・ページ方式を使用する。コマンド・ページは、各関数がＳＣＳＩコマンド（例えばＳＣＳＩ−２−Ｔｅｓｔ−Ｕｎｉｔ−Ｒｅａｄｙ）を表す関数へのポインタのリストである。上述のように、ある特定のコマンド・ページは、ある装置の初期オープンまたはアクセス時にその装置に結合される。すべての業者独自のそして柔軟性のないＳＣＳＩ装置の癖は、その装置固有のコマンド・ページを介して参照される関数によって管理される。一般的なシステムは、柔軟性のないＳＣＳＩ装置あるいは業者独自のＳＣＳＩコマンドの統合を可能にするために、コマンド・コントロール・セット（ＣＣＳ）と、ＳＣＳＩ・ＩおよびＳＣＳＩ・ＩＩページと、業者独自ページとを一緒に付けて出荷される。
【００４４】
コマンド・ページ関数は、装置共通部５０３と装置固有部５０４とＦＣＩローレベル・ドライバ５０６（要求センス）とから仮想装置（Ｖｉｒｔｕａｌ  ＤＥＶｉｃｅ（ＶＤＥＶ））インタフェースと呼ばれるインタフェースを介して呼び出される。これらのレベルでは、ソフトウエアは、装置がどのＳＣＳＩ方言を使うかを気にせずに、単に意図した関数を装置が実行することを気にかける。
【００４５】
各コマンド・ページ関数は、ＳＣＳＩコマンドを構築して、必要ならば、直接メモリ・アクセス（ＤＭＡ）データ転送のためにメモリを割り当てる。それからこの関数は、ドライバ共通部５０３に制御を返す。その後、ドライバ共通部５０３は、待ち行列上にＳＣＳＩ操作を配置し（必要であればここで分類が行われる）、ＦＣＩローレベル・ドライバ５０６の起動ルーチンを呼び出すことによってそのＳＣＳＩコマンドを実行する。そのコマンドが実行されたのち、もしそのコマンド・ページ関数のなかに「割込み時呼出し：Ｃａｌｌ  Ｏｎ  Ｉｎｔｅｒｒｕｐｔ（ＣＯＩ）」ルーチンが存在すれば、完了後のコマンドのデータ／情報をそのドライバのドライバ共通部５０３が吟味する前に、ＣＯＩが呼び出されるであろう。
【００４６】
返されたデータ／情報をマッサージすることによってＣＯＩは、非標準のＳＣＳＩデータ／情報を標準のＳＣＳＩデータ／情報に変換することができる。例えばもし装置の問合せデータがバイト８の代わりにバイト１２で始まる業者ＩＤを含んでいるならば、問合せに関するコマンド・ページ関数は、業者ＩＤを、返却された問合せデータのバイト８にシフトするＣＯＩを含むことになるであろう。ドライバ共通部５０３は常に、バイト８で始まる業者ＩＤ情報を抽出するであろうから非標準装置について知る必要がなくなる。
【００４７】
ＪＢＯＤおよびＳＣＳＩ構成モジュール
ＲＡＩＤ制御部の重要な機能は、損失しないようにデータを確保することである。この機能を実行するためにＲＡＩＤソフトウエアは、ディスク装置が何処に常駐していてその配線がそれをどのように接続しているかを物理的に知らなくてはならない。それ故、ＲＡＩＤ制御部技術実現の重要な要件は、記憶装置の構成を制御する能力である。ＪＢＯＤおよびＳＣＳＩ構成モジュール５１６のＪＢＯＤ部には、ＩＯＮ２１２のための静的なＪＢＯＤ構成を定義することが課せられている。ＪＢＯＤおよびＳＣＳＩ構成モジュール５１６によって記述される構成情報は、表３に示す。
【００４８】
【表３】
0004618654.tif 000004
アダプタとＪＢＯＤ筐体２２２と記憶ディスク２２４との物理的位置情報に加えて、ＦＣＩローレベル・ドライバ５０６とドライバ装置固有部５０４入口点ならびにコマンド・ページ定義のような他の構成情報も記述しなくてはならない。この情報を与えるためにｓｐａｃｅ．ｃファイルが使われ、またＩＯＮ２１２がＩＯＮ物理ディスク・ドライバ５００のコンパイル時に構成情報を構築する。サポートされているＩＯＮ２１２構成が変更される場合には、新しいバージョンのＩＯＮ物理ディスク・ドライバ５００がコンパイルされなくてはならない。
【００４９】
ファイバ・チャネル・インタフェース（ＦＣＩ）ローレベル・ドライバ
ＦＣＩローレベル・ドライバ５０６は、ハイレベル・ドライバ５０２用のＳＣＳＩインタフェースを管理する。ドライバ共通部５０３とＦＣＩローレベル・ドライバ５０６との間のインタフェースは、下記のルーチンを含んでおり、ここで“ｘｘ” の表示はＦＣＩローレベル・ドライバ５０６が制御するハードウエアに関する一意の識別子である（例えばＦＣＩｈｗ−ｉｎｉｔ）。
・ｘｘｈｗ−ｉｎｉｔ    ハードウエアを初期化する。
・ｘｘｈｗ−ｏｐｅｎ    ホスト・アダプタの現在状態を決定する。
・ｘｘｈｗ−ｃｏｎｆｉｇ    ホスト・アダプタの構成情報（ＳＣＳＩ  ＩＤ等）を設定する。
・ｘｘｈｗ−ｓｔａｒｔ    可能であれば、ＳＣＳＩ操作を起動する。
・ｘｘｈｗ−ｉｎｔｒ    すべてのＳＣＳＩ割込みを処理する。
【００５０】
ローレベル・ドライバは、装置の仕様について知ることも気にかけることもない純粋なＳＣＳＩドライバであるが、その代わりに単に上位レベルからのＳＣＳＩコマンドの導管である。この層には、割込みサービス・ルーチンとハードウエア初期化ルーチンとマッピングおよびアドレス変換ルーチンと誤り回復ルーチンとが常駐している。更に同じシステム内に複数の型のローレベル・ドライバが共存できる。ハードウエア制御層とドライバの残りの部分との間のこの分割は、同じハイレベル・ドライバが異なるマシン上で走行することを可能にしている。
【００５１】
ＦＣＩモジュールの基本機能は、（１）ＳＣＳＩハイレベル・ドライバ（ＳＨＬＤ）にインタフェース接続してＳＣＳＩ  ＯｐをＦＣＩ作業オブジェクト構成（入出力ブロック（ＩＯＢ））に変換することと、（２）異なるＨＩＭ５０８を介して新しいファイバ・チャネル・アダプタのサポートを容易にするために共通インタフェースを提供することと、（３）いかなるＦＣ−４プロトコル層（図示の実施例のファイバ・チャネル・プロトコル（ＦＣＰ））によって使うことのできるＦＣ−３共通サービスを提供することと、（４）ＨＩＭ５０８またはハードウエアが応答しない場合にＨＩＭに送られた非同期コマンド（例えばＦＣＰコマンド、ＦＣ−３コマンド、ＬＩＰコマンド）を保護するタイマー・サービスを提供することと、（５）（ａ）入出力要求ブロック（ＩＯＢ）と（ｂ）ベクトル表と（ｃ）ＨＩＭ５０８資源（例えばホスト・アダプタ・メモリ、ＤＭＡチャネル、入出力ポート、スクラッチ・メモリ）とを含むファイバ・チャネル・ドライバ全体（ＦＣＩとＨＩＭ）のための資源を管理することと、（６）ファイバ・チャネル調停ループ使用（対ファイバ・チャネル・ファブリック）を最適化することとである。
【００５２】
ＦＣＩローレベル・ドライバ５０６用の重要なデータ構造のリストを下記の表４に示す。
【００５３】
【表４】
ＦＣ基本データ構造
0004618654.tif 000005
【００５４】
誤り処理
ＦＣＩローレベル・ドライバ５０６が処理する誤りは、ファイバ・チャネルおよび／またはＦＣＩ自身に固有の誤りである傾向がある。
【００５５】
多段階誤り処理
ＦＣＩローレベル・ドライバ５０６は、ある幾つかの誤りを多段階誤り処理によって処理する。これは、誤り処理手法が誤りの型にとって最適化されることを可能にする。例えば、もしより危険の少ない手順が使われて、効果がない場合には、更に激しい誤り処理対策がとられることがある。
【００５６】
失敗したＩＯＢ
すべての入出力要求は、入出力要求ブロックを介してＨＩＭ５０８に送られる。下記は、ＨＩＭ５０８が送り返すことのできる、起こり得る誤りである。
【００５７】
【表５】
ＨＩＭ誤り条件
0004618654.tif 000006
【００５８】
資源不足
ＦＣＩローレベル・ドライバ５０６は、ＩＯＢ用の資源プールとベクトル表とを管理する。これらのプールのサイズはＩＯＮ２１２構成向けに調整されるであろうから、これらの資源が枯渇することはなく、単純な回復手順が実現される。
【００５９】
もしＩＯＢまたはベクトル表を求める要求が行われてその要求を満足させるために十分な資源がない場合には、その入出力は待ち行列に戻されて入出力を再起動させるためのタイマーがセットされる。資源不足の発生はログに記録される。
【００６０】
一日の初め処理
一日の初めにハイレベル・ドライバ５０２は、サポートされている各ローレベル・ドライバ（ＦＣＩローレベル・ドライバ５０６を含む）に呼出しを行う。ＦＣＩローレベル・ドライバ５０６の一日の初め処理は、下記の操作を実行するＦＣＩｈｗ−ｉｎｉｔ（）ルーチンを呼び出すことから始まる。
【００６１】
先ず、特定のＰＣＩバスと装置のためにＨＩＭ−ＦｉｎｄＣｏｎｔｒｏｌｌｅｒ（）関数が呼び出される。これは、あるバージョンのＦｉｎｄＣｏｎｔｒｏｌｌｅｒ（）を呼び出す。ＪＢＯＤおよびＳＣＳＩ構成モジュール５１６は、探索すべきＰＣＩバスと装置とを指定する。次ぎに、もしアダプタ（ＡＤＡＰＴＥＣから使用可能なアダプタのような）が見つかれば、そのアダプタにＨＣＢが割り当てられて初期化される。それからスクラッチ・メモリ、メモリ・マップされた入出力、ＤＭＡチャネルといったそのアダプタ固有の資源を取得するために、ＨＩＭ−ＧｅｔＣｏｎｆｉｇｕｒａｔｉｏｎ（）が呼び出される。次ぎに、資源が割り当てられて初期化され、ＡＤＡＰＴＥＣ  ＨＩＭとハードウエアとを初期化するために ＨＩＭ−Ｉｎｉｔｉａｌｉｚｅ（）が呼び出される。最後にＩＯＢとベクトル表とが割り当てられて初期化される。
【００６２】
失敗処理
ＩＯＮ２１２ダイポールの二つの半分は、共通セットのディスク装置に取り付けられる。両方のＩＯＮ２１２は、何時でも所定のときにすべての装置にアクセスできなくてはならない。ＦＣＩローレベル・ドライバ５０６から見て、失敗に関する特別の処理はない。
【００６３】
ハードウエア・インタフェース・モジュール（ＨＩＭ）
ハードウエア・インタフェース・モジュール（ＨＩＭ）５０８は、ＡＤＡＰＴＥＣのＳｌｉｍＨＩＭ５０９にインタフェース接続するように設計されている。ＨＩＭモジュール５０８は、ＦＣＩローレベル・ドライバ５０６からの要求をＳｌｉｍＨＩＭ５０９が理解できてハードウエアに発行できる要求に変換するという主要な責任を持っている。これは、入出力ブロック（ＩＯＢ）要求を取り入れることと、そのＩＯＢ要求をＳｌｉｍＨＩＭ５０９によって理解される、それに対応する転送制御ブロック（ＴＣＢ）要求に変換することとを含んでいる。
【００６４】
ＨＩＭ５０８の基本機能は、（１）アダプタに対して、Ｆｉｎｄ（見つける）、Ｃｏｎｆｉｇｕｒｅ（構成する）、Ｉｎｉｔｉａｌｉｚｅ（初期化する）、ＳｅｎｄＩ／Ｏ（入出力を送る）を行うハードウエア固有の関数へのローレベル・アプリケーション・プログラム・インタフェース（ＡＰＩ）を定義することと、（２）入出力ブロック（ＩＯＢ）をＳｌｉｍＨＩＭ／ハードウエアが理解できるＴＣＢ要求（例えばＦＣプリミティブＴＣＢ、ＦＣ拡張リンク・サービス（ＥＬＳ）ＴＣＢ、ＳＣＳＩ−ＦＣＰ操作ＴＣＢ）に変換するためにＦＣＩローレベル・ドライバ５０６にインタフェース接続することと、（３）ＳｌｉｍＨＩＭに発行されたコマンドの引渡しと完了とを追跡することと、（４）ＳｌｉｍＨＩＭからの割込みとイベント情報とを解釈して、ＦＣＩローレベル・ドライバ５０６と共同で適当な割込み処理および／または誤り回復を起動することとである。ＴＣＢのデータ構造は下記の表６に示す。
【００６５】
【表６】
基本的なＨＩＭ構造
0004618654.tif 000007
【００６６】
一日の初め処理
ＨＩＭ５０８は、一日の初めに使われる３個の入口点を定義する。第１の入口点は、ＨＩＭ−ＦｉｎｄＡｄａｐｔｅｒであって、これはＦＣＩｈｗ−ｉｎｉｔ（）によって呼び出され、ＰＣＩ  ＢＩＯＳルーチンを使って所定のＰＣＩバスおよび装置上にアダプタが常駐しているかどうかを決定する。そのアダプタについてのＰＣＩ業者・製品ＩＤは、そのアダプタが存在するかどうかを決定するために使われる。
【００６７】
第２の入口点は、ＨＩＭ−ＧｅｔＣｏｎｆｉｇｕｒａｔｉｏｎであって、これはアダプタが存在する場合にＦＣＩｈｗ−ｉｎｉｔ（）によって呼び出され、与えられたＨＣＢの中に資源要件を入れる。ＡＤＡＰＴＥＣアダプタについてこれらの資源は、ＩＲＱとスクラッチとＴＣＢメモリとを含む。この情報は、ＳｌｉｍＨＩＭ５０９に呼出しを行うことによって求められる。
【００６８】
第３の入口点は、ＨＩＭ−Ｉｎｉｔｉａｌｉｚｅであって、これは資源が割り当てられて初期化された後にＦＣＩｈｗ−ｉｎｉｔ（）によって呼び出され、ＴＣＢメモリ・プールを初期化し、ＳｌｉｍＨＩＭを呼出してスクラッチ・メモリとＴＣＢとハードウエアとを初期化する。
【００６９】
失敗処理
ＩＯＮ２１６ダイポールの二つの半分は、共通セットのディスク装置に取り付けられる。ＩＯＮ２１２、２１４の両者は、何時でも所定のときにすべての装置にアクセスできなくてはならない。ＨＩＭ５０９から見て、失敗に関する特別の処理はない。
【００７０】
ＡＩＣ−１１６０  ＳｌｉｍＨＩＭ
ＳｌｉｍＨＩＭ５０９モジュールは、アダプタのハードウエア概念を与えるという全体的な目的を持っている（図示の実施例ではＡＤＡＰＴＥＣ  ＡＩＣ−１１６０）。このＳｌｉｍＨＩＭ５０９は、ファイバ・チャネル要求をＡＩＣ−１１６０アダプタに移送し、割込みをサービスし、ＳｌｉｍＨＩＭ５０９インタフェースを介してＨＩＭモジュールに状態を報告するという主要な役割を持っている。
【００７１】
ＳｌｉｍＨＩＭ５０９はまた、ＡＩＣ−１１６０ハードウエアの制御を担っており、これを初期化し、ファームウエアをロードし、実行時動作を起動し、ＡＩＣ−１１６０の誤りの場合にＡＩＣ−１１６０ハードウエアの制御を行う。
【００７２】
外部インタフェースとプロトコル
ＩＯＮ物理ディスク・ドライバ・サブシステム５００のすべての要求は、共通のハイレベル・ドライバ５０２を介して行われる。
【００７３】
Ｉｎｉｔｉａｌｉｚａｔｉｏｎ（ｃｓ−ｉｎｉｔ）
このサブシステムへの単一の呼出しは、入出力用に装置を準備するために必要となるすべての初期化を実行する。サブシステム初期化期間中にすべての装置あるいはアダプタハードウエアと同じく、すべてのドライバ構造が割り当てられて初期化される。
【００７４】
Ｏｐｅｎ／Ｃｌｏｓｅ（ｃｓ−ｏｐｅｎ／ｃｓ−ｃｌｏｓｅ）
オープン／クローズ（Ｏｐｅｎ／Ｃｌｏｓｅ）インタフェース５１０は、装置へのアクセスに必要な構造を初期化して分解する。このインタフェース５１０は、すべての「オープン」と「クローズ」とが暗示的に層状にされているという理由から一般のオープン／クローズ・ルーチンとは異なっている。したがって入出力物理インタフェース・ドライバ５００が受け取るすべての「オープン」は、受信されて関連付けられた「クローズ」を伴っていなければならず、また装置関連構造は、すべての「オープン」が「クローズ」されるまで解放されない。オープン／クローズ・インタフェース５１０は、「オープン」または「クローズ」の返却がその要求の完了を示すと言うことにおいて同期している。
【００７５】
Ｂｕｆ−ｔ（ｃｓ−ｓｔｒａｔｅｇｙ）
Ｂｕｆ−ｔインタフェース５１２は、装置への論理ブロック読取り・書込み要求の発行を可能にする。要求者は、入出力を記述するＢｕｆ−ｔ構造を伝える。装置ＩＤ、論理ブロック・アドレス、データ・アドレス、入出力の型（読取り／書込み）、呼戻しルーチンといった属性は、Ｂｕｆ−ｔによって記述される。要求が完了すると、要求者による呼戻しによって指定された関数が呼び出される。Ｂｕｆ−ｔインタフェース５１２は、非同期インタフェースである。要求者への関数の返却は、その要求が完了したことを示すわけではない。関数が返されるとき、入出力はその装置上で実行中であってもなくてもよい。要求は、実行されるのを待つ待ち行列上にあってもよい。この要求は、呼戻し関数が呼び出されるまでは完了しない。
【００７６】
ＳＣＳＩＬｉｂ
ＳＣＳＩＬｉｂ５１４は、装置に送るべき通常の読取り・書込み以外のＳＣＳＩコマンド記述子ブロック（ＣＤＢ）を可能にするインタフェースを提供する。このインタフェースによって、ディスクを回転させたり停止させるために装置起動・停止といった要求が使われ、また密閉装置を監視したり制御するためにＳｅｎｄ、Ｒｅｃｅｉｖｅ（送信、受信）診断が使われるであろう。すべてのＳＣＳＩＬｉｂルーチンは、同期している。呼び出された関数の返却は、要求の完了を示す。
【００７７】
Ｉｎｔｅｒｒｕｐｔｓ（ｃｓ−ｉｎｔｒ）
ＩＯＮ物理ディスク・ドライバ５００は、すべてのＳＣＳＩおよびファイバ・チャネル・アダプタの割込みのための中心的なディスパッチャである。一実施例ではフロントエンド／バックエンド割込み方式が利用される。このような場合に割込みが行われると、フロントエンド割込みサービス・ルーチンが呼び出される。フロントエンドは、割込みスタックから実行し、また割込み源を除去することと、更に割込みを発生させないようにアダプタを切り離すことと、バックエンド割込みサービス・ルーチンをスケジューリングすることとに責任を持っている。バックエンドは、実際に割込み（アダプタ割込みの切り離しとバックエンド・タスクの開始との間に発生したかもしれなかった他のいかなる割込みとも一緒に）を処理する優先度の高いタスクとして実行する。
【００７８】
ＩＯＮ機能
ＩＯＮ２１２は、５個の主要な機能を実行する。これらの機能には下記のものが含まれる。
【００７９】
記憶装置の命名と投影：記憶ディスク２２４上に記憶された記憶資源オブジェクトのイメージをコンピューティング・ノード２００に投影することによって、一様で一貫性のある記憶装置の命名を提供するためにコンピューティング・ノード２００と調和的動作をする。
【００８０】
ディスク管理：ＩＯＮ２１２と機能的に連結された記憶ディスク駆動機構２２４を用いてデータ分散およびデータ冗長の技術を実現する。
【００８１】
記憶装置管理：コンピューティング・ノード２００からの入出力要求の処理、性能上の機器構成およびイベント分散を含めて記憶装置の設定、データ移動などを処理するためのもの。
【００８２】
キャッシュ管理：アプリケーション・ヒント・プリフェッチといったキャッシュ・フル操作を含む読み・書きデータのキャッシングのためのもの。
【００８３】
相互接続管理：性能を最適化するためにコンピューティング・ノード２００との間のデータの流れを制御し、要求の経路指定を制御し、またしたがってダイポール２２６内の二つのＩＯＮ２１２の間での記憶の分配を制御する。
【００８４】
記憶装置の命名および投影
ＩＯＮ２１２は、記憶ディスク２２４上に記憶された記憶資源オブジェクトのイメージをコンピューティング・ノード２００に投影する。この機能の重要な役割は、ＩＯＮ２１２によって管理される各記憶資源（仮想ファブリック・ディスクを含む）に関して、グローバルに一意の名前、ファブリック独自のＩＤ、あるいはボリューム・セット識別子（ＶＳＩ）６０２の作成と割り当てである。
【００８５】
図６は、ＶＳＩの構造と内容および関連データを示す図である。ＶＳＩ６０２が一意であって競合しないことは重要であるから、各ＩＯＮ２１２は、そのＩＯＮ２１２によってローカルに管理される記憶資源に関してグローバルに一意の名前を作成して割り当てることに責任があり、また記憶資源オブジェクトを記憶する記憶資源を管理するそのＩＯＮ２１２だけがその記憶資源に関してＶＳＩ６０２を割り当てることが許される。常駐記憶資源を現に管理しているＩＯＮ２１２だけはＶＳＩ６０２を作成して割り当てることができるが、他のＩＯＮ２１２は、その後にそれらの記憶資源の記憶と検索とを管理することができる。これは、もしＩＯＮ割り当てのＶＳＩ６０２が他のＩＯＮによって管理される記憶資源に後で移されても、ある特定のデータ・オブジェクトについてのＶＳＩ６０２は変更する必要がないからである。
【００８６】
ＶＳＩ６０２は、ＩＯＮ識別子６０４とシーケンス番号５０６という二つの部分を含む６４ビットの数として実現される。ＩＯＮ識別子６０４は、各ＩＯＮ２１２に割り当てられるグローバルに一意の識別番号である。グローバルに一意のＩＯＮ識別子６０４を得る一つの手法は、しばしばリアルタイム・クロック・チップに格納される電子的に読取り可能なマザーボード通し番号を使うことである。この通し番号は、ただ一つのマザーボードに割り当てられるだけであるから一意である。ＩＯＮ識別子６０４がグローバルに一意の番号であるから、各ＩＯＮ２１２は、ローカルにだけ一意であるシーケンス番号を割り当てることができ、また更にグローバルに一意のＶＳＩ６０２を作成することができる。
【００８７】
ＶＳＩ６０２がＩＯＮ２１２上の記憶資源に結合されたのちに、そのＩＯＮ２１２は、その記憶資源１０４へのアクセスを可能にするファブリック上のすべてのノードに対して同報メッセージを介してＶＳＩ６０２を移出する。この処理は、本書のＩＯＮ名前移出セクションで更に論ずる。
【００８８】
それからコンピューティング・ノード２００ソフトウエアは、移出されたＶＳＩ６０２を使って、他のいかなるローカルに付加された記憶装置とは区別がつかないということにおいて意味的にトランスペアレントであるその記憶資源についてのローカルの入口点を作成する。例えばもしコンピューティング・ノードのオペレーティング・システム２０２がＵＮＩＸであったとすると、ブロック装置入口点と裸装置入口点の両者とも、周辺装置１０８またはディスク２１０といったローカルに付加された装置に類似の装置ディレクトリ内に作成される。他のオペレーティング・システム２０２についても同様な意味的に同等なものがついてくる。異なるオペレーティング・システム２０２を走行させるコンピューティング・ノード２００の間では、異種コンピューティング環境を最も良くサポートするためにルート名の整合性が維持される。
【００８９】
コンピューティング・ノード２００内のローカルの入口点は、移出された記憶資源１０４の現在の可用性を追跡するためにＩＯＮ２１２によって動的に更新される。ＶＳＩ６０２は、移入された記憶資源について装置入口点名を作成するためにコンピューティング・ノード２００上で走行するＯＳ依存のアルゴリズムによって使われる。この手法は、共通のオペレーティング・システムを共用するノード間での名前の整合性を保証する。これは、各コンピューティング・ノード２００上のグローバルに命名された記憶資源のためのローカルな入口点を動的に（静的の代わりに）作成することによって異種コンピューティング環境をサポートするために、システムがルート名の整合性を維持することを可能にしている。
【００９０】
上述のように記憶資源１０４に関するＶＳＩ６０４の作成の詳細は、記憶資源１０４を移出しているＩＯＮ２１２によって直接制御される。コンピューティング・ノード２００間の潜在的なオペレーティング・システム１０４の違いを説明するために、１個以上の記述的ヘッダが各ＶＳＩ６０２に結合されて、ＩＯＮ２１２上のＶＳＩ６０２と一緒に格納される。各々のＶＳＩ６０２記述子６０８は、特定のＶＳＩ６０２に関するコンピューティング・ノード２００上の装置入口点の矛盾のない（名前と動作上の意味の両者がコンピューティング・ノード２００全体に亘って同じである）作成のために必要な十分なＯＳ２０２依存性のデータを格納するためのオペレーティング・システム（ＯＳ）依存データ・セクション６１０を含んでいる。
【００９１】
このＯＳ依存データ６１０は、例えばローカルなアクセス権６１２を記述するデータと所有権情報６１４とを含んでいる。ＶＳＩ６０２がＩＯＮ２１２によって確立され、コンピューティング・ノード２００によって移出された後で、しかしＶＳＩ６０２に関連したその記憶資源１０４のための入口点が作成されるよりは前に、適当なＯＳ固有データ６１０は、ＩＯＮ２１２によってコンピューティング・ノード２００に送られる。一つのＶＳＩ６０２当たり多数の記述的ヘッダは、異なるＯＳ（各ＯＳはそれ自身の記述子ヘッダーを持っている）を走らせる多数のコンピューティング・ノード２００のサポートと、異なるコンピューティング・ノード２００グループ間でのばらばらのアクセス権のサポートとの両方を同時に可能にする。同じ記述子ヘッダを共用するコンピューティング・ノード２００は、装置入口点の共通で矛盾のない作成を共用する。このようにして名前と動作上の意味の両者とも、共通セットのアクセス権を共有するすべてのコンピューティング・ノード２００上で整合性を維持することができる。
【００９２】
ＶＳＩ記述子６０８はまた、別名フィールド６１６を含んでおり、これは人間が読取れるＶＳＩ６０２名をコンピューティング・ノード２００上に表示するために使用できる。例えばもしＶＳＩ１９８４の別名が「ｓｏｍａ」であれば、コンピューティング・ノード２００は、１９８４と「ｓｏｍａ」の両方に関するディレクトリ・エントリを持つことになるであろう。ＶＳＩ記述子６０８はＩＯＮ２１２上のＶＳＩ６０２と一緒に格納されるので、ＶＳＩ６０２を移入する各コンピューティング・ノード２００上には同じ別名とローカル・アクセス権とが現れるであろう。
【００９３】
前述のように本発明は、分散型割当て方式に適する命名手法を使用している。この手法では、名前はグローバルな一意性を保証するアルゴリズムにしたがってローカルに作成される。これの変形は、各システムごとに中心的な命名サーバが存在する、ローカルに集中化する手法を追求することもできようが、可用性と頑丈さとの要件からは純粋な分散型手法を重く見ている。上述のことを使って、本発明はグローバルな一意性を保証するローカルに実行可能なアルゴリズムを作成することができる。
【００９４】
グローバルに整合性のある記憶システムを作成することは、コンピューティング・ノード２００全体に亘って名前の整合性を保存するだけでなくサポートすることを更に必要とする。名前の整合性は、安全保護の問題であって、これは本発明では二つの形式を採る。第一は、ＩＯＮ２１２とコンピューティング・ノード２００との間のインタフェースの安全保護であり、第二は、コンピューティング・ノード２００内からの記憶の安全保護である。
【００９５】
記憶の認証と認可
ＶＳＩ６０２資源は、認証と認可という二つの異なる機構で保護されている。もしコンピューティング・ノード２００がＩＯＮ２１２によって認証されれば、ＶＳＩ名がそのコンピューティング・ノード２００に移出される。移出されたＶＳＩ６０２は、コンピューティング・ノード２００上に装置名として現れる。コンピューティング・ノード２００上で走行するアプリケーション・スレッドは、この装置名で操作の実行を試みることができる。装置入口点のアクセス権とコンピューティング・ノード２００のＯＳ意味論とは、アプリケーション・スレッドがいかなる所定の認可でも実行するように権限付与されているかどうかを決定する。
【００９６】
この認可の手法は、コンピューティング・ノード２００の認可を、相互接続ファブリック１０６によってアクセス可能な何処にでも配置される記憶資源にまで拡張する。しかしながら本発明は、本発明においては記憶資源１０４がコンピューティング・ノード２００によって直接的に管理されないということで、他のコンピュータ・アーキテクチャとは異なっている。この相違は、ローカルの認可データを単にファイル・システム・エンティティに結合することを実行できなくする。その代わりに本発明は、コンピューティング・ノード２００認可方針データをＩＯＮ２１２のＶＳＩ６０２と結合させて、コンピューティング・ノード２００とＩＯＮ２１２とがあるレベルの相互信頼を共有する二段階手法を用いる。ＩＯＮ２１２は、ある所定のＶＳＩ６０２への各コンピューティング・ノード２００アクセスを認可するが、ＶＳＩによって指示されたデータに対する特定のアプリケーション・スレッドの認可の更なる改良は、このコンピューティング・ノード２００の責任である。それからコンピューティング・ノード２００は、ＩＯＮ２１２によって記憶された認可メタデータ内に含まれる方針を使って、記憶エンティティ１０４に関する認可方針を実行する。
【００９７】
したがってコンピューティング・ノード２００は、ＩＯＮ２１２を信頼してメタデータを保存することを要求され、またＩＯＮ２１２に対してはコンピューティング・ノード２００を信頼してその認可を実行することを要求する。この手法の一つの利点は、ＩＯＮ２１２に対してメタデータを解釈する方法に関する知識を持つことを要求しないということである。したがってＩＯＮ２１２は、コンピューティング・ノード２００によって使われている異なるオペレーティング・システム２０２によって課せられた異なる認可意味論によって課せられた特定の認可意味論を実行することから分離される。
【００９８】
ＶＳＩ６０２に関連するすべてのデータ（アクセス権を含めて）は、ＩＯＮ２１２に格納されるが、アクセス権データの内容を管理する責任はコンピューティング・ノード２００に置かれている。特にＩＯＮ２１２によって移出されるＶＳＩ６０２のリストがコンピューティング・ノード２００に送られると、ローカルな認可を実行するようにそのコンピューティング・ノード２００によって要求されるＯＳ固有データのすべては各ＶＳＩ６０２に結合される。例えばＵＮＩＸを走行させるコンピューティング・ノード２００は、名前とグループ名とユーザＩＤとモード・ビットとを、すなわちファイル・システムに装置入口ノードを作るために十分なデータを送られるであろう。
【００９９】
コンピューティング・ノードのオペレーティング・システム２０２のそのクラスにとって固有の（あるいは正にそのコンピューティング・ノード２００にとって固有の）ＶＳＩ６０２の別の名前は、各ＶＳＩ６０２と一緒に含まれる。記憶装置のアクセス権を変更するローカルのＯＳ固有コマンドは、コンピューティング・ノード２００ソフトウエアによって捕捉されてＩＯＮ２１２に送られるメッセージに変換される。このメッセージは、ＯＳバージョンに固有のＶＳＩアクセス権データを更新する。この変更が完了したときＩＯＮ２１２は、システム内でそのＯＳを使っているすべてのコンピューティング・ノード２００にこの更新を送信する。
【０１００】
コンピューティング・ノード（ＣＮ）２００がオンラインになるとそれは、「自分はここにいます」というメッセージを各ＩＯＮ２１２に送信する。このメッセージは、このコンピューティング・ノード２００を識別するディジタル署名を含んでいる。もしこのコンピューティング・ノード２００がＩＯＮ２１２によって知られれば（ＩＯＮ２１２がコンピューティング・ノード２００を認証すれば）、ＩＯＮ２１２は、そのコンピューティング・ノード２００がアクセス権を有するすべてのＶＳＩ名を移出する。コンピューティング・ノード２００は、ＶＳＩ名のこれらのリストを使ってシステム記憶用のローカル・アクセス入口点を構築する。このコンピューティング・ノード２００内で走行するアプリケーション２０４がローカル端点を参照すると、コンピューティング・ノード２００はそのＶＳＩ６０２用のアクセス権記述データに関するあるメッセージを相互接続ファブリック１０６に亘って送信することによってＩＯＮ２１２に対して要求を行う。
【０１０１】
この要求メッセージは、要求しているコンピューティング・ノード２００に関するディジタル署名を含んでいる。ＩＯＮ２１２は、このメッセージを受け取り、ディジタル署名を使って、応答時に送るべきＶＳＩアクセス権の適当なセットを突き止め、要求中のコンピューティング・ノード２００にそのデータを相互接続ファブリック１０６を介して送信する。ＩＯＮ２１２はコンピューティング・ノード２００に送られたアクセス権を解釈しないで単にそのデータを送るだけである。コンピューティング・ノード２００ソフトウエアは、このデータを使って、この主題の記憶オブジェクトのためのローカル入口点にローカルアクセス権の適当なセットを結合する。
【０１０２】
一セットのコンピューティング・ノード２００は、同じディジタル署名を使うか、多数の異なる署名を同じセットのアクセス権に結合するかいずれかによってこの同じセットのアクセス権を共有できる。本発明は、コンピューティング・ノード２００を識別するためと、どのセットのローカル認可データを使ってローカル入口点を作成するかを指定するためとの両方に認証を使う。認可データは、ＶＳＩ６０２が最初にアプリケーションによって参照されるときにコンピューティング・ノードに引き出されるだけである。この「必要時に引く」モデルは、非常に大きなシステム上で大量のアクセス権メタデータを移動させることの運転開始コストを回避する。
【０１０３】
もしコンピューティング・ノード２００が認証に失敗するならば、ＩＯＮ２１２はＶＳＩ６０２名を持たないメッセージを送り返し、そして認証失敗フラグがセットされる。コンピューティング・ノード２００は、そのＩＯＮ２１２からのＶＳＩ装置名なしで黙って続行することができ、またシステム管理者の希望によってその認証失敗を報告することもできる。もちろん認証に成功してもＶＳＩ装置名をコンピューティング・ノードに送らないことにしてもよい。
【０１０４】
起動時の競合解消
ＩＯＮ２１２は起動するとき、ＶＳＩ６０２を相互接続ファブリック１０６に移出しようとする。このような場合、システムのデータ完全性は新しいＩＯＮ２１２による破壊から保護されなくてはならない。これを達成するために新しいＩＯＮ２１２は、記憶の移出が許される前に検査される。これは次のように遂行される。最初にＩＯＮ２１２は、そのローカル記憶を調べて、移出可能なＶＳＩ６０２のリストを作成する。ＶＳＩ６０２メタデータは、ＶＳＩの世代番号または変更番号を含む。このＶＳＩ変更番号は、そのＶＳＩ６０２に関連した主な状態変更があるときは何時でも（ＶＳＩが、あるネットワークにうまく移出されたときなど）増やされる。コンピューティング・ノード２００とＩＯＮ２１２とを含めて、ＶＳＩ競合検出に関与するすべてのノードは、移出されたＶＳＩの履歴とそれらの変更番号とをメモリ内に保持する。
【０１０５】
相互接続ファブリック１０６上のすべてのノードは、移出されたＶＳＩ６０２をＶＳＩ競合に関して絶えず監視することが必要とされる。最初にＶＳＩ変更番号は（記憶領域が最初に生成されたとき）ゼロにセットされる。変更番号は、移出された前回よりも低い変更番号を持った移出ＶＳＩ６０２は、真のＶＳＩ６０２に関連したＩＯＮ２１２が使われなくなった場合でも偽のＶＳＩであると想定されることがあり得るると言うことにおいて、競合解消基準を提供する。真のＶＳＩ６０２に関連した変更番号よりも高い変更番号を有するＩＯＮ２１２に付加された偽のＶＳＩ６０２は、真のＶＳＩ６０２上で既に入出力が実行されてしまったのでなければ、真のＶＳＩ５１２と見なされる。相互接続ファブリック１０６に新たに導入されたＩＯＮ２１２は、０から始まるその変更番号を持つ必要がある。
【０１０６】
ＩＯＮ２１２は、システムに入りたいと公表したのちに、ＶＳＩ６０２とそれ関連の変更番号とのそのリストを送信する。その他のすべてのＩＯＮ２１２とコンピューティング・ノード２００は、このリストを取得してから、ＶＳＩ６０２リストを移出するためにＩＯＮ２１２の妥当性を検査する。
【０１０７】
同じＶＳＩ６０２を現在移出中の他のＩＯＮは、妥当であると想定され、競合している特定のＶＳＩの移出を許可しないというメッセージを新しいＩＯＮ５１２に送る。もし新しいＩＯＮ５１２がシステム内で現に使われている番号よりも大きい世代番号または変更番号を持っているならば（ＶＳＩはグローバルに一意であるから、通常の運用では起こるはずのないケース）、このことは記録され、必要な処置は何でも取るシステム管理者に報告される。もし競合が存在しなければ、各ＩＯＮ２１２とコンピューティング・ノード２００は、進行票で応答する。すべてのＩＯＮ２１２とコンピューティング・ノード２００とからの応答が受信されると、競合していない新しいＩＯＮ２１２ＶＳＩ６０２のすべては自分の世代番号を増加させて、移出に関してシステムに利用可能となる。
【０１０８】
コンピューティング・ノード２００がＶＳＩ６０２へのアプリケーション参照とアクセスとを持っているとき、そのコンピューティング・ノード２００は現在の世代番号をローカルに追跡するであろう。新しいＩＯＮ２１２がＶＳＩ６０２を公表する（移出しようとする）ときは何時でも、コンピューティング・ノード２００は、ＶＳＩ６０２によって公表された世代を、そのＶＳＩ６０２に関してローカルに記憶されている世代番号に対して検査する。もし世代番号が一致すれば、コンピューティング・ノード２００は進行することに票を投じるであろう。
【０１０９】
もし世代番号が競合していれば（旧いバージョンのＶＳＩがオンラインにされた場合にあり得るように）、コンピューティング・ノード２００は不許可メッセージを送るであろう。そのＶＳＩ６０２に関して新しいＩＯＮ２１２によって公表された世代番号よりも旧い世代番号を持っているコンピューティング・ノード２００は、進行に票を投じて、そのＶＳＩ６０２に関する世代番号のローカル・バージョンを更新するであろう。コンピューティング・ノード２００は再ブートの間で世代番号を保存しないが、これは、基本設計が、相互接続ファブリック１０６に亘るシステムが安定であることと、コンピューティング・ノード２００とＩＯＮ２１２とを含めてすべての新規参入者が整合性について検査されることとになっているからである。
【０１１０】
最初の電源投入は、ＶＳＩ６０２に関する名前領域の安定性が問題になる状況を作りだすことがある。この問題は、先ずＩＯＮ２１２に電源投入して、それからコンピューティング・ノード２００が参入を許される前にこれらのＩＯＮ２１２が名前競合の解消を続行することを可能にすることとによって、対処される。それから古くなったＶＳＩ６０２のバージョン（ディスク駆動機構上の旧いデータと他の世代を遡る条件から）は、その世代番号を介して解決される。コンピューティング・ノード２００がＶＳＩ６０２を使っていないかぎり、より高い世代番号を有する新規参入者は、特定のＶＳＩ６０２の現行移出者を無効にすることができる。
【０１１１】
名前サービス
ＩＯＮ名の移出
ＩＯＮ２１２は、関連する記憶装置へのアクセスを可能にすることを排他的に所有するＶＳＩ６０２のワーキング・セットを移出する。ＩＯＮ２１２によって移出されるＶＳＩのワーキング・セットは、兄弟ＩＯＮ（ダイポール２２６内の他方のＩＯＮ２１２で、２１４として示される）とのＶＳＩ所有権折衝を通じて動的に決定され、またこれは相互接続ファブリック１０６との通信を行うすべてのノード内でグローバルに一意であるべきである。このセットは、一般的にはＩＯＮ２１２に割り当てられたＶＳＩ６０２の省略時セットまたはＰＲＩＭＡＲＹ（主）セットである。動的負荷最適配分のためのＶＳＩ移動と、兄弟ＩＯＮ２１４障害と入出力経路障害とを含む例外条件とは、移出ＶＳＩ６０２がＰＲＩＭＡＲＹセットと異なるようにセットされる結果をもたらすことがある。
【０１１２】
ＶＳＩのワーキング・セットは、このワーキング・セットがコンピューティング・ノード２００に最新のＶＳＩ６０２構成を供給するために変わるときは何時でも、同報メッセージを介してＩＯＮ２１２によって移出される。コンピューティング・ノード２００はまた、ＶＳＩ６０２のそのワーキング・セットについてＩＯＮ２１２に問い合わせることもできる。ＶＳＩ６０２への入出力アクセスは、一旦ＩＯＮ２１２が移出ＶＳＩ６０２に関してオンライン状態に入るか、再び入るかすると、コンピューティング・ノード２００によって初期化できる。前に述べたようにＩＯＮ２１２は、移出ＶＳＩ６０２内にいかなる競合でも存在する場合には、オンラインに入ることが許されない。一塊の記憶装置に関連のＶＳＩ６０２は、すべて一意的であるべきであるが、多数の塊の記憶装置が同じＶＳＩを持っている場合には競合が発生する機会がある（例えばもしＶＳＩがＩＯＮ２１２ハードウエアとＩＯＮ２１２管理のシーケンス番号とに関連した一意のＩＤから構成されていて、そのＩＯＮ２１２ハードウエアが物理的に移された場合）。
【０１１３】
一旦ワーキング・セットが移出されると、移出しているＩＯＮ２１２は、移出されたＶＳＩ６０２への入出力アクセスを可能にするためにオンラインに入る前に、競合検査タイマー（２秒）をセットする。競合検査タイマーは、移入者が競合検査処理を行うために十分な時間を与えようとしまた、移出者に競合を知らせようとするが、タイマーが非常に大きな値にセットされていなければこれは保証できない。したがってＩＯＮ２１２は、公式にオンラインに入るすべてのノード（コンピューティング・ノード２００とＩＯＮ２１２）からの明示的な承認を必要とする。オンライン同報メッセージはすべてのノードによって同時に応答され、またその結果は併合されて同報で返される。ＩＯＮ２１２は、もし併合された応答がＡＣＫ（肯定応答）であれば公式にオンライン状態に入る。もしＩＯＮ２１２がオンラインに入ることを許されなければ、新たに移出されたＶＳＩ６０２のセットはアクセスできない。ＮＡＫ（否定応答）を送ったノードは、競合を解消するために移出者に、続いてＶＳＩ競合メッセージを送る。一旦この競合が解消されれば、ＩＯＮ２１２は調整済みのワーキング・セットを移出して再びオンラインに入ろうとする。
【０１１４】
ＣＮ名の移入
コンピューティング・ノード２００は、すべてのＩＯＮ２１２によって移出されたすべてのＶＳＩ５０４を移入するための処置をとる責任がある。一日の初め処理の時に、コンピューティング・ノード２００は、名前領域の最新のビューを取得できるように、前に移出されたＶＳＩ６０２についてのすべてのオンラインＩＯＮ２１２から依頼する。その時点からコンピューティング・ノード２００は、ＶＳＩ６０２の移出に関して耳をそば立てる。
【０１１５】
ＶＳＩ６０２に関連する制御情報はＩＯＮ２１２によって維持させるｖｓｎｏｄｅ（ＶＳノード）に入っている。ＶＳノードのコンピューティング・ノード２００部は、アプリケーション２０４に提示される名前の構成と管理のために使われる情報を含んでいる。ＶＳノード情報は、ユーザ・アクセス権と名前の別名とを含んでいる。
【０１１６】
名前領域と別名
ＶＳＩ６０２は、関連の記憶装置にアクセスするための代替の名前を与える、アプリケーション定義の名前別名を持つように構成できる。名前別名は、１セットの名前を論理的にグループ化するために仮想記憶領域に付加することができる。名前別名は仮想記憶領域内で一意でなければならない。
【０１１７】
ＶＳＮＯＤＥ
コンピューティング・ノード２００によってＶＳノードに加えられる修正は、即座の更新と処理のためにそれを所有しているＩＯＮ２１２に送られる。それからこのＶＳノード変更は、変更を移出してオンライン状態に再び入ることによってＩＯＮ２１２からすべてのノードに伝えられる。
【０１１８】
記憶ディスクの管理
ＪＢＯＤ筐体２２２は、ディスク装置のために物理的環境を提供することと、ディスク装置と筐体の管理アプリケーションに幾つかのサービスを提供することとに責任を持っている。これらのサービスの一部には、（１）コンポーネント障害の通知（電源、ファン等）と、（２）しきい値の通知（温度と電圧）と、（３）故障ランプと状態ランプの点灯・消灯と、（４）可聴警報の鳴動・停止と、（５）ディスク装置の装置ＩＤの設定とが含まれる。
【０１１９】
従来は管理アプリケーションは、一般に帯域外接続によって筐体にインタフェース接続していた。単純なネットワーク管理プロトコル（ＳＮＭＰ）のようなプロトコルを使うことに加えて遠隔の筐体へのシリアル・アタッチメントまたはイーサーネット・アタッチメントが筐体の健康に関する状態情報の受信を可能にしていた。本発明ではディスク筐体はホスト・システムから物理的に離れていることがあるので、別の直列の経路といった直接接続によって筐体の構成と状態を監視することは実用的ではない。余分の配線を避けるために本発明は、筐体状態を監視することと、通常の既存のファイバ・チャネル・ループ全体に亘る筐体構成を制御することとを備える帯域内接続を使用する。
【０１２０】
帯域内接続は、構成状態を問い合わせて制御するためにＳＣＳＩ装置に送られる、ホストから発信される１セットのコマンドと、筐体との間でこの情報を通信する装置のための機構とを使用する。ホストとディスク駆動機構との間のプロトコルの一部は、ＳＣＳＩ−３エンクロージャ・サービス（ＳＥＳ）仕様に詳述されており、これは参考のためにここに組み入れてある。
【０１２１】
ＳＥＳインタフェースを実現するために、三つのＳＣＳＩコマンド、ＩＮＱＵＩＲＹとＳＥＮＤ  ＤＩＡＧＮＯＳＴＩＣとＲＥＣＥＩＶＥ  ＤＩＡＧＮＯＳＴＩＣ  ＲＥＳＵＬＴＳとが使われる。ＩＮＱＵＩＲＹコマンドは、所定の装置がエンクロージャ・サービス装置であるか、エンクロージャ・サービス処理にＳＥＳコマンドを移送することのできる装置であるかどうかを指定する。ＳＥＮＤ  ＤＩＡＧＮＯＳＴＩＣとＲＥＣＥＩＶＥ  ＤＩＡＧＮＯＳＴＩＣ  ＲＥＳＵＬＴＳとは、それぞれ筐体エレメントからの状態情報を制御し、受信するために使われる。
【０１２２】
ＳＥＮＤ  ＤＩＡＧＮＯＳＴＩＣコマンドまたはＲＥＣＥＩＶＥ  ＤＩＡＧＮＯＳＴＩＣ  ＲＥＳＵＬＴＳコマンドを使うときには、ページ・コードを指定しなくてはならない。ページ・コードは、何という型の状態または情報が要求されているかを指定する。
【０１２３】
ＳＥＮＤ  ＤＩＡＧＮＯＳＴＩＣコマンドとＲＥＣＥＩＶＥ  ＤＩＡＧＮＯＳＴＩＣ
ＲＥＳＵＬＴＳコマンドとによって要求できる定義されたＳＥＳページのフルセットは下記の表７に詳しく示す。太字の項目は、ＳＥＳイベント・モニターによって要求される。
【０１２４】
【表７】
0004618654.tif 000008
【０１２５】
ＥＳアレー状態
アプリケーション・クライアントは、１よりも大きい最小割当て長さを有する筐体状態ページを要求するＲＥＡＤ  ＤＩＡＧＮＯＴＩＣ  ＲＥＳＵＬＴＳコマンドを実行することによって定期的にその筐体にポーリングを行うことができる。１バイトで返される情報は、筐体の状態を要約した５ビットを含んでいる。これらのビットの一つがセットされれば、アプリケーション・クライアントは、状態全部を取得するためにより大きな割当て長さを持つコマンドを再発行することができる。
【０１２６】
ＩＯＮ筐体管理
図７は、ＩＯＮ筐体管理モジュールとＩＯＮ物理ディスク・ドライバ・アーキテクチャ５００との間の関係を示す。二つのコンポーネントがこのサブシステム−ＳＥＳイベント・モニター７０２とＳＣＣ２＋〜ＳＥＳガスケット７０４とを構成する。ＳＥＳイベント・モニター７０２は、付加されたエンクロジャ・サービス処理をすべて監視することと、状態変更の場合にそれをイベント・ロギング・サブシステム経由で報告することとに責任を持っている。この報告は、必要ならば管理サービス層７０６に転送できる。ＳＣＣ２＋〜ＳＥＳガスケット・コンポーネント７０４は、構成・保守アプリケーションからくるＳＣＣ２＋コマンドを一つ以上のＳＥＳコマンドに変換してエンクロージャ・サービス処理に送ることに責任を持っている。これは、アプリケーション・クライアントがＪＢＯＤ構成の仕様を知る必要をなくしている。
【０１２７】
ＳＥＳイベント・モニター
ＳＥＳイベント・モニター７０２は、エンクロージャ２２２サービス処理状態の変化を管理サービス層７０６に報告する。状態情報は、イベント・ロギング・サブシステムを介して報告される。ＳＥＳイベント・モニター７０２は、筐体情報ページを要求するＲＥＡＤ  ＤＩＡＧＮＯＳＴＩＣ  ＲＥＳＵＬＴＳコマンドを実行することによって各筐体処理を定期的にポーリングする。ＲＥＡＤ  ＤＩＡＧＮＯＳＴＩＣ  ＲＥＳＵＬＴＳコマンドは、ＩＯＮ物理装置ディスク・ドライバ５００によって与えられるように、ＳＣＳＩＬｉｂインタフェース５１４を介して送られるであろう。報告できる状態は、下記の表８にリスト化されている状態項目を含んでいる。
【０１２８】
【表８】
筐体状態値
0004618654.tif 000009
【０１２９】
ＳＥＳイベント・モニター７０２が起動すると、筐体内に含まれている各エレメント４０２〜４２４に関する状態を読み取る。この状態は、現在状態である。状態変化が検出されると、現在状態から変化した各状態は、管理サービス層７０６に報告される。今度はこの新しい状態が現在状態となる。例えばもしファン・エレメントの現在状態がＯＫであって、ある状態変化がファン障害としてこのエレメントを報告するとすれば、ファン障害を特定するイベントが報告されるであろう。こんどは別の状態変化がエレメントが設置されていないことを特定すれば、ファンが筐体から除去されたことを特定する別のイベントが報告されるであろう。もし別の状態変化がファン・エレメントがＯＫであることを特定すれば、ファンがホット・プラグインされて正しく動作していることを特定する別のイベントが生成されるであろう。
【０１３０】
一日の初め処理
ＳＥＳイベント・モニター７０２は、ＩＯＮ物理ディスク・ドライバ５００の初期化が成功した後に起動される。起動の後、ＳＥＳイベント・モニター６０２は、ＪＢＯＤおよびＳＣＳＩ構成モジュール５１６を読み取って、ディスク装置とエンクロージャ・サービス装置との相関と、装置がどのようにアドレス指定されるかとを見つける。次ぎに各筐体状態装置の状態が読み取られる。それから誤り条件と紛失エレメントすべてについてイベントが生成される。これらのステップが完了した後では、今度の状態は現在状態であり、ポーリングが始まる。
【０１３１】
ＳＣＣ２＋〜ＳＥＳガスケット
ＳＣＣ２＋は、仮想装置と物理装置とを構成して管理するためにＩＯＮ２１２によって使われるプロトコルである。ＳＣＣ２＋の中のプラス“＋”は、ＩＯＮ２１２の装置とコンポーネントとを十分に管理し易くし、またＳＣＣ２定義のコマンドのＳＥＳへの矛盾のないマッピングを可能にするＳＣＣ２への追加部分を表す。
【０１３２】
サービス層７０６は、ＳＣＣ２  ＭＡＩＮＴＥＮＡＮＣＥ  ＩＮコマンドとＳＣＣ２
ＭＡＩＮＴＥＮＡＮＣＥ  ＯＵＴコマンドとによってＪＢＯＤ筐体２２２エレメントを取り扱う。次のセクションでは、コンポーネントの状態を構成し、制御し、報告するための機構を提供するサービス動作について説明する。これらのコマンドの各々は、ＳＥＮＤ  ＤＩＡＧＮＯＳＴＩＣコマンドとＲＥＣＥＩＶＥ  ＤＩＡＧＮＯＳＴＩＣ  ＲＥＳＵＬＴＳコマンドという一連のコマンドとしてＩＯＮ２１２上で実現されるであろう。
【０１３３】
コンポーネントの構成は下記のサービス機能を用いて実行される。
【０１３４】
ＡＤＤ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を追加する）−このＡＤＤ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥコマンドは、コンポーネント装置をシステム内に構成するためと、それらのＬＵＮアドレスを定義するためとに使われる。ＬＵＮアドレスは、ＳＥＳ構成ページ内のコンポーネント位置に基づいてＩＯＮ２１２によって割り当てられる。ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能は、ＬＵＮ割当ての結果を取得するためにこのコマンドに続いて実行される。
【０１３５】
ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を報告する）−このＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ  ＳＴＡＴＵＳサービス機能は、コンポーネント装置に関する十分な状態情報を検索することを意図した業者独自のコマンドである。ＳＥＳは、各エレメント型ごとに４バイトの状態を与える。この新しいコマンドは、ＲＥＰＯＲＴ  ＳＴＡＴＥＳおよびＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能が状態情報のために１バイトだけを割り当てていて、定義された状態符号はＳＥＳ規格によって定義された状態符号と競合するという理由から必要となる。
【０１３６】
ＡＴＴＡＣＨ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を付加する）−このＡＴＴＡＣＨ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥは、一つ以上の論理装置が所定のコンポーネント装置に論理的に付加されることを要求する。このコマンドは、ボリューム・セットと、ファン、電源等といった、ボリューム・セットが依存するコンポーネント装置との間に論理的結合を形成するために使うことができる。
【０１３７】
ＥＸＣＨＡＮＧＥ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を交換する）−ＥＸＣＨＡＮＧＥ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ機能は、一つのコンポーネント装置が他の装置に交換されることを要求する。
【０１３８】
ＲＥＭＯＶＥ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を削除する）−ＲＥＭＯＶＥ  ＰＥＲＩＰＨＥＲＡＬ  ＤＥＶＩＣＥ／ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能は、周辺装置またはコンポーネント装置がシステム構成から削除されることを要求する。もし論理装置を取り付けたコンポーネント装置が削除されつつあるならば、このコマンドはＣＨＥＣＫ  ＣＯＮＤＩＴＩＯＮで終了させられるであろう。センス・キーは、ＲＥＭＯＶＥ  ＯＦ  ＬＯＧＩＣＡＬ  ＵＮＩＴ  ＦＡＩＬＥＤという追加のセンス修飾子を持ったＩＬＬＥＧＡＬ  ＲＥＱＵＥＳＴとなるであろう。
【０１３９】
あるコンポーネントに関する状態その他の情報は、下記のサービス機能によって取得できる。
【０１４０】
ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＳＴＡＴＵＳ（コンポーネントの状態を報告する）−ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ  ＳＴＡＴＵＳサービス機能は、コンポーネント装置に関する全部の状態情報を検索することを意図した業者独自のコマンドである。ＳＥＳは、各エレメント型ごとに４バイトの状態を与える。これらＲＥＰＯＲＴ  ＳＴＡＴＥＳおよびＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能は、状態情報のために１バイトだけ割り当てており、定義された状態符号はＳＥＳ規格によって定義された状態符号と競合する。したがってこの新しいコマンドが必要となる。
【０１４１】
ＲＥＰＯＲＴ  ＳＴＡＴＥＳ（状態を報告する）−ＲＥＰＯＲＴ  ＳＴＡＴＥＳサービス機能は、選択された論理装置に関する状態情報を要求する。各論理装置ごとに一つ以上の状態のリストが返される。
【０１４２】
ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を報告する）−ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能は、ＪＢＯＤ内のコンポーネント装置に関する情報を要求する。ＬＵＮ記述子の順序付けリストが返され、ＬＵＮアドレスとコンポーネント型と全体の状態とを報告する。このコマンドは、ＡＤＤ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能によって割り当てられたＬＵＮアドレスを決定するために初期構成処理の一部として使われる。
【０１４３】
ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ  ＡＴＴＡＣＨＭＥＮＴＳ（コンポーネント装置アタッチメントを報告する）−ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ  ＡＴＴＡＣＨＭＥＮＴＳサービス機能は、所定のコンポーネント装置に取り付けられた論理装置に関する情報を要求する。各々がＬＵＮ記述子のリストを含んでいるコンポーネント装置記述子のリストが返される。ＬＵＮ記述子は、対応するコンポーネントに取り付けられた各論理装置ごとに型とＬＵＮアドレスとを指定する。
【０１４４】
ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ  ＩＤＥＮＴＩＦＩＥＲ（コンポーネント装置識別子を報告する）−ＲＥＰＯＲＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ
ＩＤＥＮＴＩＦＩＥＲサービス機能は、所定のコンポーネント装置の位置を要求する。コンポーネントの位置を示すＡＳＣＩＩ値が返される。この値は、ＳＥＴＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ  ＩＤＥＮＴＩＦＩＥＲサービス機能によって前もって設定しておかなくてはならない。
【０１４５】
コンポーネントの管理は、下記によって行われる。
【０１４６】
ＩＮＳＴＲＵＣＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置に命令する）−ＩＮＳＴＲＵＣＴ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥコマンドは、電源の投入・切断といった制御命令をコンポーネント装置に送るために使われる。ある特定の装置に与えられる機能は、コンポーネントの型によって変わり、また業者固有である。
【０１４７】
ＢＲＥＡＫ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥ（コンポーネント装置を故障とする）−ＢＲＥＡＫ  ＣＯＭＰＯＮＥＮＴ  ＤＥＶＩＣＥサービス機能は、指定されたコンポーネントを故障状態にする。
【０１４８】
相互接続ファブリック
概要
これは、より多くのデータの移動を可能にするので、本発明のファブリック取付け記憶装置モデルは、データ・コピーと割込み処理コストによる入出力性能問題に取り組まなくてはならない。データ・コピーと割込みと流れ制御の問題は、独自の組合せの方法によって本発明で取り扱われる。大抵のネットワークによって使われている宛て先ベースのアドレス指定モデルとは異なり、本発明は、データがファブリック上を伝送される前に送信側が宛て先側の目標バッファを選択する送信側ベースのアドレス指定モデルを使う。送信側ベースのモデルでは、宛て先側は、メッセージが送られる前にそのメッセージを送くることのできる宛て先アドレスのリストを送信側に送る。メッセージを送るために送信側は先ず、このリストから宛て先側バッファを選択する。これが可能であるのは、目標側アプリケーションは既に目標ネットワーク・ハードウエアによって使われるこれらのバッファのアドレスをＯＳに与えており、またしたがってネットワーク・ハードウエアはコピーなしでＤＭＡ操作を介してデータを直接正しい目標バッファに送り込むために十分な情報を与えられているという理由からである。
【０１４９】
幾つかの点では有益であるが、送信側ベースのアドレス指定には幾つかの問題がある。第一に、送信側ベースのアドレス指定は、送信側を含めて宛て先からファブリックに亘る保護領域を拡大することになり、一般的な分離の不足を作りだし、データの安全保護と完全性の問題を引き起こすことになる。純粋な送信側ベースのアドレス指定は、メモリ・アドレスを送信側に解放し、宛て先側が送信側を信頼することを要求しており、可用性の高いシステムにおける主要な問題となる。例えば宛て先ノードが宛て先アドレスのリストを送信側に与えた場合を考えてみる。送信側がこれらのアドレスをすべて使う前に、宛て先ノードがクラッシュし、それから再ブートする。さて送信側は、もはや有効でなくなったアドレス・バッファのセットを持っている。宛て先側はそれらのアドレスを別の目的に使っているかもしれない。それらのアドレスのどれかに送られたメッセージは、重要なデータが宛て先側で破壊されるといった重大な結果をもたらすかもしれない。
【０１５０】
第二に、送信側ベースのアドレス指定の実現は、データのＤＭＡを起動できる前にメッセージから宛て先アドレスを抽出するようにネットワークの協力を必要とするが、大抵のネットワーク・インタフェースはこのような動作をするようには設計されていない。
【０１５１】
必要とされるのは、送信側ベースのアドレス指定の利点を取り込んでこれらの問題を回避するアドレス指定モデルである。本発明は、ＢＹＮＥＴに基づいて相互接続ファブリックを使う独自の「ｐｕｔ  ｉｔ  ｔｈｅｒｅ：そこに置く」（ＰＩＴ）プロトコルを使用するハイブリッド・アドレス指定モデルによってこの問題を解決する。
【０１５２】
ＢＹＮＥＴおよびＢＹＮＥＴインタフェース
ＢＹＮＥＴは、本発明を実現するために有用な三つの重要な属性を持っている。
【０１５３】
第一に、ＢＹＮＥＴは本来、拡張可能である−接続の追加や帯域幅の追加が容易に導入でき、システム内のすべてのエンティティに直ちに利用可能である。これは、接続の追加の結果として帯域幅を追加しない他のバス指向の相互接続技術とは対照的である。他の相互接続に比較すると、ＢＹＮＥＴは、末広がり（単一のファブリックに接続可能なポートの数）による拡張だけでなく、末広がりで拡張する二分割帯域幅も持っている。
【０１５４】
第二に、ＢＹＮＥＴは、アクティブ・メッセージ相互接続であるようにソフトウエアによって改良できる−そのユーザ（すなわちコンピューティング資源１０２と記憶資源１０４）の指示の下でそれらの動作の混乱を最小限にしてノード間でデータを移動させることができる。これは、不必要な割込みと内部的なデータのコピーとを回避しながら、あらかじめ決められたメモリ・アドレスに直接データを移動させるためにＤＭＡを使用する。この基本的な手法は、データ・ブロックを更に大きな一つの相互接続メッセージ内に多重化することによって、より小さなデータ・ブロックの移動を最適化するように拡張することができる。個別のデータ・ブロックの各々は、相互接続利用を最適化する一方、ノードの動作効率の利点を保持しながら、ＤＭＡベースの手法の修正を使って処理することができる。
【０１５５】
第三に、ＢＹＮＥＴは複数のファブリックを備えるように構成できるので、トラヒック整形を使って更に相互接続を最適化することができる。これは本質的に、例えば長短のメッセージのランダムな組合せが使用頻度の高い共用チャネルで引き起こすことのある干渉を減らして、ある幾つかの相互接続チャネル（ファブリック）をある幾つかの種類のトラヒックに割り当てる、ＢＹＮＥＴソフトウエアによって提供される機構である。トラヒック整形は、ＢＹＮＥＴによって可能にされ、予測可能なトラヒック・パターンをユーザが選択できるようになる。
【０１５６】
図８は、ＢＹＮＥＴとそのホスト側インタフェース８０２の図を示す。ＢＹＮＥＴのホスト側インタフェース８０２は、回線が生成されたときは何時でもチャネル・プログラムを実行するプロセッサ８０４を含んでいる。チャネル・プログラムは、各ノードごとに送信側８０６インタフェースと宛て先側８０８インタフェースの両方においてこのプロセッサ８０４によって実行される。送信側インタフェース８０６ハードウエアは、回線の生成とデータの伝送と最終的な回線の機能停止とを制御するダウンコール時に生成されるチャネル・プログラムを実行する。宛て先側インタフェース８０８ハードウエアは、宛て先側のメモリにデータを送付しから回線を完了させるチャネル・プログラムを実行する。
【０１５７】
ＢＹＮＥＴは、コンピューティング・ノード２００とＩＯＮ２１２とを相互接続するネットワークを含んでおり、これらのノードはそのネットワーク内でプロセッサとして機能する。ＢＹＮＥＴは、入出力ポート８１４を持った複数のスイッチ・ノード８１０を含んでいる。スイッチ・ノード８１０は、ｇ（ｌｏｇｂＮ）個よりも多いスイッチ・ノード・ステージ８１２に配列されており、ここでｂはスイッチ・ノード入出力ポートの総数であり、Ｎはネットワーク入出力ポート８１６の総数であり、またｇ（ｘ）は引き数ｘよりも大きくない最小の整数を与えるシーリング（最高限度）関数である。したがってスイッチ・ノード８１０は、障害許容力を高め、競合を減らすために、いかなるネットワーク入力ポート８１６とネットワーク出力ポート８１６との間にも複数の経路を備えている。ＢＹＮＥＴはまた、メッセージの伝送を全ネットワーク中に向けるために、ネットワークの最も高いスイッチ・ノード・ステージに沿ってバウンスバック面８１８内に複数のバウンスバック点を含んでいる。バウンスバック点は、メッセージを受信プロセッサに向けるスイッチ・ノード８１０からネットワークを介して平衡メッセージをロードするスイッチ・ノード８１０間を論理的に区別する。
【０１５８】
コンピューティング・ノード２００、ＩＯＮ２１２といった、ノード内に実現されたプロセッサは、論理的に独立した、あらかじめ定義されたサブセットのプロセッサからなる一つ以上のスーパークラスタに分割できる。プロセッサ間の通信は、ポイントツーポイントでもマルチキャストでも可能である。マルチキャスト・モードの通信では単一のプロセッサが他のすべてのプロセッサまたはスーパークラスタに対してメッセージを同報することができる。異なるスーパークラスタ内のマルチキャスト・コマンドは、同時に発生し得る。送信側プロセッサは、順方向通信路を介して伝搬するそのマルチキャスト・コマンドをすべてのプロセッサあるいはすべてのプロセッサ・グループに送信する。マルチキャスト・メッセージは、引き続いてスーパークラスタ内のプロセッサに経路指定するためにネットワーク内のバウンスバック面のある特定のバウンスバック点に向けられる。これは、一度に特定のバウンスバック点を通るマルチキャスト・メッセージを一つだけ許し、異なるスーパークラスタに向かうマルチキャスト・メッセージが互いに干渉するのを防止するので、ネットワークのデッドロックを防止する。マルチキャスト・メッセージを受信したプロセッサは、例えば逆方向通信路を介して自分の現在状態を送信することによってそのメッセージに応答する。ＢＹＮＥＴは、種々の仕方でこれらの応答を結合するように機能することができる。
【０１５９】
ＢＹＮＥＴは現在、帯域内メッセージと帯域外メッセージという二つの基本的な型のメッセージをサポートしている。ＢＹＮＥＴ帯域内メッセージは、宛て先側ホストのメモリにあるカーネル・バッファ（一つまたは複数）内にメッセージを送付し、回線を完了し、アップコール割込みを通知する。ＢＹＮＥＴ帯域外メッセージによって回線メッセージ内のヘッダ・データは、ＢＹＮＥＴドライバ内の割込みハンドラに、受信している回線データの残り分を処理するために使われるチャネル・プログラムを生成させる。これら両方の型のメッセージに関して、チャネル・プログラムの成功あるいは失敗は、ＢＹＮＥＴ逆方向通信路上の小さなメッセージを介して送信側に返される。この逆方向通信路メッセージは、送信側のチャネル・プログラムによる回線の機能停止操作の一部として処理される。（逆方向通信路は、ＢＹＮＥＴ回線内の低帯域幅帰路である）。回線が機能停止した後に、新しいメッセージの到着を知らせるために宛て先側にアップコール割込みが（オプションで）通知される。
【０１６０】
ＢＹＮＥＴ帯域外メッセージの使用は、初めにチャネル・プログラムが生成され、それから実行されるのを送信側が待つことになるので、最適な構成ではない。ＢＹＮＥＴ帯域内メッセージは、送信側がアプリケーション・バッファを直接的に目標とすることを許さず、したがってデータ・コピーを必要とする。この問題を解決するために本発明は、独自の仕方でＢＹＮＥＴハードウエアを使う。データを処理するために必要とするチャネル・プログラムを宛て先側インタフェース８０８に生成させる代わりに、送信側インタフェース８０６が送信側と宛て先側両者のチャネル・プログラムを生成する。送信側チャネル・プログラムは宛て先側が実行するであろう非常に小さなチャネル・プログラムをメッセージの一部として転送する。このチャネル・プログラムは、宛て先側が目標アプリケーション・スレッドの所定の宛て先バッファの中にデータをどのようしてに移動させるべきかを記述している。
【０１６１】
送信側はこのメッセージが送付されることになっている宛て先スレッドを知っているので、この手法は宛て先側での従来型のアップコール処理の欠点の大部分を回避して、送信側がメッセージを送付すべき方法と場所の両方を制御するのを可能にする。この形式のＢＹＮＥＴメッセージは、有向帯域メッセージと呼ばれる。アクティブ・メッセージ・プロセス間通信モデルで使われるアクティブ・メッセージ（これは、宛て先側でメッセージを処理するために使われるデータと小さなメッセージ・ハンドラを含む）とは異なり、本発明は、ＢＹＮＥＴ入出力プロセッサが単純なチャネル・プログラムを実行する一方、通常ホストＣＰＵがアクティブ・メッセージでアクティブ・メッセージ・ハンドラを実行するＢＹＮＥＴ有向帯域メッセージを使用する。
【０１６２】
逆方向通信路の使用は、メッセージ送達完了を知らせる従来型割込み方法を送信側インタフェースが抑制することを可能にしている。帯域外メッセージと有向帯域メッセージの両者に関して、送信側での完了成功の表示は、メッセージが宛て先側メモリ内に確かに送付されたことを示すだけである。
【０１６３】
これは、宛て先ノードのメモリ空間内にメッセージが確かに移動したことを保証するが、宛て先側アプリケーションによるメッセージの処理を保証するものではない。例えば宛て先ノードは、機能的なメモリ・システムを持っているかもしれないが、宛て先側アプリケーション・スレッドにはメッセージの処理を妨げる障害があるかもしれない。本発明ではメッセージの信頼できる処理を取り扱うために、メッセージ処理の障害の検出と訂正の両方のために幾つかの方法を独立に採用している。本発明に関する通信プロトコルによれば、紛失メッセージを検出するために送信側でタイムアウトが使われる。再送信は、必要により発生しまた、ソフトウエア障害かハードウエア障害が検出された場合に回復動作を誘発することもできる。
【０１６４】
有向帯域メッセージによっても本発明は、宛て先側の所定の目標と、メッセージを正しい目標アプリケーション・スレッド・バッファに送るために十分なデータを送信側に与える機構とに対するメッセージ送付を可能にしなくてはならない。本発明は、チケット・ベースの認証方式によってこの芸当を達成している。チケットは、偽造できないデータ構造であって、持ち主に権利を与えるものである。本質的にチケットは、ある資源を一回使う許可または権利である。本発明ではＩＯＮ２１２は、チケットの分配によってコンピューティング・ノード２００に対するサービスの分配を制御できる。更にチケットは、所定の目標、送信側ベースの流れ制御モデルを実現するための必要な要件を指定する。
【０１６５】
「Ｐｕｔ  ｉｔ  Ｔｈｅｒｅ：そこに置く」（ＰＩＴ）プロトコル
概要
ＰＩＴプロトコルは、ＢＹＮＥＴ有向帯域メッセージ・プロトコルを使ってアクティブ・メッセージにチケットとデータ・ペイロードとを送るチケット・ベースの認証方式である。ＰＩＴプロトコルは、チケット・ベースの認証と送信側ベースのアドレス指定とクレジット／デビット（借方／貸方）流れ制御とゼロ・メモリ・コピーとアクティブ・メッセージとの一意的混合である。
【０１６６】
ＰＩＴメッセージ
図９は、ＰＩＴメッセージまたはパケット９０１の基本的特徴を示しており、これはペイロード・データ９０４を伴うＰＩＴヘッダ９０２を含んでいる。ＰＩＴヘッダ９０２は、目標データ・バッファの要約を表すＰＩＴ  ＩＤ９０６を含んでおり、また所定のサイズのピン留めされたバッファへのアクセス権を表す寿命の限られたチケットである。ＰＩＴ  ＩＤ９０６を所有するエレメントは、そのバッファを使う権利を有するエレメントであり、ＰＩＴバッファが使われたときにＰＩＴ  ＩＤ９０６は廃棄されなくてはならない。宛て先側がＰＩＴメッセージを受け取ると、ＰＩＴヘッダ内のＰＩＴＩＤ９０６は、ＤＭＡ操作によってペイロードが移されるべきＢＹＮＥＴハードウエアに対して目標バッファを指定する。
【０１６７】
ＰＩＴプロトコル下での流れ制御は、送信側ベースのアドレス指定を使うクレジット／デビット（借方／貸方）モデルである。ＰＩＴメッセージが送られると、これは送信側に対する流れ制御デビットと宛て先側に対する流れ制御クレジットとを表す。言い換えればもしある装置がＰＩＴ  ＩＤ９０６をあるスレッドに送ったとすると、そのスレッドはアドレス空間内のＰＩＴバッファをクレジット（信用貸し）される。もしその装置がＰＩＴ  ＩＤ９０６をそのその送信側に返却すれば、装置はその権利を放棄するか、ＰＩＴ  ＩＤ９０６によって指定されたバッファを解放するかどちらかをすることになる。ある装置がＰＩＴ  ＩＤ９０６によって抽出された宛て先バッファにメッセージを送ると、その装置はまたＰＩＴバッファに対するその権利を放棄する。装置がＰＩＴ  ＩＤ９０６を受信すると、それは送信側のアドレス空間内のＰＩＴバッファのためのクレジット（貸方）となる（そのＰＩＴ  ＩＤ９０６が、返却されている装置のＰＩＴ  ＩＤ９０６でなければ）。
【０１６８】
ヘッダ９０２の最上部には、ＰＩＴパケット９０１を処理するであろうＢＹＮＥＴチャネル・プログラム９０８（送信側と宛て先側）がある。次ぎに、クレジット（貸方）フィールド９１０とデビット（借方）フィールド９１２というＰＩＴ  ＩＤを送るための二つのフィールドがある。デビット・フィールド９１２は、ペイロード・データがチャネル・プログラムを介して宛て先側ネットワーク・インタフェースによって転送されるであろうＰＩＴ  ＩＤ９０６を含んでいる。ＰＩＴ  ＩＤ９０６が送信側アプリケーション・スレッドのためのデビット（宛て先側スレッドにおけるクレジット）であるから、これはデビット・フィールドと呼ばれる。クレジット・フィールド９１０は、送信側スレッドがＰＩＴバッファを宛て先側スレッドに転送するあるいはクレジット（信用貸し）するところである。クレジット・フィールド９１０は一般に、送信側スレッドが返却メッセージを送られると期待しているＰＩＴ  ＩＤ９０６を保持している。クレジットＰＩＴのこの使用法はまた、ＳＡＳＥ（ｓｅｌｆ−ａｄｄｒｅｓｓｅｄ  ｓｔａｍｐｅｄ  ｅｎｖｅｌｏｐｅ：自動アドレス指定型切手付き封筒）ＰＩＴとも呼ばれる。
【０１６９】
コマンド・フィールド９１４は、目標がペイロード・データ９０４について実行すべき操作（例えばディスク読取りまたは書込みコマンド）を記述している。引き数フィールド９１６は、このコマンドに関連するデータである（例えば読取りまたは書込み操作を実行すべきディスク上のディスクおよびブロック番号）。シーケンス番号９１８は、発信元ノードと宛て先ノードとの対の各々に関して一意である、単調に増加する整数である。（各ノード対は、各方向ごとに一つのシーケンス番号を持つ）。長さフィールド９２０は、ＰＩＴペイロード・データの長さをバイトで指定する。フラグ・フィールド９２２は、ＰＩＴメッセージの処理を修正する種々のフラグを含んでいる。一例は、複製メッセージ・フラグである。これは、一つのイベントの２回以上の処理を防止するために潜在的な紛失メッセージの再送信時に使われる。
【０１７０】
最初にシステムが起動するとき、ノードは、他のノードに関するＰＩＴ  ＩＤ９０６を持っていない。ＢＹＮＥＴソフトウエア・ドライバは、ＰＩＴ最初オープン・プロトコルが完了するまでは、いかなる有向帯域メッセージの送付も防止する。ＰＩＴ  ＩＤ９０６の分配は、コンピューティング・ノード２００上のアプリケーション・スレッドがＩＯＮ２１２上に配置された何らかの仮想ディスク装置のために最初オープンを行うときに開始される。最初オープンの期間中、ＩＯＮ２１２とコンピューティング・ノード２００とは、操作パラメータが交換される折衝の段階に入る。最初オープン・プロトコルの一部は、ＰＩＴ  ＩＤ９０６の交換である。ＰＩＴ  ＩＤ９０６は、インタフェースが送信側でのＤＭＡ収集と宛て先側でのＤＭＡ分散の両方をサポートするので、二つ以上のバッファを指示できる。このアプリケーションは、他のいかなるノード上のいかなるアプリケーションへもＰＩＴ  ＩＤ９０６を自由に配布することができる。
【０１７１】
このコンピューティング・ノード２００とＩＯＮ２１２との間で交換されるべきＰＩＴバッファのサイズと数は、調整可能な値である。デビット（借方）およびクレジット（貸方）ＰＩＴ  ＩＤ９０６（デビット・フィールド９１２とクレジット・フィールド９１０内のＰＩＴ  ＩＤ９０６）の交換は、システムに関する流れ制御モデルの基礎を形成する。送信側は、クレジット（信用貸し）されたＰＩＴ  ＩＤ９０６が存在するだけ多くのメッセージを宛て先側に送ることができる。これは、所定のホストが送ることのできるメッセージの数を制限する。これはまた、各ノードがそれ自身のＰＩＴ  ＩＤ９０６のプールを持っているので、各送信側はそれに割り当てられたＰＩＴ  ＩＤ９０６をせいぜい使い切ることができると言うことにおいて公平さを保証している。
【０１７２】
ＩＯＮ２１２は、それがコンピューティング・ノード２００に発行したＰＩＴチケットのプールを制御する。コンピューティング・ノード２００に対するＰＩＴ  ＩＤ９０６の初期割当ては、最初オープン・プロトコルの時に発生する。配布されるＰＩＴ  ＩＤ９０６の数は、一時にＩＯＮ２１２とＩＯＮ２１２内のメモリ資源とを使う同時にアクティブなコンピューティング・ノード２００の数の推定値に基づいている。これは単に推定値であるから、ＰＩＴプールのサイズは、動作中にＩＯＮ２１２によって動的に調整することもできる。ＰＩＴ資源のこの再配分は、多数のコンピューティング・ノード２００からの要求をサービスする際の公平さを保証するために必要である。
【０１７３】
アクティブなコンピューティング・ノード２００のためのＰＩＴ再割当ては、下記のように進められる。アクティブなコンピューティング・ノード２００は絶えず入出力要求を行っているから、ＰＩＴ資源は完了した入出力要求内のＰＩＴクレジットの流れを制御することによってアクティブなコンピューティング・ノード２００に再配分される。適当なレベルに達するまではＰＩＴクレジットはＩＯＮ２１２完了によって送られることはない（そのコンピューティング・ノード２００に関するＰＩＴプールを減らして）。既にＰＩＴ割当てを持っているがアクティブでない（そして資源を拘束している）コンピューティング・ノード２００に関しては、更に困難な状況が示される。
【０１７４】
このような場合にＩＯＮ２１２は、ＰＩＴ（またはＰＩＴ  ＩＤのリスト）を無効にするメッセージを各遊休コンピューティング・ノード２００に送ることができる。もし遊休コンピューティング・ノード２００が応答しなければ、ＩＯＮ２１２はそのノードに関するＰＩＴ  ＩＤをすべて無効にして、それらのＰＩＴ  ＩＤを他のコンピューティング・ノード２００に再配分することができる。遊休コンピューティング・ノード２００が再割当てされたＰＩＴを使おうとすると、そのコンピューティング・ノード２００は、最初オープン・プロトコルに強制的に戻される。
【０１７５】
コンピューティング・ノード２００へのＰＩＴ割当てを増やすことは、下記のようにして達成される。新たに割り当てられたＰＩＴ  ＩＤを何処かのコンピューティング・ノードに送るために、ＰＩＴ割当てメッセージを使うことができる。代替手法は、各入出力完了メッセージ内に二つ以上のＰＩＴクレジットを送ることであろう。
【０１７６】
動作時のＰＩＴプロトコル−ディスクの読取りと書込み
ＰＩＴプロトコルを説明するために、ＩＯＮ２１２からの記憶ディスク２２４読取り操作に関するコンピューティング・ノード２００要求の論議を示す。ここでは、最初オープンは既に行われていて、コンピューティング・ノード２００とＩＯＮ２１２の両者には十分な数の空きＰＩＴバッファが存在していると仮定する。アプリケーション・スレッドは、ディスクのデータがコンピューティング・ノードのハイレベルＳＣＳＩドライバ（ＣＮシステム・ドライバ）に転送されることになっているバッファのアドレスを渡す、読取りシステム呼出しを実行する。
【０１７７】
ＣＮシステム・ドライバは、この要求を含むＰＩＴパケット（仮想ディスク名とブロック番号とデータ長とを含む）を作成する。それからＣＮシステム・ドライバの上半分は、デビットおよびクレジットＰＩＴ  ＩＤフィールド９１０、９１２に記入する。デビットＰＩＴフィールド９１２は、この読取り要求が送られつつある宛て先側ＩＯＮ２１２上のＰＩＴ  ＩＤ９０６である。これは読取り要求であるから、ＩＯＮ２１２は、入出力完了パケットを作成するときにアプリケーションのバッファ（読取りシステム呼出しの一部として提供されるもの）を指定する方法を必要とする。
【０１７８】
ＰＩＴパケットは送信ベースのアドレス指定を使うので、ＩＯＮ２１２は、ＰＩＴ  ＩＤ９０６を持っている場合だけアプリケーション・バッファをアドレス指定できる。アプリケーション・バッファは通常のＰＩＴプールの一部ではないので、このバッファはメモリ内にピン留めされ、このバッファのためにＰＩＴ  ＩＤ９０６が生成される。読取り要求もまたディスク操作から返却状態を要求するので、返却状態を含むためのＰＩＴ用の分散バッファが生成される。このＳＡＳＥ  ＰＩＴは、読み取られたＰＩＴパケットの一部としてクレジット・フィールド内に送られる。それからこのＰＩＴパケットは、送出待ち行列の上に置かれる。ＢＹＮＥＴインタフェース８０２がこのＰＩＴパケットを送出すると、これはＤＭＡ操作によって送信側からこのＰＩＴパケット移動させ、それから相互接続ファブリック１０６に亘って転送する。
【０１７９】
宛て先側ＢＹＮＥＴインタフェース８０８では、このＰＩＴパケットが到着すると、これがＢＹＮＥＴチャネル・プロセッサ８０４によるＰＩＴチャネル・プログラムの実行を誘発する。ホスト側インタフェース８０２のＢＹＮＥＴチャネル・プロセッサ８０４は、ＩＯＮ２１２上の端点を突き止めるためにデビットＰＩＴ  ＩＤ９０６を抽出する。チャネル・プログラムは、バッファ・アドレスを抽出し、ペイロード・データを直接ＰＩＴバッファ内に移動させるようにインタフェースＤＭＡエンジンをプログラムする−こうしてＰＩＴプロトコルがゼロ・コピー意味論を備えることを可能にする。ＢＹＮＥＴインタフェース８０２は、ＩＯＮ２１２上の受信アプリケーションに割込みを通知する。
【０１８０】
コンピューティング・ノード２００には、割込みは発生しない。逆方向通信路メッセージが転送の失敗を示すときは、その失敗の理由によって入出力が再試行される。何回かの試みの後でＩＯＮ２１２誤り状態になり（詳細には本書のＩＯＮ２１２の回復操作と失敗操作を参照のこと）、またコンピューティング・ノード２００は、ダイポールの一方の兄弟ＩＯＮ２１４によってその要求を処理してもらうことができる。もしメッセージが確かに宛て先ノードのメモリ内に送り込まれたのであれば、ホスト側ではＩＯＮ２１２がそのメッセージを首尾よく処理することを保証するために再送信タイムアウト（最悪ケースの入出力サービス時間よりも長い）を設定する。このタイマーが終了すると、ＰＩＴメッセージはコンピューティング・ノードによってＩＯＮ２１２に再送される。もし入出力が未だ進行中であれば、複製の要求は単に打ち切られるが、そうでなければ再送された要求は正常に処理される。
【０１８１】
図１０は、ＩＯＮ２１２の機能モジュールのブロック図である。ＩＯＮ２１２、２１４への入力はデータ線１００２、１００４と制御線１００６である。ＩＯＮ２１２内の各モジュールは、制御線１００６と接続されている制御モジュール１００８を含んでいる。制御モジュール１００８は、データ線１００２からコマンドを受け入れ、またモジュール制御機能を備える。システム機能モジュール１０１０は、ここに述べたＩＯＮ機能を実現している。ＩＯＮ２１２、２１４は、ファブリック・モジュール１０２０とキャッシュ・モジュール１０１４とデータ障害許容力モジュール１０１６と記憶モジュール１０１８とを含んでいる。これらのモジュールの各々は、制御モジュールと、データ線１００２、１００４からのデータを挿入し、検索するための作業負荷インジェクタ（注入器）１０２０と、データの通過を禁止するデータ・フェンス１０２２とを含んでいる。
【０１８２】
ＰＩＴ読取り要求がＩＯＮ２１２に送られると、ＩＯＮキャッシュ・モジュール１０１４の作業負荷インジェクタに転送される。作業負荷インジェクタは、その要求がキャッシュされていれば、直接そのデータを返すことのできるＩＯＮキャッシュ・モジュール１０１４に要求を挿入し、あるいはそのデータ用のバッファを割り当ててそれをＩＯＮ記憶モジュール１０１８に渡す。ＩＯＮ記憶システム・モジュール１０１８は、この要求を一つ（以上）の物理ディスク要求に変換して、その要求を適当なディスク駆動機構２２４に送る。ディスク読取り動作が完了すると、ディスク制御部はディスク読取りの完了を知らせるために割込みを通知する。ＩＯＮ作業負荷インジェクタは、入出力完了ＰＴパケットを生成する。
【０１８３】
デビットＰＩＴ  ＩＤ（デビット・フィールド９１２内に格納されている）は、読取り要求内のＳＡＳＥ  ＰＩＴ（これはアプリケーションがディスクのデータを置きたいと思っている場所である）からのクレジットＰＩＴ  ＩＤ（クレジット・フィールド９１０内に格納されている）である。クレジットＰＩＴ  ＩＤは、コンピューティング・ノード２００がこの要求を送った同じＰＩＴ  ＩＤであるか、そのバッファが空いていなければ交替のＰＩＴ  ＩＤであるかのいずれかである。このクレジットＰＩＴは、将来の要求を送るためのコンピューティング・ノード・クレジットを与えるであろう（この現在のＰＩＴ要求は、ちょうど完了したところなので、このＩＯＮ２１２に対するこのコンピューティング・ノード２００のための待ち行列の深さを１だけ増加させる）。
【０１８４】
ＰＩＴを処理した後でＩＯＮ２１２がＰＩＴクレジットを返さない理由は三つある。第一は、ＩＯＮ２１２はそのコンピューティング・ノード２００からの待ち行列に入れられている未解決の要求の数を減らしたいと思っていることである。第二の理由は、ＩＯＮ２１２はそのＰＩＴクレジットを他のコンピューティング・ノード２００に再配分したいと思っていることである。第三の理由は、単一のＰＩＴパケットに入れられた多数の要求があるかもしれないと言うことである（本書のスーパーＰＩＴパケットの論議を参照のこと）。
【０１８５】
コマンド・フィールド９１４は、読取り完了メッセージであって、引き数は、ディスク駆動機構読取り操作からの返却コードである。それからこのＰＩＴパケットは、コンピューティング・ノード２００に送り返されるためにＢＹＮＥＴインタフェース７０２への待ち行列に入れられる。それからＢＹＮＥＴハードウエアは、このＰＩＴパケットをＤＭＡを介してコンピューティング・ノード２００に移動させる。これは、目標ＰＩＴバッファ（この場合はアプリケーションのピン留めされたバッファ）へのＤＭＡを起動する前にコンピューティング・ノード２００ＢＹＮＥＴチャネル・プログラムがデビットＰＩＴ  ＩＤ９１２を抽出して検証することを誘発する。ＤＭＡが完了すると、コンピューティング・ノード２００ＢＹＮＥＴハードウエアは、ディスク読取りが完了したことをアプリケーションに知らせる割込みを誘発する。ＩＯＮ２１２上でＢＹＮＥＴドライバは、バッファをキャッシュ・システムに返却する。
【０１８６】
書込み要求のために行われた操作は、読取り操作のために行われた操作と類似している。アプリケーションは、コンピューティング・ノード・ハイレベル・ドライバを呼出し、データと仮想ディスク名とディスク・ブロック番号とデータ長とを含むアドレスを渡す。コンピューティング・ノード・ハイレベル・ドライバは、宛て先ＩＯＮ２１２上のＰＩＴ  ＩＤ９０６を選択して、このデータを使ってＰＩＴ書込み要求を生成する。ＳＡＳＥ  ＰＩＴは、ＩＯＮ２１２からの書込み操作の返却状態のみを含むであろう。ＩＯＮ２１２では、ＰＩＴパケットが到着したとき割込みが通知される。
【０１８７】
この要求は、ＰＩＴ読取り動作と同じように処理される。書込み要求は、最終的にデータをディスクに書き込むキャッシュ・ルーチンに渡される。ディスク書込みが完了すると（あるいはデータがＩＯＮ２１２、２１４の両者の書込みキャッシュ内に安全に記憶されると）、入出力完了メッセージがコンピューティング・ノード２００に送り返される。ＩＯＮ２１２が書込みキャッシュ動作可能状態で走行しているとき、その要求が送られたそのＩＯＮ２１２よりもむしろ、ダイポール内のもう一方のＩＯＮ２１４が、入出力完了メッセージを返す。これは、バーミューダ・トライアングル・プロトコルに関して本書で更に詳しく説明する。
【０１８８】
古くなったＰＩＴ  ＩＤと障害回復問題
最初オープン時のＰＩＴ  ＩＤの交換は、ハードウエア障害またはソフトウエア障害のいずれかによって生成された、古くなったＰＩＴ  ＩＤ９０６を無効にする機構である。ＩＯＮ２１２とコンピューティング・ノード２００がＰＩＴ  ＩＤを交換して、突然そのＩＯＮ２１２がクラッシュした状況を考えてみる。ＰＩＴ  ＩＤ９０６は、メモリ内にピン留めされた目標バッファを表しており、無効にされなければ、再ブートしたばかりのＩＯＮ２１２かコンピューティング・ノード２００かいずれかに関する未解決ＰＩＴ  ＩＤ９０６は、もはや有効でないあるいは古くなったＰＩＴ  ＩＤのせいで重大なソフトウエア完全性問題を引き起こすであろう。ＢＹＮＥＴハードウエアと有向帯域メッセージ・サポートとは、古くなったＰＩＴ  ＩＤ９０６を無効にするための重要な機構を提供する。
【０１８９】
ＰＩＴプロトコルは、ＢＹＮＥＴ上の２つのノード間で確実に実行可能とされなければばらない。一般的に、ＰＩＴの許可は、ＩＯＮ２１２と兄弟ＩＯＮ２１４間の処理を行う一日の初め（ＳＯＤ）に、あるいはブート以来初めてコンピューティング・ノード２００が特殊ＩＯＮ  ２１２上のいずれかのＶＳＩにアクセスする時に実行される。２つのノード（例えば、ＡノードとＢノード）間のＰＩＴプロトコルを実行可能にする方法は、（１）  ノードＢにＰＩＴ接続要求をノードＢに発行するノード（ノードＡ）を初期化するステップ、（２）  ノードＡとノードＢ間のＰＩＴ  ＩＤを交換するステップ、（３）ＢＹＮＥＴがメッセージ伝送群を可能とするノード（ここでは、ノードＡ）をＶＳＩＰドライバが初期化するステップ、（４）ノードＢ上のＶＳＩＰドライバがＢＹＮＥＴがバンド・メッセージ伝送を可能としノードＡからの管理バンド・メッセージ伝送を可能とするステップを含む。
【０１９０】
受信ノード（ノードＢ）はＢＹＮＥＴ上のどのノードがＰＩＴパケットをそれに送れるについて完全な制御を行う。送信ノードからの管理バンド転送がブート以来受信ノードによって実行可能とならなければ、受信ノード（ノードＢ）へのＰＩＴ伝送は失敗するだろう。結果、ノードが故障し再ブートすると、故障以前に交換され、遠隔ノードによて保持されている、故障したノードのＰＩＤ  ＩＤは自動的に無効となる。何故なら、管理バンド伝送不能だからである。ＰＩＴプロトコルが実行可能となるまで、いずれの失効ＰＩＴの配送から、これにより保護する。
【０１９１】
スーパーＰＩＴ（ＳＰＩＴ）−小さな入出力性能の改善
ＰＩＴプロトコルは、通常のＳＣＳＩコマンドよりも優れた点を持っている。本発明の核心は、記憶装置ネットワークではなく通信ネットワークであるから、記憶装置モデルが許すものに対する性能改善のためにネットワーク・プロトコルを使うことができる。アップコール処理のオーバーヘッドの処理は、小さな入出力要求が優位を占めている作業負荷に関して性能の壁を表している。小さな入出力の性能を改善するための手法は、幾つかある。
【０１９２】
一つの手法は、割込み処理符号の経路長を改善することである。第二は、デバイス・ドライバに採用されている手法に類似の手法を使って、多数の割込みの方向指示を割込みハンドラーの単一の呼出しの中に折り込むことである。第三は、個別の入出力操作の回数を減らしてそれらを単一の要求にクラスター化する（あるいはコンボイする）ことである。
【０１９３】
発信元と宛て先との物理リンク上の異なるＭＴＵサイズのために着信と送出のデータの流れを再パッケージングしなければならないノードは、データを集める傾向がある。この問題は、送信側ネットワークと宛て先側ネットワークとの間の速度の不整合によって（特に宛て先側ネットワークの方が遅い場合）、更に悪くなる。これらのノードは、宛て先側からの流れ制御を絶えず受けている。その結果、トラヒックはルーターからバーストになって流れ出ることになる。これは、データ・コンボイと呼ばれる。
【０１９４】
本発明は、ＩＯＮ２１２とコンピューティング・ノード２００の両者におけるアップコール発生による割込みの回数を減らすための手法としてデータ・コンボイを利用している。説明のために、ＩＯＮ２１２からコンピューティング・ノード２００へのデータ流れを考える。本発明によって使われる流れ制御に関するデビット／クレジット・モデルでは入出力要求は、コンピューティング・ノード２００とＩＯＮ２１２の両者において待ち行列に入る。待機は、ＩＯＮ２１２に格納されたＰＩＴパケットで始まり、それが枯渇すると待機はコンピューティング・ノード２００に戻って続けられる。これは、オーバーフロー状態と呼ばれる。
【０１９５】
通常、オーバーフローは、ノードがＰＩＴバッファ・クレジットよりも多くの要求を持っているときに発生する。入出力が完了する度毎にＩＯＮ２１２は完了メッセージをコンピューティング・ノード２００に送り返す。通常この完了メッセージは、いま解放されたばかりのＰＩＴバッファ資源に関するクレジットを含んでいる。これは、デビット／クレジット流れ制御の基礎である。システムが入出力要求で渋滞すると、各入出力完了は直ちに、ＩＯＮ２１２における新しい入出力要求に置き換えられる。したがって負荷の大きいときには、入出力要求は一度の一つずつＩＯＮ２１２に流れて、指定されていない期間、ＩＯＮ２１２内で待機する。これらの要求の各々は、ＩＯＮ２１２の負荷を増加させるアップコール割込みを発生させる。
【０１９６】
この二重待ち行列モデルは、多くの利点を持っている。コンピューティング・ノード２１２に割り当てられたＰＩＴバッファの数は、慎重なトレードオフである。要求が完了したとき新しい仕事を素早くディスパッチできるように、ＩＯＮ２１２にはローカルに待機している十分な仕事負荷が存在がしているべきである。しかしながらＩＯＮ２１２上に待機している要求によって消費されるメモリ資源は、キャッシュ・システムに割り当てられれば更によく利用できる。ＩＯＮ２１２上のＰＩＴ待ち行列がメモリを節約するために短時間だけ保持されるとき、ＩＯＮ２１２が遊休状態になると性能は低下して、仕事がコンピューティング・ノード２００から送られてくるのを待たなくてはならない。
【０１９７】
スーパーＰＩＴは、アップコール割込みの回数を減らすために高い負荷のデビット／クレジット・システムの流れ制御を利用するように設計されたＰＩＴプロトコルの一形態である。スーパーＰＩＴは、ＯＬＴＰの性能を改善し、また比較的小さな入出力の高い割合によって支配される同様な仕事負荷を改善する。一度に一つずつ要求を送る代わりに、スーパーＰＩＴパケットは、単一の、大きなスーパーＰＩＴ要求ですべて送付される入出力要求の集まりである。各スーパーＰＩＴパケットは、通常のＰＩＴバッファと同じように搬送される。それから、スーパーＰＩＴパケット内に含まれる個別の入出力要求は、抽出されて、ＩＯＮ２１２資源が利用可能になると、ＰＩＴ仕事負荷インジェクタによって通常のＩＯＮ２１２待ち行列機構の中に挿入される。これら個別の入出力要求は、読取り要求か書込み要求かどちらでもよい。
【０１９８】
ＰＩＴ仕事負荷インジェクタは、ＩＯＮ２１２に送られたアプリケーション要求のローカルな代理として（ＩＯＮ２１２上で）動作する。ＰＩＴ仕事負荷インジェクタは、後のセクションで論じられるＲＴ−ＰＩＴプロトコルとＦＲＡＧ−ＰＩＴプロトコルとによっても使われる。スーパーＰＩＴが個別の要求を使い切ると、資源はコンピューティング・ノードに解放され、それと交換するために別のスーパーＰＩＴパケットを送ることができる。１ホスト当たりに許されるスーパーＰＩＴパケットの数は、最初オープン折衝で決定されるであろう。ＩＯＮ２１２上で待機する仕事の量は、別のスーパーＰＩＴパケットが送付できるまでそのＩＯＮ２１２を動作中にしておくのに十分でなければならないことは明らかである。
【０１９９】
コンピューティング・ノード２００がＩＯＮ２１２内の十分な仕事がＰＩＴクレジットを使い切るのを待っていて、ローカルに要求を待ちはじめたと言う状況を考えてみる。スーパーＰＩＴ要求内で待機している要求の数は、そのスーパーＰＩＴが送られるバッファのサイズによってだけ制限される。スーパーＰＩＴパケットは、通常のＰＩＴパケットとは異なる動作をする。本発明の制御モデルでは、もしユーザが宛て先に関するクレジットを持っている場合、装置は要求（デビット）だけを送ることができる。装置はＩＯＮ２１２内の特定のアプリケーション・スレッドを目標にしているわけではないので、その装置によって使われた特定のＰＩＴパケットは、特に重要ではない。ＩＯＮ２１２に対するＰＩＴパケットは、単にバッファ利用（および副作用として流れ制御）を規制するだけである。これに対してＰＩＴ要求内のＳＡＳＥ  ＰＩＴは異なる。
【０２００】
ＳＡＳＥ  ＰＩＴ  ＩＤは、コンピューティング・ノード２１２内の個別スレッドのアドレス空間を表す。スーパーＰＩＴ内の各要求は、ＳＡＳＥ  ＰＩＴを含んでいるが、それらが表す入出力が完了すると、作成された入出力完了メッセージはクレジットＰＩＴを含まない。スーパーＰＩＴがすべての要求を使い切ったときだけそのアドレス空間にクレジットＰＩＴが発行される。
【０２０１】
コンピューティング・ノード２００上でのスーパーＰＩＴの生成は、下記に述べるように行われる。単一のＩＯＮ２１２に対する入出力要求がコンピューティング・ノード２００内に二つ以上待機しているときは何時でも、スーパーＰＩＴを生成することができる。もしそのコンピューティング・ノード２００に関するスーパーＰＩＴパケットの限界が既にこのＩＯＮ２１２上で到達されていた場合、コンピューティング・ノード２００は、スーパーＰＩＴ  ＩＤが返却されるまで要求を待ち行列に入れつづけるであろう。それからこのコンピューティング・ノード２００は別のスーパーＰＩＴメッセージを発行する。システム・ドライバ内では、一旦待機が始まるとＩＯＮごとの待ち行列がスーパーＰＩＴパケットを生成するように要求されるであろう。
【０２０２】
前に論じたように、スーパーＰＩＴメッセージは、大量の小さな入出力要求によって占められている仕事負荷の下でＩＯＮ２１２上の処理負荷を減らすことができる。スーパーＰＩＴメッセージは、宛て先ノードの性能を改善し、また平均メッセージ・サイズの増加によって相互接続ファブリック１０６の利用を改善する。しかしながらスーパーＰＩＴメッセージのコンセプトは同様に、小さな入出力仕事負荷によって作り出されるコンピューティング・ノード２００上の負荷を減らすためにＩＯＮ２１２で応用することもできる。ＩＯＮ２１２上にスーパーＰＩＴメッセージを作成することは、コンピューティング・ノード２００上にそれらを作成することとは全く異なる問題である。
【０２０３】
コンピューティング・ノード２００上では、入出力要求を作成するアプリケーション・スレッドは、ＩＯＮ２１２が圧倒されるのを防止するために流れ制御を受けている。ディスク・サブシステムのサービス速度は、ＩＯＮ２１２のそれ以外のものよりも遙かに遅く、常にＩＯＮ２１２性能の究極の限界になるであろう。要求は、要求を待ち行列にいれて最後にはその要求に応えるために十分な資源をＩＯＮ２１２が持つまでは、システムに入らないように阻止される。
【０２０４】
要点は、資源がＩＯＮ２１２上で利用可能になるまで要求はコンピューティング・ノード上で待機するであろう（あるいはアプリケーションは阻止されるであろう）と言うことである。資源不足は、コンピューティング・ノード２００上では問題にはならない。コンピューティング・ノード２００アプリケーションが入出力要求をシステムに出すとき、その要求の一部として、入出力を完了させるために必要とされるコンピューティング・ノード２００メモリ資源（アプリケーション・スレッド・バッファ）が含まれている。ＩＯＮ２１２がコンピューティング・ノード２００に送るために必要とするすべての入出力完了メッセージに関して、このノードは既に割り当てられたＰＩＴ  ＩＤ（ＳＡＳＥ  ＰＩＴ  ＩＤ）を持っている。
【０２０５】
ＩＯＮ２１２の観点から見れば、入出力完了メッセージは既に割り当てられた目標バッファを持っており、データが準備され次第すぐに満たすことができる。入出力完了メッセージは、一旦送付されれば成功である（ＩＯＮ２１２は、コンピューティング・ノードでのディスク記憶システムのサービス時間を待つ必要はない）。したがってＩＯＮ２１２は、コンピューティング・ノードからの流れ制御圧力によって阻止できない。スーパーＰＩＴメッセージを作成するためにコンピューティング・ノードは、ＩＯＮ２１２が持っていないオプションである流れ制御待機を利用した。ＩＯＮ２１２はＢＹＮＥＴへのアクセス以外に待つべき資源を持たないので、スーパーＰＩＴメッセージを作成する機会は、遙かに小さくなる。
【０２０６】
ＩＯＮ２１２上にスーパーＰＩＴメッセージを作成するために幾つかの手法が採用できる。一つの手法は、スーパーＰＩＴパケットを作成する機会を増やすために入出力完了要求を僅かに遅らせることである。もし僅かの遅延の後に同一ノードのための新しい完了メッセージが用意されなければ、そのメッセージは正常なＰＩＴメッセージとして送られる。この手法の問題は、スーパーＰＩＴを作成すること（コンピューティング・ノード上でのアップコール・オーバーヘッドを減らすこと）を期待して要求を遅らせた時間の量が幾らであっても、それに対応する全体の要求サービス時間の増加があると言うことである。
【０２０７】
正味の効果は、コンピューティング・ノード２００の負荷の減少分であるが、アプリケーションを遅くする可能性もある。適応的な遅延時間が有益であろう（コンピューティング・ノード２００に対する平均サービス速度と所定の要求によって累積される総サービス時間とによって）。第二の手法は、第一の僅かな変形である。これは、各コンピューティング・ノード２００がそのコンピューティング・ノードにおける小さな入出力の速度が増加するに従って増加する遅延時間を各ＩＯＮ２１２に与えることを要求するであろう。
【０２０８】
要点は、必要な場合に特定のＩＯＮ２１２に関するスーパーＰＩＴメッセージを作成するためのウィンドウを大きくすることである。第三の手法は、キャッシュによって直接サービスされて記憶２２４ディスク操作を待つことに関係しない小さな読取りまたは書込みといった、ある幾つかの型のトラヒックを遅延させることであろう。キャッシュは、あるパーセンテージの要求のためのディスク・トラヒックを回避することによって平均入出力待ち時間を減らすが、待ち時間の分布はキャッシュ・ヒットによって変わる。
【０２０９】
キャッシュ・ヒット要求のための僅かな待機遅延時間は、ディスク操作を含む遅延時間と比較してサービス時間の主要な増加とはならないであろう。サービス時間の分布に敏感なアプリケーションに関しては（均一な応答時間が性能にとって重要である場合）、ＩＯＮ２１２上でスーパーＰＩＴパケットを作成するための僅かな遅延は、全体的なシステム性能を改善する可能性を持っている。
【０２１０】
大ブロック・サポートと断片化ＰＩＴパケット
データベース・アプリケーションに関する性能要件は、データベースの大きさとは無関係であることが多い。データベースのサイズが大きくなるにしたがって、ディスク記憶装置が調べられる速度もまた、アプリケーション性能の劣化を防止するために比例的に増加しなくてはならない。言い換えればサイズの成長する顧客データベースに関しては、応答時間は所定の問合せについて一定に留まらなくてはならない。これらの要件を満たすことの困難さは、ディスク駆動技術の現在の傾向と直接矛盾していることである。
【０２１１】
ディスク駆動機構は、容量は増加しつつあるが、ランダムな入出力性能は一定のままに留まっている。この傾向を緩和する一つの手法は、ディスク駆動機構の容量の増加につれてディスク入出力操作の平均サイズを大きくすることである。記憶容量の現在の傾向と性能要件とに基づいて、２４ＫＢという平均入出力サイズは、極く近い将来に１２８ＫＢに増えるかも知れない。更に積極的なキャッシング手法と遅延書込み手法も、多くの仕事負荷にとって有益であることが分かるかもしれない。ディスク駆動機構における不均一な技術進歩が、入出力要求サイズの増大の蔭の唯一の推進要因ではない。ＢＬＯＢＳ（ｂｉｎａｒｙ  ｌａｒｇｅ  ｏｂｊｅｃｔｓ：大きな２進オブジェクト）を有するデータベースがポピュラーになり始めるにつれて、１ＭＢ以上に達するサイズのオブジェクトが更に一般的になりつつある。この特定の原因とは無関係に、システムはディスク記憶装置の経済性の追求を続けさせるサイズの大きな入出力オブジェクトをサポートする必要があるであろうということが予想される。
【０２１２】
ＰＩＴプロトコルを使用するＩＯＮ２１２とコンピューティング・ノード２００との間の大きなデータ・オブジェクトの伝送に関連して、幾つかの問題がある。ここに述べたように、ＰＩＴプロトコルの利点は、流れ制御と端点探索の問題に取り組むための宛て先側バッファの事前割当てである。しかしながらアップコール意味論もまた、メッセージを置く十分なバッファ領域の識別（または割当て）を必要とする。ＰＩＴプロトコルは、受信側で各メッセージが置かれるべき目標ＰＩＴ  ＩＤ９０６を送信側に選択させることによってこの問題に対処している。
【０２１３】
メッセージ・サイズは、利用可能プールから所定のＰＩＴ  ＩＤ９０６を選択するための基準になるであろうから、大きな入出力書込みがプロトコルを複雑にすることは明らかである。負荷の大きい間は、送信側は利用可能なＰＩＴ  ＩＤ９０６クレジットを所有しているが、そのうちのどれも大きな入出力要求に関するバッファ・サイズ要件を満たしていないといった状況の可能性が存在する。ＰＩＴプロトコルの下では、もし送るべきデータ・サイズの幅広い母集団が存在する場合、送信側はＰＩＴバッファの数とサイズの両方を管理するために受信側と一緒に働かなければならない。
【０２１４】
これは、ＰＩＴバッファ割当てサイズ問題を作りだす。すなわちＰＩＴバッファのプールを作成するときに、所定の仕事負荷の下でのＰＩＴバッファのプールに関するバッファ・サイズの適切な配分とはいかなるものであるか？ＢＹＮＥＴソフトウエアは、書込みに加えて大きな入出力読取りを複雑にする限界を追加の最大トランスファ・ユニット（ＭＴＵ）に賦課する。ＢＹＮＥＴ  ＭＴＵを超える入出力要求（読取りと書込みの両方）は、送信側でソフトウエア・プロトコル（この場合はＰＩＴプロトコル）によって断片化され、宛て先側で再組立てされなくてはならない。これは、メモリ断片化の問題を作りだす。
【０２１５】
つまり内部的断片化は、割り当てられたバッファ内の領域を浪費することになる。外部的断片化は、どんな要求でも満足させるというには小さすぎる割当て済みのバッファの外側の領域を浪費する。一つの解は、大きなＰＩＴバッファの一部だけを使うことであろうが、これはもし大きなＰＩＴバッファが使われると、不必要な内部的断片化を引き起こすことになる。大きなＰＩＴバッファは、コスト・パフォーマンスを悪くするメモリを浪費する。
【０２１６】
本発明ではＢＹＮＥＴ  ＭＴＵおよびＰＩＴバッファ・サイズ割当て問題は、二つ以上の型のＰＩＴメッセージ、すなわちＲＴ−ＰＩＴ（往復旅行ＰＩＴ）とＦＲＡＧ−ＰＩＴ（断片化ＰＩＴ）とを追加することによって解決される。ＲＴ−ＰＩＴとＦＲＡＧ−ＰＩＴの両者は、ＰＩＴデータ・プッシュ・モデルの代わりにデータ・プル・モデルを使う。（データを押すためには、送信側がデータを宛て先側に押す。データを引くためには、宛て先側が送信元からデータを引く）。ＦＲＡＧ−ＰＩＴメッセージは、大きなデータ読取りをサポートするように設計されているが、ＲＴ−ＰＩＴメッセージは大きなデータ書込みをサポートする。ＦＲＡＧ−ＰＩＴとＲＴ−ＰＩＴは両者とも、ＩＯＮ  ＰＩＴ仕事負荷インジェクタを使ってデータの流れを管理するのでスーパーＰＩＴに似ている。
【０２１７】
ＲＴ−ＰＩＴメッセージ
コンピューティング・ノード２００がＩＯＮ２１２に対して大きなディスク書込み操作を行いたいと思い、そしてその入出力書込みがＢＹＮＥＴ  ＭＴＵあるいは利用可能なＩＯＮ２１２ＰＩＴバッファのどちらよりも大きい場合は、このコンピューティング・ノード２００はＲＴ−ＰＩＴ作成メッセージを作成するであろう。ＲＴ−ＰＩＴメッセージは、ブースト・フェーズとそれに続く往復旅行フェーズという二つの段階で動作する。
【０２１８】
ブースト・フェーズでは、書き込むべきデータのためのソース・バッファのリストが、コンピューティング・ノード２００上の一連のＰＩＴ  ＩＤに割り当てられる。ソース・バッファの断片化サイズは、ＢＹＮＥＴ  ＭＴＵとＩＯＮ最初オープン・プロトコル時に指定されたサイズ制限とによって決定される。ＰＩＴＩＤのこのリスト（対応するバッファ・サイズを有する）は、単一のＲＴ−ＰＩＴ要求メッセージのペイロード内に置かれて、宛て先ＩＯＮ２１２へのＰＩＴクレジットになるであろう。
【０２１９】
追加のＰＩＴバッファは、ＲＴ−ＰＩＴプロトコルによって直接使われるコンピューティング・ノード・プールから割り当てられる。この追加バッファのＰＩＴ  ＩＤは、ＰＩＴヘッダのクレジット・フィールド内に入れられる。ＲＴ−ＰＩＴ要求の残余分は、正常なＰＩＴ書込みメッセージと同じである。それからコンピューティング・ノード２００は、このＲＴ−ＰＩＴ要求メッセージをＩＯＮ２１２に送る（ブーストする）。
【０２２０】
ＩＯＮ２１２では、ＰＩＴ仕事負荷インジェクタが二段階でＲＴ−ＰＩＴ要求メッセージを処理する。各送信側ＰＩＴ  ＩＤ９０６ごとに、仕事負荷インジェクタは、サイズの一致する、ＩＯＮキャッシュからＰＩＴバッファを要求しなくてはならない。（これは、ＩＯＮバッファ・キャッシュ内の利用可能メモリ領域に依存して、直ちにすべてか、あるいは一度に一つずつか実行することができる）。ＰＩＴバッファを整合させることによって、ＩＯＮ２１２は、書込み要求に合った資源を動的に割り当てるであろう。これで入出力は、修正された一連の正常なＰＩＴ転送を使って進行することができる。
【０２２１】
これでＲＴ−ＰＩＴメッセージの処理は往復旅行フェーズに入るが、ここでは仕事負荷インジェクタが送信側と宛て先側のＰＩＴ  ＩＤの一つ（以上）の整合している対に関してＲＴ−ＰＩＴ開始メッセージを作成する。（整合ＰＩＴ  ＩＤの１個あるいは１サブセットを送るオプションは、ＩＯＮ２１２の自由裁量に任されている）。単一のＲＴ−ＰＩＴ開始メッセージ内のＰＩＴ  ＩＤ９０６の数は、ＩＯＮ２１２内部のデータ転送の粒度（実行単位）を制御する（以下に述べる）。
【０２２２】
このＲＴ−ＰＩＴ開始メッセージは、コンピューティング・ノード２００に返送されてＲＴ−ＰＩＴメッセージのブースト・フェーズを終了する。ＲＴ−ＰＩＴ開始メッセージを受信するとコンピューティング・ノード２００は、通常のＰＩＴ書込みメッセージを使って、一時にＰＩＴ対を１対ずつ、ＩＯＮ２１２にデータを転送しはじめる。コンピューティング・ノード２００とＩＯＮ２１２は両者とも紛失断片を処理するために十分なデータを持っているので、これら断片はコンピューティング・ノード２００によって順序よく送る必要はない（整合ＰＩＴ対が再組立ての順序を指定する）。
【０２２３】
ＩＯＮ２１２がＰＩＴ書込みメッセージを受信すると、仕事負荷インジェクタは、この書込み要求が大きなＲＴ−ＰＩＴ入出力操作の一部であることをどちらが認識したのかを知らされる。仕事負荷インジェクタは、ＰＩＴ書込みを処理するための二つオプションを持っている。すなわち断片をキャッシュ・ルーチンに渡して書き込み操作を開始するか、書込みを開始する前に最後の断片の伝送を待つかのどちらかである。入出力を早く開始することは、キャッシュ・ルーチンがディスク駆動機構へのデータ流れをパイプライン処理することを可能にする（書込みキャッシュ方針による）が、より小さな入出力サイズに起因する性能損失の危険がある。しかしながらすべての断片が到着するまで入出力を保留していることは、キャッシュ・システムに不当な負荷を掛ける可能性がある。
【０２２４】
断片の全体の大きさと数は初めから分かっているので、現在の動作条件下でこの大きな入出力要求を最適化するために必要とされるすべてのデータは、キャッシュ・システムによって作られる。コンピューティング・ノード２００では、多数の断片が単一のＲＴ−ＰＩＴ開始メッセージ内に含まれる場合には各ＰＩＴ書込み動作の伝送の成功は、次の断片書込みを開始させる。単一のＲＴ−ＰＩＴ開始コマンド内の最後の断片が受信されると、要求インジェクタ（注入器）は、通常の書込み要求の処理に類似の処理のためにそのデータをキャッシュ・システムに渡す。データが安全であるときは、入出力完了メッセージはキャッシュ・システムによって作成されて、（ＲＴ−ＰＩＴ開始動作のための）処理のこの段階の完了を知らせるためにコンピューティング・ノード２００に返送される。
【０２２５】
更に多くの断片が残っている場合は、別のＲＴ−ＰＩＴ開始コマンドが生成されてコンピューティング・ノードに送られ、すべての断片を処理し終わるまで、こうして上述のサイクルを繰り返す。仕事負荷インジェクタとキャッシュが最後の断片の処理を完了すると、ＲＴ−ＰＩＴ要求に関するすべての処理の終了を同期させるために、状態を有する最後の入出力完了メッセージがコンピューティング・ノードに返される。
【０２２６】
ＲＴ−ＰＩＴメッセージは、ＢＹＮＥＴに幾つかの変更を行うことによって最適化できる。ＩＯＮ２１２がちょうどＲＴ−ＰＩＴ要求を受信したばかりという状況を考えてみる。ＩＯＮ２１２上の仕事負荷インジェクタは、大きな入出力要求を多数の小さな通常の書込み要求に変換するためにコンピューティング・ノード上のバッファをＩＯＮ２１２に整合させている。中間のＲＴ−ＰＩＴ開始コマンドによって同期化が行われる。しかしながらもしＢＹＮＥＴが受信チャネル・プログラムにデータ・プルの実行を許したとすれば、ＲＴ−ＰＩＴ開始コマンドをコンピューティング・ノードに送るという中間ステップは除くことができるであろう。
【０２２７】
論議のためにＢＹＮＥＴ操作のこのモードをループバンド・メッセージと呼ぶことにする。ループバンド・メッセージは実は、一方が他方のなかに入れ子になっている二つの有向帯域メッセージである。例として、仕事負荷インジェクタは、ＲＴ−ＰＩＴ要求を受け取ると、コンピューティング・ノード上で第二のＰＩＴ書込みメッセージを作成するために必要とされるデータを含むＲＴ−ＰＩＴ開始メッセージを作成することによって各断片を処理するであろう。ＲＴ−ＰＩＴ開始メッセージは、ある断片に関するＰＩＴ書込み操作のためのテンプレートをコンピューティング・ノード２００に転送する。コンピューティング・ノード２００上で実行されるチャネル・プログラム（ＲＴ−ＰＩＴ開始メッセージと一緒に送られる）は、コンピューティング・ノードＢＹＮＥＴドライバ上の送信待ち行列にそのペイロードを入れる。
【０２２８】
このペイロードは、初期ＲＴ−ＰＩＴ要求を行ったアプリケーション・スレッドからの待機している要求のように見える。このペイロードは、仕事負荷インジェクタによって送られたこの断片のために送信元のＰＩＴ  ＩＤと宛て先のＰＩＴ  ＩＤとの対を使ってＰＩＴ書込み要求を作成するであろう。ＰＩＴ書込みは、ＩＯＮ２１２上にこの断片を置き、それが到着したことを仕事負荷インジェクタに通知するであろう。仕事負荷インジェクタは、すべてが処理し終わるまで各断片についてこのサイクルを続けるであろう。ループバンド・メッセージの性能改善は、各ＲＴ−ＰＩＴ開始メッセージのために必要とされる割込みとコンピューティング・ノード処理とを除去することから得られる。
【０２２９】
ＦＲＡＧ−ＰＩＴメッセージは、コンピューティング・ノードからの大きな入出力読取り要求の操作をサポートするように設計されている。アプリケーションが大きな入出力読取り要求を行うと、コンピューティング・ノードは、目標バッファをピン留めして、各断片の目標バッファを表すＰＩＴ  ＩＤのリストを作成する。各ＰＩＴ  ＩＤは、その断片に関する目標バッファとそれに関連する状態バッファとからなる分散リストを記述している。状態バッファは、データが送られると更新され、各断片が何時処理されたかをコンピューティング・ノードが決めることを可能にしている。各断片のサイズは、ＲＴ−ＰＩＴメッセージと同じアルゴリズムを使って決定される（前述のＲＴ−ＰＩＴについてのセクションを参照のこと）。これらのフィールドは、ＦＲＡＧ−ＰＩＴを生成するために組み立てられる。
【０２３０】
コンピューティング・ノード２００は、仕事負荷インジェクタによってＦＲＡＧ−ＰＩＴが処理されるＩＯＮ２１２にそのＦＲＡＧ−ＰＩＴを送る。この要求には、ＩＯＮ２１２上の仮想ディスク名と開始ブロック番号とデータ源のデータ長とが含まれる。仕事負荷インジェクタは、ＲＴ−ＰＩＴ要求と同様の方法でＦＲＡＧ−ＰＩＴ要求に作用する。ＦＲＡＧ−ＰＩＴ要求内の各断片は、キャッシュ・システムの協同の下で別々のＰＩＴ読取り要求として処理される。キャッシュ・システムは、各断片を独立に処理するか単一の読取り要求として処理するかを選択することができ、利用可能なときにはディスク・データを仕事負荷インジェクタに送り返す。
【０２３１】
データ断片がキャッシュによって供給されると（個別にか、単一の入出力操作の一部としてかのどちらかで）、大きな読取り要求のためのデータは、コンピューティング・ノードに流れはじめるであろう。キャッシュがデータを利用可能にした各断片ごとに、仕事負荷インジェクタは、ＦＲＡＧ−ＰＩＴ部分完了メッセージ内のそのデータ断片をコンピューティング・ノードに送り返す。各ＦＲＡＧ−ＰＩＴ部分完了メッセージは、それが送付されたときにコンピューティング・ノードで割込みを発生させないということを除いて、正常なＰＩＴ読取り要求完了に似たデータを送信する。最後に完了した断片は、ＦＲＡＧ−ＰＩＴ完全完了メッセージと一緒にコンピューティング・ノードに返される。ＦＲＡＧ−ＰＩＴ完全完了メッセージは、それがＦＲＡＧ−ＰＩＴ読取り要求全体の完了を割込みを介して知らせる（フル・アップコール）と言うことにおいて、部分完了メッセージとは異なっている。
【０２３２】
他のネットワーク装置上でのＰＩＴプロトコルの実現
ネットワークに付加された記憶装置に対する前述の手法の性能の多くは、ＰＩＴプロトコルをサポートする相互接続ファブリック１０６の能力に依存している。ＢＹＮＥＴの場合には、ＰＩＴプロトコルに良く整合したローレベル・インタフェースが作成された。ファイバ・チャネルといった他のネットワーク・インタフェースも同様に、ＰＩＴプロトコルをサポートすることができる。
【０２３３】
バーミューダ・トライアングル・プロトコル
本発明は、ＩＯＮクリーク２２６と書戻しキャッシングとを使うことによってデータと入出力の冗長性を提供する。ＩＯＮクリーク２２６は、主ＩＯＮ２１２と兄弟ＩＯＮ２１４とからなるＩＯＮ２１２、２１４といった（一般には対またはダイポール単位で配置される）複数のＩＯＮを含んでいる。
【０２３４】
兄弟ＩＯＮ２１4 は、主ＩＯＮ２１２の修正キャッシュ・ページのコピーのための一時記憶として働くことによって、データおよび入出力の冗長性に備えている。ＩＯＮクリーク２２６内の各ＩＯＮ２１２（１対のＩＯＮあるいは１個のダイポールとして示される）は、一つのグループのボリューム・セット用の主ＩＯＮ２１２と、もう一つのグループのボリューム・セット用の兄弟ＩＯＮ２１４として機能する。
【０２３５】
高い可用性と書戻しキャッシングとを備えるために、データは、書込みがアプリケーションに肯定応答される前に少なくとも二つの場所で安全に格納されなければならない。この冗長コピーを与えることに対する障害は、書込みが肯定応答された後ではあるがそのデータが永久記憶装置に記録される前に記憶装置制御部が故障した場合に、データ損失を引き起こす可能性がある。
【０２３６】
しかしながらＩＯＮ２１２、２１４は物理的に別個のコンピュータを持っているので、これらのバックアップ・コピーを保持するためには相互接続ファブリック１０６上での通信が必要である。最適のシステム性能のためには、なお書戻しキャッシングを利用しながら、ＢＹＮＥＴ伝送と書込みプロトコルに関連の割込みとの回数を最小にすることが必要である。
【０２３７】
ダイポール２２６内のディスク２２４にデータを書き込むための一つの可能なプロトコルは、コンピューティング・ノード２００が主ＩＯＮ２１２と兄弟ＩＯＮ２１４とに別々に書込み、両ＩＯＮ２１２、２１４からの書込み要求に対する応答が受信されるまで待機し、それから主ＩＯＮ２１２が兄弟ＩＯＮ２１４に、もはやそのページのコピーを保存する必要がないことを示すパージ要求を送ることであろう。「送信完了」割込みが送信側で抑制されると仮定すると、送られた各メッセージはコンピューティング・ノード２００あるいはＩＯＮ２１２、２１４上で割込みを発生させるので、このプロトコルは、少なくとも５回の割込みを必要とする。
【０２３８】
もう一つの可能なプロトコルは、書込み要求を兄弟ＩＯＮ２１４に送り、応答を待ち、そして肯定応答をコンピューティング・ノード２００に送り返すということを主ＩＯＮ２１２に指示する。このプロトコルも同様に、少なくとも５回の割込みを必要とする。第１の割込みはコンピューティング・ノード２００が書込み要求を主ＩＯＮ２１２に送信するときに発生する。第２の割込みは、主ＩＯＮ２１２がデータを兄弟ＩＯＮ２１４に送信するときに発生する。第３の割込みは、兄弟ＩＯＮ２１４がそのデータの受信を肯定応答するときに発生する。第４の割込みは、主ＩＯＮ２１２がコンピューティング・ノード２００に応答するときに発生し、そして最後の割込みは、データがディスクに安全に転送されて、主ＩＯＮ２１４がパージ要求を兄弟ＩＯＮ２１４に送るときに発生する。
【０２３９】
図１１は、書込み要求を処理するために必要とされる割込みの回数を最小にする、本発明で使われるプロトコルを示す。このプロトコルは、バーミューダ・トライアングル・プロトコルと呼ばれる。
【０２４０】
第一に、コンピューティング・ノード２００は、書込み要求を主ＩＯＮ２１２に発行する。第二に、主ＩＯＮ２１２は、そのデータを兄弟ＩＯＮ２１４に送る。第三に、兄弟ＩＯＮ２１４は、肯定応答をコンピューティング・ノード２００に送る。最後に、データが安全にディスク上にあるときに、主ＩＯＮ２１２は、パージ要求を兄弟ＩＯＮ２１４に送る。
【０２４１】
上記の４個のステップは、全部で４回の割込みを必要とする。更に割込みを減らすためには、パージ要求（図１１のステップ４）を遅らせて、ステップ２で後続の書込みのデータ伝送と結合させ、３回割込みプロトコルを作るようにできる。このプロトコルの更なる利点は、書込み要求が受信されたときに、もし兄弟ＩＯＮ２１４がダウンしても、主ＩＯＮ２１２はライト・スルー（書込み遂行）モードでその要求を処理して、一旦そのデータがディスク上に置かれれば、その書込みに対して肯定応答することができると言うことである。コンピューティング・ノード２００は、兄弟ＩＯＮ２１４の状態を知る必要がない。
【０２４２】
バーミューダ・トライアングル・プロトコルは、データの可用性を維持しながら、従来型プロトコルよりも少ない回数の割込みを使って書戻しキャッシングを可能にしている。これは、主ＩＯＮ２１２に送られた書込み要求の肯定応答を兄弟ＩＯＮ２１４が行うからである。現代のパイプライン化されたプロセッサ上では割込み処理は不経済になり得るとすれば、幅広い種々の分散型記憶システム・アーキテクチャで使用できるこのプロトコルは、全体的なシステム・オーバーヘッドを削減して、性能を改善する結果をもたらす。
【０２４３】
コンピューティング・ノード
概要
コンピューティング・ノード２００は、ユーザのアプリケーション２０４を実行する。従来技術のシステムでは、クラスタあるいはクリーク内のノードに対して等しい記憶装置アクセス可能にするために多数の専用・共用のＳＣＳＩバスが使われている。本発明では、記憶装置は一つ以上の通信ファブリック１０６を介してコンピューティング・ノード２００に取り付けられる。このネットワーク付加の記憶装置は、コンピューティング・ノード２００に亘って配布されるユーザ・アプリケーション間で処理間通信（ＩＰＣ）トラヒックを有する通信ファブリック１０６を共用する。ユーザ・アプリケーション２０４からの記憶要求は、ファブリック／記憶装置インタフェースによってＩＯＮ２１２上に配置された記憶装置管理アプリケーションへのＩＰＣメッセージの中に入れられる。記憶装置ノード上のこれらの専用アプリケーションは、ＩＰＣメッセージをローカル・キャッシュ操作またはディスク入出力操作に変換して、その結果を必要に応じてコンピューティング・ノード２００に送り返す。ユーザ・アプリケーション２０４にとってネットワーク取付け記憶装置とローカル取付け記憶装置とは区別がつかない。
【０２４４】
仮想ディスク・ブロックに関する読取り要求と書込み要求は、相互接続ファブリック１０６を介してＩＯＮ２１２に到着する。要求は、コンピューティング・ノード２００における発信元起動の選択を介して所定のＩＯＮ２１２に経路指定することができる。すべてのコンピューティング・ノード２００は、どのＩＯＮ２１２がシステム内の各ファブリック仮想ディスクに関する要求を受け入れているかを知っている。ファブリック仮想ディスクは、一意の記憶領域が表される仮想ディスク・モデルを反映するが、その記憶領域は、名前の中の物理ディスクの各物理位置を意味することも符号化することもない。
【０２４５】
各コンピューティング・ノード２００は、ファブリック仮想ディスク名をＩＯＮダイポール２２６に写像するリストを保持している。このリストは、コンピューティング・ノード２００とＩＯＮ２１２との間の協調によって動的に作成される。電源投入と障害回復操作の時にダイポール内のＩＯＮ２１２は、これらＩＯＮ２１２の間で仮想（および物理）ディスクを分割して、どの仮想ディスクがどちらの一方のＩＯＮ２１２によって所有されているかという、仮想ディスクのリストを作成する。ダイポール２２６内の他方のＩＯＮ２１４（仮想ディスクも記憶資源も所有しない）は、障害の場合の仮想ディスクへの代替経路を提供する。
【０２４６】
このリストは、この他のダイポール２２６とコンピューティング・ノード２００とのすべてに対して相互接続ファブリック１０６の全域で定期的に移出または公示される。コンピューティング・ノード２００は、このデータを使って、システム内の各仮想ディスクへの一次経路と二次経路の基本表を作成する。それからコンピューティング・ノード２００内の相互接続ファブリック・ドライバは、入出力要求を経路指定するためにダイポール２２６との協調を行う。ダイポール２２６は、この「自己発見」手法を使って、ダイポール２２６がアクティブなシステムに追加されたり、そこから削除されたときに起こる可能性のある仮想ディスクの命名不一致を検出して訂正する。
【０２４７】
コンピューティング・ノード２００上で走行するアプリケーションは、ブロック・インタフェース・モデルを、コンピューティング・ノード２００に移出された各ファブリック仮想ディスクに関するローカル・ディスクのように見る。本書で前に述べたように、コンピューティング・ノード２００は、ブート時に各ファブリック仮想ディスクへの入口点を生成し、またコンピューティング・ノード２００とＩＯＮ２１２との間に確立された命名プロトコルを使ってこれらの入口点を動的に更新する。
【０２４８】
既存記憶ＡＰＩとのインターフェース
ＶＳＩ６０２で表現されるファブリック取付け記憶名は、コンピューティング・ノード２００上で実行するアプリケーション２０４と共に実行される既存記憶アプリケーション・プログラム・インターフェース（ＡＰＩ）２３２から構成されねばならない。これによって、アプリケーションが変形なしのファブリック取付け記憶名を利用する。
【０２４９】
典型的記憶ＡＰＩは、開く（）システム呼び出し、読取る（）システム呼び出し、書込む（）、システム呼び出しを含む。ＵＮＩＸオペレーティング・システム２０２を利用するコンピューティング・ノード２００において、例えば、開く（）システム呼び出しは、記憶名ＵＮＩＸ装置ノード上で行われる。記憶名ＵＮＩＸ装置ノードは、情報において最大２２ビットまで符号化する規定ファイルである。同時に、位置を基本にした記憶に対して２２ビットで十分なのは、ローカルホストに関連する記憶装置の物理的位置を符号化するには十分だからである、しかしながら、ここで述べられているように、  ファブリック取付け記憶名構成に対し、２２ビットでは、名前に必要な全情報を含むには不十分なことがよくあるだろう。例えば、自動記憶名割当てに対する記憶名において、ノードＩＤ（１０ビット）とシステムＩＤ（８ビット）を符号化するには、２２ビットでは不十分である。故に、ＵＮＩＸ装置への符号化には、通常可能とされる以上の情報符号化がなされなければならない。このことは、過去に戻って互換性を維持するためにも、既存ＡＰＩ２３２を変形することなく達成されねばならない。
【０２５０】
グローバルに一意な独自のＩＤへのデータ・オブジェクトに対するＡＰＩシステム入出力呼出しをマッピングする情報を記憶するコンピューティング・ノード上で実行されるファイルシステムにおいて、本発明はこの優れた技術を達成する。一実施例中、同様の記憶範囲の名前についてファイル・システムに記憶する情報を指示する間接的ポインタ位置を独自に識別するシステム・コールを符号化して、これは達成される。これは、ＶＳＩと、ＶＳＩによって定義するデータを管理するＩＯＮ識別を含む。これによって、マッピングされる情報量の非限定が可能となる。更に、組織の命名記憶更新を保証するにふさわしく、マッピング情報を更新する。
【０２５１】
図１２は、ボリューム・セットの伝達もしくはＩＯＮ２１２からコンピューティング・ノード２００にデータ・エクステントに利用する操作ステップを記したフローチャートである。第一に、データ・エクステントに対するグローバルに一意な識別（例えば、ＶＳＩ）がＩＯＮ２１２内の１１０２で行われる。その際、グローバルに一意なＩＤは、１１０４でデータ・エクステントと結合し、１１０６で相互接続ファブリック１０６を介し、コンピューティング・ノード２００に伝えられる。
【０２５２】
図１３は、本発明一実施例中、入出力ノードのグローバルに一意なＩＤを作成するのに利用される操作ステップを記したフローチャートである。まず、１２０２で管理ノード２３０からグローバルに一意なＩＤを読取る。このグローバルに一意な入出力ノード識別子は、ＡＷＳノードＩＤ、システムＩＤ、両方のＩＤの組合わせのいずれかで構成することができる。その際、データ・エクステント識別子は、ＩＯＮ２１２に一意のものであり、１２０４で発生する。グローバルに一意な入出力ノード識別子とローカルに一意なデータ・エクステント識別子は１２０６で組み合わされる。その結果が、データ・エクステントに対するグローバルに一意な識別子である。
【０２５３】
サーバ管理
概要
本発明の重要な一面は、その管理であって、これはシステム管理あるいはシステムズ管理と呼ばれる全体的管理のサブセットである。このサブセットは、記憶装置に関するサーバ管理（ＳＭＳ）と呼ばれる。記憶装置関連のハードウエア・コンポーネントとソフトウエア・コンポーネントとの管理ならびに利用可能な記憶領域内のデータ・エンティティの配置は、この機構によって実現される。管理動作は、管理者によって初期化でき、あるいはシステム内でのある事象の発生時に動的に呼び出される。管理コマンドは、入力されて、殆ど瞬時に肯定応答され得るが、単一の簡単なコマンドの結果は、かなり長時間に亘って多数のシステム・コンポーネントに容易に影響を与える可能性がある。例えば、ボリューム・セットを一方のＩＯＮ２１２から他方のＩＯＮに移動させることは、完了までに何分も、いや何時間も要することがあり、主題のファイル・システムを使いたがっている多数のＩＯＮ２１２とコンピューティング・ノード２００とに影響を与えることになる。サーバ管理はまた、システムのハードウエアとソフトウエアの状態に関する情報メッセージと警告メッセージとを管理者に提供する責任も持っている。
【０２５４】
管理者は、主として一連の画面表示「ビュー」を通してシステムを感知している。システム全体の幾つかのビューが提示されることもある。主要ビューは、最上位レベルにシステム内のすべてのコンピューティング・ノード２００とＩＯＮ２１２とファブリック１０６とが表示される、階層的ビューである。ドリルダウン手法によって関心のある項目の更に詳しい表示が得られる。大抵のシステムはサイズが大きくて非常に複雑なので、単一の表示ページ上では表現しきれない。図形的ビューは、物理的（機器構成的）ビューまたは論理ビューのどちらかを表示して表現される。更に詳細なビュー化と管理とのために個別エンティティあるいはエンティティのグループが選択され、要求の結果はユーザ選択のフォーマットで表示できる。
【０２５５】
表による表現方法も用意されており、個体でもグループでも、このビューで見て管理することができる。この管理の重要な一面は、特定のコンピューティング・ノード２１２から、特定のデータ片の、そのデータ片を持っている物理記憶ディスク２２４への経路の表現である。この経路は、その障害許容力を、すなわち、どれだけ多くの個別コンポーネントが障害を起こしたらデータが利用不能になるかを表示する表形式で表現される。
【０２５６】
ボリューム・セットの作成
ボリューム・セット（ＶＳ）の作成は、ホストのコンピューティング・ノード２００アプリケーション２０４によって使われる空き領域を割り当てる。ボリューム・セットは、ＩＯＮ２１２内に基礎を置いており、名前（ここで述べたＶＳＩ６０２）と、サイズと、ＲＡＩＤ（ｒｅｄｕｎｄａｎｔ  ａｒｒａｙ  ｏｆ  ｉｎｅｘｐｅｎｓｉｖｅｄｉｓｋｓ：低価格ディスクの冗長配列）データ保護レベルとを持っている。システム管理者は、要件に基づいてＶＳを作成し、位置と冗長性特性とを指定できる。多数のＶＳがグループ操作で作成できる。
トとを含んでいる。
【０２５７】
【発明の効果】
本発明は、並列処理システムについて記述している。本システムは、システム入出力呼出しを有する記憶装置アプリケーション・インタフェースを介してアプリケーションを実行する複数のコンピューティング・ノードと、複数の入出力ノードと、前記コンピューティング・ノード上に実現されたファイル・システムであって、前記データ・オブジェクトに関するグローバルに一意の識別情報によって前記データ・オブジェクトに関するＡＰＩシステム入出力呼出しを写像する情報を記憶するファイル・システムとを含む。各入出力ノードは、通信可能に連結された複数の記憶資源を管理しており、また各入出力ノードは、前記記憶資源に記憶されたデータ・オブジェクトに関するグローバルに一意の識別情報を生成する手段を持っており、そして前記コンピューティング・ノードのいずれかと前記入出力ノードのいずれかとの間の通信を可能にする少なくとも一つの相互接続ファブリックを介して前記グローバルに一意の識別情報と前記データ・オブジェクトとを前記コンピューティング・ノードに送信する。
【０２５８】
本発明の好適な実施例の前述の説明は、例示と説明のために、提示されている。本発明は、開示された通りの形式だけに限定することも、それですべて網羅することも意図していない。上述の教えるところに照らせば、多くの修正、変形が可能である。本発明の範囲は、この詳細な説明によって限定されるのではなく、ここに添付の特許請求範囲によって限定されることが意図されている。
【図面の簡単な説明】
【図１】  基本的構成エレメントを示す本発明の一実施例の最上位レベルのブロック図である。
【図２】  本発明の一実施例のシステム・ブロック図である。
【図３】  ＩＯＮの構造とシステム相互接続部とを示すブロック図である。
【図４】  ＪＢＯＤ筐体内のエレメントのブロック図である。
【図５】  ＩＯＮ物理ディスク・ドライバの機能ブロック図である。
【図６】  ファブリックの一意的ＩＤの構造を示す図である。
【図７】  ＩＯＮ筐体管理モジュールと物理ディスク・ドライバとの間の関係を示す機能ブロック図である。
【図８】  ＢＹＮＥＴホスト側インタフェースの図である。
【図９】  ＰＩＴヘッダの図である。
【図１０】  ＩＯＮ２１２機能モジュールのブロック図である。
【図１１】  ＩＯＮダイポール・プロトコルを示す図である。
【図１２】  ボリューム・セットの伝達もしくはＩＯＮ２１２からコンピューティング・ノード２００にデータ・エクステントに利用する操作ステップを記したフローチャートである。
【図１３】  本発明一実施例中、入出力ノードのグローバルに一意なＩＤを作成するのに利用される操作ステップを記したフローチャートである。
【図１】
0004618654.tif 000010
【図２】
0004618654.tif 000011
【図３】
0004618654.tif 000012
【図４】
0004618654.tif 000013
【図５】
0004618654.tif 000014
【図６】
0004618654.tif 000015
【図７】
0004618654.tif 000016
【図８】
0004618654.tif 000017
【図９】
0004618654.tif 000018
【図１０】
0004618654.tif 000019
【図１１】
0004618654.tif 000020
【図１２】
0004618654.tif 000021
【図１３】
0004618654.tif 000022