(57)【特許請求の範囲】
【請求項１】
少なくとも一部を共有メモリ領域として設定可能な記憶装置と１つ以上の演算装置とを各々が備える複数のノードと、前記複数のノード間を接続するインターコネクトとを有する情報処理装置であって、
前記複数のノードのうちの第１のノードは、
他のノードの記憶装置にアクセスするための識別情報を記憶する第１記憶部と、
前記他のノードの記憶装置から取得したデータを保持するキャッシュメモリと、
前記キャッシュメモリが保持するデータを前記他のノードへ送信する際に、前記識別情報を付加して送信する送信部と
を備えた演算装置を有し、
前記複数のノードのうちの第２のノードは、
前記他のノードから該第２のノードの記憶装置の共有メモリ領域へのアクセスの許可の制御に用いる識別情報を記憶する第２記憶部と、
前記第１のノードが前記データを前記第２のノードの記憶装置の共有メモリ領域へ書き戻す前に、前記第１のノードに新たな識別情報を通知する通知部と、
前記第１のノードが前記データを前記第２のノードの記憶装置の共有メモリ領域へ書き戻す前に、前記第２記憶部に記憶された識別情報を、前記通知部が通知した識別情報に変更する変更部と、
前記第１のノードから送信されたデータに付加された前記識別情報と、前記第２記憶部に記憶された識別情報とに基づいて、前記第２のノードの記憶装置の共有メモリ領域へのアクセス可否を制御する制御部と、
を有することを特徴とする情報処理装置。
【請求項２】
前記第１のノードが有する演算装置の各々は、前記第２のノードから通知される識別情報を前記第１記憶部に格納し、
前記制御部は、前記第１のノードから送信されたデータに付加された前記識別情報と、前記第２記憶部に記憶された識別情報とが一致した場合は、前記第２のノードの記憶装置の共有メモリ領域へのアクセスを許可し、前記第１のノードからの通信データに付加された前記識別情報と、前記第２記憶部に記憶された識別情報とが一致しない場合には、前記第２のノードの記憶装置の共有メモリ領域へのアクセスを許可しないことを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記通知部は、前記第１のノードに対して、アクセス停止の指示とともに新たな識別情報を通知し、
前記変更部は、前記通知部が前記アクセス停止の指示を通知してから所定の時間が経過した後に、前記第２記憶部に記憶された識別情報を、前記通知部が前記第１のノードに通知した新たな識別情報に変更することを特徴とする請求項２に記載の情報処理装置。
【請求項４】
前記送信部は、前記第２のノードの記憶装置の共有メモリ領域へのアクセスが許可されなかった場合には、同一のアクセスを要求する通信データを再度送信する事を特徴とする請求項１〜３のいずれか１つに記載の情報処理装置。
【請求項５】
前記制御部は、前記第２のノードの記憶装置の共有メモリ領域へのアクセスを許可しなかった場合は、前記第１のノードの演算装置が有するキャッシュメモリが保持したデータを前記第２のノードの記憶装置に書き戻すことを特徴とする請求項４に記載の情報処理装置。
【請求項６】
前記第１のノードが有する演算装置の各々は、コンテキストスイッチを行う際にスタックするレジスタの一部を、前記第１記憶部として用いることを特徴とする請求項１〜５のいずれか１つに記載の情報処理装置。
【請求項７】
前記第１のノードが有する演算装置の各々は、並行して実行するスレッドと同じ数の第１記憶部を有することを特徴とする請求項１〜６のいずれか１つに記載の情報処理装置。
【請求項８】
少なくとも一部を共有メモリ領域として設定可能な記憶装置と１つ以上の演算装置とを各々が備える複数のノードと、前記複数のノード間を接続するインターコネクトとを有する情報処理装置が実行する不正アクセス防止方法において、
前記複数のノードのうちの第１のノードが有する演算装置の各々は、
他のノードの記憶装置にアクセスするための識別情報を記憶し、
キャッシュメモリが保持するデータを前記他のノードへ送信する際に、前記識別情報を付加して送信し、
前記複数のノードのうちの第２のノードは、
他のノードから該第２のノードの記憶装置の共有メモリ領域へのアクセスの許可の制御に用いる識別情報を保持し、
前記第１のノードが前記データを前記第２のノードの記憶装置の共有メモリ領域へ書き戻す前に、前記第１のノードに新たな識別情報を通知し、
前記第１のノードが前記データを前記第２のノードの記憶装置の共有メモリ領域へ書き戻す前に、前記保持された識別情報を、前記通知した識別情報に変更し、
前記第１のノードからの通信データに付加された前記識別情報と、保持した前記識別情報とに基づいて、前記第２のノードの記憶装置の共有メモリ領域へのアクセス可否を制御する
処理を実行することを特徴とする不正アクセス防止方法。
【請求項９】
少なくとも一部を共有メモリ領域として設定可能な記憶装置と１つ以上の演算装置とを各々が備える複数のノードと、前記複数のノード間を接続するインターコネクトとを有する情報処理装置であって、
前記複数のノードのうちの第１のノードは、
他のノードの記憶装置にアクセスするための識別情報を記憶する第１記憶部と、
前記他のノードの記憶装置から取得したデータを保持するキャッシュメモリと、
前記キャッシュメモリが保持するデータを前記他のノードへ送信する際に、前記識別情報を付加して送信する送信部と
を備えた演算装置を有し、
前記複数のノードのうちの第２のノードは、
前記他のノードから該第２のノードの記憶装置の共有メモリ領域へのアクセスの許可の制御に用いる識別情報を記憶する第２記憶部と、
前記第１のノードから送信されたデータに付加された前記識別情報と、前記第２記憶部に記憶された識別情報とに基づいて、前記第２のノードの記憶装置の共有メモリ領域へのアクセス可否を判定し、前記第２のノードの記憶装置から前記第１のノードの前記キャッシュメモリにデータを保持するためのアクセスを許可しなかった場合には、前記第１のノードの演算装置が有するキャッシュメモリが保持したデータを前記第２のノードの記憶装置に書き戻す制御部と、
前記制御部が第１のノードの演算装置が有するキャッシュメモリが保持したデータを前記第２のノードの記憶装置に書き戻す前に、前記第１のノードに新たな識別情報を通知する通知部と、
前記制御部が第１のノードの演算装置が有するキャッシュメモリが保持したデータを前記第２のノードの記憶装置に書き戻す前に、前記第２記憶部に記憶された識別情報を、前記通知部が通知した識別情報に変更する変更部と、
を有することを特徴とする情報処理装置。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置および不正アクセス防止方法に関わる。
【背景技術】
【０００２】
従来、１つ又は複数のＣＰＵとメモリとを有する複数のノードをＬＡＮやインフィニバンドで接続し、各ノード毎に独立したＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）を実行させるクラスタ構成の情報処理システムが知られている。このようなクラスタ構成の情報処理システムは、各ＣＰＵが各ノードのメモリを共有し、並列して処理を実行する。
【０００３】
図３３は、クラスタ構成の情報処理システムを説明するための図である。図３３に示す例では、情報処理システムは、ＬＡＮやインフィニバンドで相互に接続された複数のノード５０〜５２を有する。ここで、ノード５０は、メモリ５０ａ、ＯＳ５０ｂ、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  ユニット）５０ｃを有する。同様に、ノード５１は、メモリ５１ａ、ＯＳ５１ｂ、ＣＰＵ５１ｃを有し、ノード５２は、メモリ５２ａ、Ｏｓ５２ｂ、ＣＰＵ５２ｃを有する。
【０００４】
各ノード５０〜５２は、ノードごとに独立したＯＳ５０ｂ〜５２ｂを実行しており、ＯＳ５０ｂ〜５２ｂの故障が情報処理システム全体に波及するのを防ぐ。また、各ノード５０〜５２に含まれる、１つ又は複数のＣＰＵ５０ｃ〜５２ｃは各メモリ５０ａ〜５２ａをノード内で共有しており、ＬＡＮやインフィニバンドを介して、他のノードが有するメモリにアクセスする。
【０００５】
図３４は、ノード間のメモリアクセスを説明するための図である。例えば、ノード５０は、自ノードで動作するアプリケーションが発行したメモリアクセスの要求をドライバ、ＯＳ、ハードウェアを介して、ノード５１に送信する。すると、ノード５１は、ノード５０から受信したリクエストを、ハードウェア、ＯＳ、ドライバを介してアプリケーションに伝え、アプリケーションにメモリアクセスを実行させる。
【０００６】
ここで、クラスタ構成の情報処理システムでは、アクセス対象となるノードのアプリケーションを介してメモリアクセスが実行されるので、メモリアクセスのレイテンシが増加するとともに、アプリケーションのアーキテクチャが複雑になる。そこで、複数のノードをインターコネクトで接続し、同一のアドレス空間にマッピングしたメモリに対して、各ノードのアプリケーションが直接アクセスする共有メモリ構成の情報処理システムが知られている。
【０００７】
図３５は、共有メモリ構成の技術が適用された情報処理システムを説明するための図である。図３５に示す例では、ノード５３とノード５４とがインターコネクトで接続されており、ノード５３とノード５４とが実行するアプリケーションが直接アクセス可能なアドレス空間に、リモートメモリがマッピングされている。そして、各ノード５３、５４が実行するアプリケーションは、自ノードのメモリに対するメモリアクセスと同様に、リモートメモリに対するメモリアクセスの要求を発行する。
【０００８】
一方、メモリの記憶領域にアクセスするためのストレージキーを設定することで、アプリケーションがアクセスすべきでないメモリ領域への不正なアクセスを防止する技術が知られている。図３６は、不正なメモリアクセスを防止する機能を説明するための図である。例えば、図３６に示す例では、ＯＳが、メモリ領域に対して、２キロバイトまたは４キロバイトごとに、４ビットのストレージキーを予め設定する。また、ＯＳは、プログラムカウンタをセットする際に、アプリケーションが用いるメモリ領域のストレージキーをアクセスキーとしてプログラムステータスワードにセットする。
【０００９】
すると、命令ユニットは、プログラムカウンタを読み取り、メモリアクセスの要求をメモリアクセスユニットに発行する。また、メモリアクセスユニットは、命令ユニットからメモリアクセスの要求を取得すると、プログラムステータスワードにセットされたアクセスキーと、ストレージキーとが一致するか否かを判別する。
【００１０】
そして、メモリアクセスユニットは、ストレージキーとアクセスキーとが一致すると判別した場合には、メモリアクセスを許可し、アクセス対象となるメモリ領域に記憶されたデータを命令ユニットに出力する。また、メモリアクセスユニットは、ストレージキーとアクセスキーとが一致しない場合は、メモリアクセスを許可せずに、アプリケーションが使用すべきでないメモリ領域への不正なアクセスを防止する。
【先行技術文献】
【特許文献】
【００１１】
【特許文献１】特表２００９−５３７８７９号公報
【特許文献２】特開平０５−２０４７６２号公報
【特許文献３】特許第４１２３６２１号公報
【発明の概要】
【発明が解決しようとする課題】
【００１２】
ここで、上述した共有メモリ構成の情報処理システムは、あるノードが実行するアプリケーションが故障して他のノードと通信不能となった場合には、故障したノードの処理を他のノードに移すフェールオーバを正しく実行できないという問題がある。
【００１３】
以下、図３７Ａ、図３７Ｂを用いて、フェールオーバが正常に実行できない例について説明する。図３７Ａは、フェールオーバが正常に実行できない例について説明するための図（１）である。また、図３７Ｂは、フェールオーバが正常に実行できない例について説明するための図（２）である。なお、図３７Ａ、図３７Ｂに示す例では、ノード５５が実行するアプリケーションに障害が発生し、他のノードと通信ができなくなった例について説明する。
【００１４】
例えば、図３７Ａに示すように、ノード５６は、ノード５５が実行するアプリケーションからのメモリアクセスを受付けるが、ノード５５と通信が行えなくなったため、ノード５５が故障したものと判別する。このような場合には、図３７Ｂに示すように、ノード５５が実行する処理をノード５７に移すフェールオーバが実行される。
【００１５】
しかし、ノード５６は、ノード５５と通信できないので、ノード５５からのメモリアクセスを停止させることができない。この結果、ノード５５とノード５７とが同一のアプリケーションを実行するスプリットブレイン状態が発生してしまい、フェールオーバを正しく実行できない。
【００１６】
そこで、上述したストレージキーを設定する技術を共有メモリ構成の情報処理システムに適用し、ストレージキーを変更することで、他ノードから自ノードが有するメモリへのアクセスを防ぐことも考えられる。しかしながら、上述したストレージキーを設定する技術では、同一のＯＳがストレージキーとアプリケーションキーとを設定する。このため、メモリアクセス元のノードとアクセス対象となるノードとが異なるＯＳを実行する場合には、ストレージキーを変更することができず、故障したノードからのアクセスを防ぐことができない。
【００１７】
１つの側面では、本発明は、共有メモリ構成におけるフェールオーバを正しく行うことを目的とする。
【課題を解決するための手段】
【００１８】
１つの側面では、すくなくとも一部を共有メモリ領域として設定可能な記憶装置と１つ以上の演算装置とを各々が備える複数のノードと、複数のノード間を接続するインターコネクトとを有する情報処理装置である。ここで、第１のノードが有する演算装置の各々は、他のノードの記憶装置にアクセスするための識別情報を保持する第１記憶部と、他のノードから取得したデータを保持するキャッシュメモリと、他のノードへデータを送信する際に識別情報を付加して送信する送信部とを有する。また、第２のノードは、他ノードから自ノードの記憶装置の共有メモリ領域へのアクセスの許可の制御に用いる識別情報を保持する第２記憶部を有する。また、第２のノードは、第１のノードがデータを第２のノードの記憶装置の共有メモリ領域へ書き戻す前に、第１のノードに新たな識別情報を通知する通知部を有する。また、第２のノードは、第１のノードがデータを第２のノードの記憶装置の共有メモリ領域へ書き戻す前に、第２記憶部に記憶された識別情報を、通知部が通知した識別情報に変更する変更部を有する。さらに、第２のノードは、第１のノードから送信されたデータに付加された識別情報と、第２記憶部に記憶された識別情報とに基づいて、第２のノードの記憶装置の共有メモリ領域へのアクセス可否を制御する制御部を有する。
【発明の効果】
【００１９】
１実施形態によれば、共有メモリ構成におけるフェールオーバを正しく行う。
【図面の簡単な説明】
【００２０】
【図１】図１は、実施例１に係る情報処理システムを説明するための図である。
【図２】図２は、実施例１に係るノードの機能構成を説明するための図である。
【図３】図３は、実施例１に係るメモリの割当を説明するための図である。
【図４】図４は、実施例１に係る情報処理システムが各メモリにマッピングするメモリマップを説明するための図である。
【図５】図５は、実施例１に係る情報処理システムが割当てる共有メモリ領域を説明するための図である。
【図６】図６は、実施例１に係る共有メモリセグメント管理テーブルを説明するための図である。
【図７】図７は、実施例１に係るメモリトークン管理テーブルを説明するための図である。
【図８】図８は、実施例１に係るＣＰＵの一例を説明するための図である。
【図９】図９は、実施例１に係るアクセストークンテーブルのレジスタ構成を説明するための図である。
【図１０】図１０は、アクセストークンテーブルのレジスタフィールドを説明するための図である。
【図１１】図１１は、実施例１に係るメモリトークンチェッカの一例を説明するための図である。
【図１２】図１２は、メモリアクセス要求の一例を説明するための図である。
【図１３】図１３は、オペコードが示す処理の一例を説明するための図である。
【図１４】図１４は、アクセス判定制御器による判定の一例を説明するための図である。
【図１５】図１５は、ホームステートマシンが実行する処理の内容を示す図である。
【図１６】図１６は、ノード間のメモリアクセスの流れを説明するための図である。
【図１７】図１７は、故障したノードからのメモリアクセスを止める処理について説明するための図である。
【図１８】図１８は、故障が生じたノードによるメモリアクセスを防ぐ処理を説明するための第１の図である。
【図１９】図１９は、故障が生じたノードによるメモリアクセスを防ぐ処理を説明するための第２の図である。
【図２０】図２０は、アクセストークンを取得する処理の流れを説明するためのシーケンス図である。
【図２１】図２１は、複数のセグメントに対してアクセスを行う処理の流れを説明するためのシーケンス図である。
【図２２】図２２は、コンテキストスイッチの流れを説明するためのシーケンス図である。
【図２３】図２３は、メモリトークンを変更する処理の流れを説明するためのシーケンス図である。
【図２４】図２４は、メモリトークンを変更する処理のバリエーションを説明するためのシーケンス図である。
【図２５】図２５は、故障したノードを切り離す処理の流れを説明するためのシーケンス図である。
【図２６】図２６は、メモリトークンを変更する処理の流れの一例を説明するためのフローチャートである。
【図２７】図２７は、共有メモリセグメント管理テーブルとメモリトークン管理テーブルとを更新する処理の流れについて説明するためのフローチャートである。
【図２８】図２８は、共有メモリセグメント管理テーブルの更新を説明するための図である。
【図２９】図２９は、メモリトークン管理テーブルの更新を説明するための図である。
【図３０】図３０は、マルチスレッド対応のアクセストークンテーブルの一例を説明するための図である。
【図３１】図３１は、メモリトークンチェッカのバリエーションを説明するための図である。
【図３２】図３２は、予め許可されたノードのみにメモリアクセスを許可するメモリトークンチェッカを説明するための図である。
【図３３】図３３は、クラスタ構成の情報処理システムを説明するための図である。
【図３４】図３４は、ノード間のメモリアクセスを説明するための図である。
【図３５】図３５は、共有メモリ構成の技術が適用された情報処理システムを説明するための図である。
【図３６】図３６は、不正なメモリアクセスを防止する機能を説明するための図である。
【図３７Ａ】図３７Ａは、フェールオーバが正常に実行できない例について説明するための図（１）である。
【図３７Ｂ】図３７Ｂは、フェールオーバが正常に実行できない例について説明するための図（２）である。
【発明を実施するための形態】
【００２１】
以下に添付図面を参照して本願に係る情報処理装置および不正アクセス防止方法について説明する。
【実施例１】
【００２２】
以下の実施例１では、図１を用いて、情報処理システムの一例を説明する。図１は、実施例１に係る情報処理システムを説明するための図である。図１に示す例では、情報処理システム１は、クライアント端末２、クアイアント端末２ａ、ＬＡＮ（Local  Area  Network）スイッチ３、管理端末４、ＬＡＮスイッチ５、２重のグローバルクロスバ６、複数のノード１０〜１０ｍを有する。また、グローバルクロスバ６は、サービスプロセッサ７を有する。
【００２３】
本実施例において、ノードは１つの独立したＯＳ（Ｏｐｅｒａｔｉｎｇ  Ｓｙｓｔｅｍ）が走行する単位であり、ＯＳが走行する為に最低限必要な装置を含む。後に詳細に述べるが、それらは１つ以上のＣＰＵ、メモリ、ＨＤＤ（Hard  Disk  Drive）またはＨＤＤに代わる外部記憶装置を有する。ノードは物理的に単一の装置であっても良いし、ケーブル等の装置間接続機能によって接続されて物理的に複数の装置で構成されていても良い。
【００２４】
各ノード１０〜１０ｍは、サービス用ＬＡＮによってＬＡＮスイッチ３および各クライアント端末２、２ａと接続されている。また、各ノード１０〜１０ｍは、内部ＬＡＮによってＬＡＮスイッチ５と接続されている。また、各ノード１０〜１０ｍは、管理ＬＡＮを介して管理端末４と接続されている。また、各ノード１０〜１０ｍは、２重のグローバルクロスバ６と接続されており、インターコネクトを介して、相互に接続されている。
【００２５】
各クライアント端末２、２ａは、サービス用ＬＡＮを介して各ノード１０〜１０ｍからサービスを取得する。なお、図１では図示を省略したが、情報処理システム１は、任意の数のクライアント端末を他にも有してもよい。
【００２６】
ノード１０は、サービスプロセッサ１１、ＣＰＵ１２、ローカルＸＢ（クロスバ）１６を有する。また、他のノード１０ａ〜１０ｍは、ノード１０と同様に、サービスプロセッサ１１ａ〜１１ｍ、ＣＰＵ１２ａ〜１２ｍ、ローカルＸＢ１６ａ〜１６ｍを有する。
【００２７】
各サービスプロセッサ１１〜１１ｍは、管理ＬＡＮを介して管理端末４と接続されており、各ノード１０〜１０ｍの電源管理等の管理制御を実行する。なお、グローバルクロスバ６が有するサービスプロセッサ７は、各サービスプロセッサ１１〜１１ｍのマスタとして動作し、全体の管理制御を行う。ここで、各サービスプロセッサ７、１１〜１１ｍが実行する管理制御の例としては、電源管理、リセット、動作モードの変更、ノードの追加や削除の設定、エラーログの収集、縮退動作制御等である。
【００２８】
また、ノード１０〜１０ｍは、それぞれ独立してＯＳ（Operating  System）を実行する。また、図１では省略したが、各ノード１０〜１０ｍは、ＣＰＵ１２〜１２ｍ以外にも複数のＣＰＵを有する。各ノード１０〜１０ｍのＣＰＵは、ローカルＸＢ１６〜１６ｍを介して、グローバルクロスバ６と接続されている。
【００２９】
各ノード１０〜１０ｍのＣＰＵは、メモリアクセスのリクエストであるメモリアクセス要求をローカルＸＢ１６〜１６ｍに出力することで、他のノードにメモリアクセス要求を転送する。そして、各ノード１０〜１０ｍのＣＰＵは、メモリアクセス要求を取得すると、自身が自身と接続されたメモリに対してアクセスを行う際と同様にメモリアクセスを実行する。
【００３０】
次に、図２を用いて、各ノード１０〜１０ｍの機能構成について説明する。なお、以下の説明では、ノード１０の機能構成について説明し、各ノード１０ａ〜１０ｍは、ノード１０と同様の処理を実行するものとして、説明を省略する。
【００３１】
図２は、実施例１に係るノードの機能構成を説明するための図である。図２に示す例では、ノード１０は、サービスプロセッサ１１、複数のＣＰＵ１２〜１５、ローカルＸＢ１６、複数のメモリ１７〜２４、ＰＣＩｅ（Peripheral  Component  Interconnect  Express）スイッチ２５を有する。また、ノード１０は、サービス用ＬＡＮと接続するためのＬＡＮアダプタ２６、管理用ＬＡＮと接続するためのＬＡＮアダプタ２７、ＳＡＳ（Serial  Attached  SCSI）２８、ＨＤＤ（Hard  Disk  Drive）２９を有する。
【００３２】
また、メモリ１７およびメモリ１８は、ＣＰＵ１３と接続されており、ＣＰＵ１３によるメモリアクセスを受付ける記憶装置である。また、メモリ１９およびメモリ２０は、ＣＰＵ１２と接続されており、ＣＰＵ１２によるメモリアクセスを受付ける記憶装置である。また、メモリ２１およびメモリ２２は、ＣＰＵ１４と接続されており、ＣＰＵ１４によるメモリアクセスを受付ける記憶装置である。
【００３３】
また、メモリ２３およびメモリ２４は、ＣＰＵ１５と接続されており、ＣＰＵ１５によるメモリアクセスを受付ける記憶装置である。なお、図２に示す例では、ノード１０は、ＨＤＤ２９を有しているが、実施例はこれに限定されるものではなく、ＳＡＮ（Storage  Area  Network）等の技術を適用し、ノード１０の外部に設置してもよい。
【００３４】
サービスプロセッサ１１は、ノード１０の管理制御を実行する。具体的には、サービスプロセッサ１１は、処理を実行するプロセッサとＦＰＧＡ（Field-Programmable  Gate  Array）を有し、管理端末４から管理用ＬＡＮを介して、管理制御の実行命令を受付ける。そして、サービスプロセッサ１１は、管理端末４から受付けた実行命令に従って、各種管理制御を実行する。
【００３５】
ＰＣＩｅスイッチ２５は、各ＣＰＵ１２〜１５からＰＣＩｅスロットを介して接続されるＩ／Ｏ装置等へのアクセスを制御するスイッチである。また、ＬＡＮアダプタ２６は、サービス用ＬＡＮとノード１０とを接続するＬＡＮアダプタである。また、ＬＡＮアダプタ２７は、管理用ＬＡＮとノード１０とを接続するＬＡＮアダプタである。また、ＳＡＳ２８は、ＰＣＩｅスロットに搭載されたＬＡＮやＳＡＳ用のアダプタであり、ＨＤＤ２９と各ＣＰＵ１２〜１５との接続を中継する。
【００３６】
次に、各ＣＰＵ１２〜１５について説明する。なお、以下の説明では、ＣＰＵ１２について説明し、ＣＰＵ１３〜１５は、ＣＰＵ１２と同様の機能を発揮するものとして説明を省略する。
【００３７】
ＣＰＵ１２は、他のＣＰＵ１３〜１５と相互に接続されている。また、ＣＰＵ１２は、メモリ１９またはメモリ２０が記憶するデータをキャッシュするキャッシュメモリを有し、キャッシュしたデータを用いて、演算処理を実行する。また、ＣＰＵ１２は、メモリ１９およびメモリ２０に対してメモリアクセスを行うメモリインターフェースの機能を有する。また、ＣＰＵ１２は、ＰＣＩｅスイッチ２５を介して、ＨＤＤ２９や内部ＬＡＮ、管理用ＬＡＮ等を用いたアクセスを制御するＰＣＩｅインターフェース機能を有する。
【００３８】
また、ＣＰＵ１２は、ローカルＸＢ１６、グローバルクロスバ６を介して、他のノード１０ａ〜１０ｍが有するＣＰＵとインターコネクトで接続され、相互にメモリアクセスの要求等を送受信するインターコネクトルータ機能を有する。このようなＣＰＵ１２は、例えば、実行するプロセスにより、メモリ１９、または、メモリ２０に対するメモリアクセス要求が発行された場合には、以下の処理を実行する。すなわち、ＣＰＵ１２は、メモリ１９、または、メモリ２０にアクセスし、アクセス対象となるデータをキャッシュする。
【００３９】
また、ＣＰＵ１２は、実行するプロセスにより、メモリ１９、メモリ２０以外のメモリに対するメモリアクセス要求が発行された場合には、メモリアクセス対象となるメモリと接続されたＣＰＵを識別し、識別したＣＰＵに対してメモリアクセス要求を送信する。詳細には、ＣＰＵ１２は、アクセス対象となるメモリアドレスと、メモリアドレスが示す記憶領域にアクセスするＣＰＵを一意に示す情報とを対応付けたノードマップを有する。
【００４０】
そして、ＣＰＵ１２は、プロセスがメモリアクセス要求を発行した場合には、ノードマップを参照し、メモリアクセスの対象となるメモリアドレスに対応付けられたＣＰＵを識別する。その後、ＣＰＵ１２は、識別したＣＰＵを宛先とするパケットを生成し、生成したパケットにメモリアクセス要求を格納して、ＣＰＵ１２〜１５の相互接続、又はローカルＸＢ１６に出力する。ローカルＸＢ１６に出力された場合には、ローカルＸＢ１６は、グローバルクロスバ６を介して、パケットを宛先となるＣＰＵに送信する。
【００４１】
ここで、ＣＰＵ１２は、上述した処理に加えて、以下の処理を実行する。まず、ＣＰＵ１２は、メモリ１９およびメモリ２０の各記憶領域のうち、他のノードと共有する記憶領域に、メモリトークンと呼ばれる値を予め設定する。そして、ＣＰＵ１２は、メモリ１９またはメモリ２０に対してメモリアクセス要求を発行するＣＰＵに対し、アクセスを許可する記憶領域を通知するとともに、通知した記憶領域に対応するメモリトークンをアクセストークンとして通知する。
【００４２】
また、ＣＰＵ１２は、自身がメモリアクセス要求を送信するノードから、アクセストークンをあらかじめ取得し、取得したアクセストークンを保持する。そして、ＣＰＵ１２は、メモリアクセス要求を発行する場合には、メモリアクセス要求とともに、保持したアクセストークンをパケットに格納して送信する。
【００４３】
また、ＣＰＵ１２は、他のノードのＣＰＵからメモリアクセス要求を受信した場合は、メモリアクセス要求とともに受信したアクセストークンが、アクセス対象となる記憶領域に対応するメモリトークンと一致するか否かを判別する。そして、ＣＰＵ１２は、アクセストークンとメモリトークンとが一致する場合には、メモリアクセスを実行し、アクセストークンとメモリトークンとが一致しない場合には、メモリアクセスの実行を拒否する。
【００４４】
なお、ＣＰＵ１２は、メモリ１９、および、メモリ２０に対するメモリアクセスを実行する場合には、メモリ１９、または、メモリ２０からキャッシュされたデータのコヒーレンシを保持する処理を実行する。例えば、ＣＰＵ１２は、メモリ１９、または、メモリ２０からデータをキャッシュしたＣＰＵに対してスヌープを送信し、キャッシュされたデータのライトバックを実行する。
【００４５】
ローカルＸＢ１６は、ノード１０が有するＣＰＵ１２〜１５と、他のノード１０ａ〜１０ｍが有するＣＰＵとの間でやり取りされるパケットを、指定相手先に転送するためのスイッチである。例えば、ローカルＸＢ１６は、ＣＰＵ１２が、ＣＰＵ１２ａを宛先として発行したパケットを、グローバルクロスバ６を介して、ノード１０ａが有するＣＰＵ１２ａに送信する。
【００４６】
メモリ１７〜メモリ２４は、ＯＳやアプリケーションが利用するデータを記憶するメモリであり、例えば、ＤＩＭＭ（Dual  In-Line  Memory  Module）である。また、メモリ１７〜２４は、同一のメモリアドレス空間にマッピングされている。
【００４７】
また、メモリ１７〜２４は、同一ノード内のＣＰＵ１２〜１５のみがアクセス可能な領域、すなわち、自身を有するノード専用の領域であるローカル領域を有する。また、メモリ１７〜２４は、情報処理システム１が有する任意のＣＰＵがアクセス可能な領域、すなわち、全てのノードが利用可能な共有メモリ領域を有する。また、メモリ１７〜メモリ２４の共有メモリ領域は、複数のセグメントに分割される。そして、各セグメントは、メモリトークンによるアクセス制御が行われるプロテクト領域、又は、メモリトークンによるアクセス制御を行わないノンプロテクト領域となる。
【００４８】
ここで、図３、図４を用いて、各メモリ１７〜２４にマッピングされるメモリアドレスについて説明する。図３は、実施例１に係るメモリの割当を説明するための図である。例えば、情報処理システム１は、各ノードが有する２つのメモリのうち、一方のメモリをローカル領域のみのメモリとし、他方のメモリを共用メモリ領域のみのメモリとする。すなわち、図３中（Ａ）に示すように、メモリ１７、メモリ１９、メモリ２１、メモリ２３をノード専用のメモリとし、図３中（Ｂ）に示すように、メモリ１８、メモリ２０、メモリ２２、メモリ２４を共用するメモリとする。
【００４９】
図４は、実施例１に係る情報処理システムが各メモリにマッピングするメモリマップを説明するための図である。なお、図４には、全部で１２８テラバイトのメモリアドレス空間が準備され、そのうちローカル領域に６４テラバイトが割当てられ、共有メモリ領域に６４テラバイトが割当てられる例について示す。
【００５０】
例えば、情報処理システム１は、ノード１０〜１０ｍが有するメモリのうち、ローカル領域として用いる範囲に「０」から「２４６−１」までのメモリアドレスを割当てる。また、情報処理システム１は、ノード１０〜１０ｍが有するメモリのうち、共有メモリ領域として用いる範囲に、「２４６」から「２４7−１」までのメモリアドレスを割当てる。
【００５１】
すなわち、図３および図４に示す例では、情報処理システム１は、図３中（Ａ）に示すメモリ１７、メモリ１９、メモリ２１、メモリ２３に対して、図４中（Ｃ）に示す範囲のメモリアドレスをマッピングする。また、情報処理システム１は、図３中（Ｂ）に示すメモリ１８、メモリ２０、メモリ２２、メモリ２４に対して、図４中（Ｄ）に示す範囲のメモリアドレスをマッピングする。なお、図４中の「２４7」から「２４8−１」までのアドレスは、ＵＣ（Uncacheable）領域として用いられるアドレスの範囲であり、例えば、ＨＤＤ２９等のＩ／Ｏ装置が用いるＩ／Ｏ空間として用いられるアドレスの範囲である。
【００５２】
このように、情報処理システム１は、各ノード１０〜１０ｍが有するメモリに対して、単一のメモリアドレス空間をマッピングする。このため、任意のＣＰＵが任意のノードの共有メモリ領域に対して直接アクセスできる。なお、図４に示すメモリマップはあくまで一例であり、任意の割当を行うこととしても良い。
【００５３】
すなわち、メモリマップ上のメモリアドレスの全てがメモリに割当てられている必要はなく、メモリホールが存在しても良い。また、情報処理システム１が有する各ノードにＯＳが利用するローカル領域が存在し、かつ、１つ以上のノードに共有メモリ領域が存在するように、メモリマップを設定すればよい。
【００５４】
なお、情報処理システム１は、１つのノード内に含まれるメモリ（例えば、メモリ１７とメモリ１８）に対して連続するメモリアドレスをマップした場合は、制御資源を削減することができる。また、情報処理システム１は、少なくとも、セグメント領域のアライメントをそろえることができるようにメモリアドレスの割り当てを行う。
【００５５】
次に、図５を用いて、各ノードのメモリに対して割当てられる共有メモリ領域について説明する。図５は、実施例１に係る情報処理システムが割当てる共有メモリ領域を説明するための図である。なお、図５に示す例では、情報処理システム１がノード＃０〜＃ｎを有し、各ノード＃０〜＃ｎに対して共有メモリ領域を振り分ける例について説明する。
【００５６】
例えば、図５中（１）に示すように、情報処理システム１は、６４テラバイトのローカル領域と、６４テラバイトのメモリ領域とを、各ノード＃０〜＃ｎに対して割当てる。詳細には、情報処理システム１は、図５中（２）に示すように、６４テラバイトの共有メモリ領域を、各ノード＃０〜＃ｎに対して均等に振り分ける。
【００５７】
ここで、各ノード＃０〜＃ｎは、振り分けられた共有メモリ領域を、プロテクト領域とノンプロテクト領域とに分ける。ここで、プロテクト領域とは、他のノードからメモリアクセス要求を受信した際に、アクセストークンとメモリトークンとが一致するか否かを判別することで、アクセス保護を行う領域である。また、ノンプロテクト領域とは、他のノードから自由にメモリアクセスを行うことができる領域である。
【００５８】
例えば、図５中（３）に示すように、ノード＃１は、自身に割当てられた共有メモリ領域のうち、最大で４テラバイトをプロテクト領域、または、ノンプロテクト領域とすることができる。また、図５中（４）に示すように、ノード＃１は、共有メモリ領域をセグメント＃０〜＃２０４７までの２ギガバイトのセグメントに分割する。そして、ノード＃１は、図５中（５）に示すように、セグメントごとにメモリトークンを設定する。
【００５９】
また、図５に示す例では、ノード＃１は、セグメント＃０〜＃２をプロテクト領域とし、メモリトークンを設定する。なお、メモリトークンは、例えば、１３ビットの値である。また、図５に示す例では、ノード＃１は、セグメント＃３〜＃２０４７をノンプロテクト領域とし、メモリトークンとして、「ａｌｌ０」を設定する。すなわち、各ノード＃０〜＃ｎは、ノンプロテクト領域に対してアクセスを行う場合には、「ａｌｌ０」のアクセストークンを用いることで、アクセスを行うことができる。
【００６０】
また、ノード＃ｍも、自身の共有メモリ領域をセグメント＃０〜＃２０４７に分割し、各セグメント＃０〜＃２０４７にメモリトークンを設定する。なお、ノード＃ｍが自身の各セグメント＃０〜＃２０４７に対して設定したメモリトークンは、図５中（６）に示すように、ノード＃１がアクセストークンとして用いることとなる。このため、ノード＃１は、ノード＃ｍの共有メモリ領域にアクセスする場合には、ノード＃ｍが設定したメモリトークンを取得し、取得したメモリトークンをアクセストークンとして用いることで、ノード＃ｍの共有メモリ領域にアクセスを行う。
【００６１】
なお、各ノード＃０〜＃ｎは、共有メモリ領域の各セグメントを管理するための共有メモリセグメント管理テーブルをローカル領域に有する。また、各ノード＃０〜＃ｎは、同一のメモリトークンを複数のセグメントに設定することを防ぐため、設定済みのメモリトークンを管理するメモリトークン管理テーブルをローカル領域に有する。以下、図６および図７を用いて、共有メモリセグメント管理テーブルと、メモリトークン管理テーブルとについて説明する。
【００６２】
まず、図６を用いて、共有メモリセグメント管理テーブルの一例を説明する。図６は、実施例１に係る共有メモリセグメント管理テーブルを説明するための図である。なお、図６には、ノード＃２が有する共有メモリセグメント管理テーブルを示す。図６に示すように、共有メモリセグメント管理テーブルは、セグメント番号、使用フラグ、アプリＩＤ、使用ノードフラグ、トークンが格納される。
【００６３】
ここで、セグメント番号とは、共有メモリ領域の各セグメントを示す番号である。使用フラグとは、各セグメントが使用されているか否かを示すフラグである。アプリＩＤとは、各セグメントを利用しているプロセスを一意に示すＩＤである。また、使用ノードフラグとは、各セグメントを利用しているノードを示すフラグである。また、トークンとは、各セグメントに対して設定されたメモリトークンである。
【００６４】
図６に示す例では、ノード＃２のセグメント＃０およびセグメント＃１は、ノード＃１が実行するプロセスのうち、アプリＩＤ「１００」が示すプロセスによって使用されており、メモリトークンがそれぞれ「３０１５」、「２１５６」であることを示す。また、ノード＃２のセグメント＃２は、使用されておらず、セグメント＃３は、ノード＃３が実行するプロセスのうち、アプリＩＤ「１５０」が示すプロセスによって使用されており、メモリトークンが「ａｌｌ０」であることを示す。すなわち、セグメント＃３は、ノンプロテクト領域であることを示す。
【００６５】
各ノード＃０〜＃ｎは、図６に例示した共有メモリセグメント管理テーブルを用いて、他ノードから受信したメモリアクセスを実行する。例えば、ノード＃２は、ノード＃１のアプリＩＤ「１００」が示すプロセスから、アクセストークン「３０１５」とともにセグメント＃０に対するメモリアクセス要求を取得する。このような場合には、取得したアクセストークンと共有メモリセグメント管理テーブルに格納されたメモリトークンが一致するので、ノード＃２は、メモリアクセスを実行する。
【００６６】
一方、ノード＃２は、ノード＃１のアプリＩＤ「１００」が示すプロセスから、アクセストークン「３０００」とともにセグメント＃０に対するメモリアクセス要求を取得した場合は、メモリトークンとアクセストークンとが一致しないと判別する。このため、ノード＃２は、メモリアクセス要求を実行しない。
【００６７】
なお、各ノード＃０〜＃ｎは、いずれかのセグメントについてメモリトークンを変更する場合は、共有メモリセグメント管理テーブルを参照し、変更するメモリトークンと対応するセグメントを利用中のノードを識別する。そして、各ノード＃０〜＃ｎは、識別したノードに対して、新たなメモリトークンを通知する。
【００６８】
なお、共有メモリセグメント管理テーブルは、任意のタイミングで、共有メモリの管理を行うドライバソフトである共有メモリドライバが設定することとしても良い。例えば、共有メモリドライバは、情報処理システム１のブート時や、共有メモリ領域に対する初回アクセス時に、共有メモリセグメント管理テーブルを作成する。
【００６９】
次に、図７を用いて、メモリトークン管理テーブルについて説明する、図７は、実施例１に係るメモリトークン管理テーブルを説明するための図である。図７に示す例では、メモリトークン管理テーブルは、メモリトークンの値と、使用フラグと、アプリＩＤとを対応付けて記憶する。なお、図７には、ノード＃１が記憶するメモリトークン管理テーブルを示す。
【００７０】
例えば、図７に示す例では、メモリトークン管理テーブルは、アプリＩＤ「１００」が示すプロセスが利用するセグメントに対して、メモリトークン「０」とメモリトークン「１」とを振り分けている旨を示す。また、メモリトークン管理テーブルは、メモリトークン「２」をいずれのセグメントに対しても振り分けていない旨を示す。また、メモリトークン管理テーブルは、アプリＩＤ「１５０」が示すプロセスが利用するセグメントに対して、メモリトークン「３」を振り分けている旨を示す。なお、メモリトークン管理テーブルは、共有メモリセグメント管理テーブルと同様に、共有メモリドライバが任意のタイミングで作成することとしてよい。
【００７１】
次に、図８を用いて、ＣＰＵ１２の詳細な機能構成の一例について説明する。図８は、実施例１に係るＣＰＵの一例を説明するための図である。なお、図８に示す例では、ＣＰＵ１２は、複数のコアを有するマルチコアプロセッサであり、Ｌ１（Level  1）キャッシュ、Ｌ２キャッシュ、およびメモリアクセスコントローラ（ＭＡＣ）を内臓したプロセッサとして記載する。
【００７２】
図８に示すように、ＣＰＵ１２は、複数のコア３０ａ、３０ｄ、Ｌ１キャッシュ３０ｂ、３０ｅ、複数のＴＬＢ（Translation  Lookaside  Buffer）３０ｃ、３０ｆ、を有する。またＣＰＵ１２は、各コア３０ａ、３０ｄごとに、アクセストークンテーブル３１、３１ａを有する。また、ＣＰＵ１２は、Ｌ２（Level2）キャッシュタグ３２、Ｌ２キャッシュ３２ａ、キャッシュスヌープコントローラ３３、メモリリクエストステートマシン３４、アドレスマップ３５、メモリアクセスポート３６、ターゲットアドレスチェッカ３７を有する。
【００７３】
また、ＣＰＵ１２は、メモリトークンチェッカ３８、ホームステートマシン３９、メモリアクセスコントローラ４０、非キャッシュリクエストステートマシン４１、ＰＣＩｅインターフェース４２、エラーレジスタ４３を有する。また、ＣＰＵ１２は、レジスタコントローラ４４、ルータ４６を有する。ここで、レジスタコントローラ４４は、リクエストレジスタ４５を有する。なお、図８では、コア３０ａ、コア３０ｄ以外のコアについては、図示を省略したが、ＣＰＵ１２は、任意の数のコアを有する構成とすることができる。
【００７４】
コア３０ａ、３０ｄは、Ｌ１キャッシュ３０ｂ、３０ｅに格納されたデータを用いて、演算処理を実行する。Ｌ１キャッシュ３０ｂ、３０ｅは、高速にアクセス可能な記憶装置であり、メモリ１９、２０に格納されたデータをキャッシュするキャッシュメモリである。ＴＬＢ３０ｃ、３０ｆは、コア３０ａ、３０ｄが出力する仮想アドレスを物理アドレスに変換する。
【００７５】
アクセストークンテーブル３１は、コア３０ａが実行するプロセスが共有メモリ領域にアクセスするためのアクセストークンを記憶するレジスタである。例えば、アクセストークンテーブル３１には、コア３０ａが実行するアプリケーションによって、他のノードから通知されたアクセストークンがセットされる。
【００７６】
また、コア３０ａは、アクセス対象のデータがＬ１キャッシュ３０ｂに保持されていなかった場合には、アクセス対象の物理アドレスとメモリアクセス要求の内容を示すオペコードとを出力する。すると、アクセストークンテーブル３１は、セットされたアクセストークンとメモリアクセス要求とをＬ２キャッシュタグ３２に出力する。
【００７７】
ここで、アクセストークンテーブル３１は、コア３０ａが実行するプロセスを変更する際に、コンテキストスイッチを行う対象となるレジスタである。このため、ＣＰＵ１２は、コア３０ａが実行するプロセスを他のプロセスに変更する際に、アクセストークンテーブル３１にセットされたアクセストークンを容易に変更することができる。すなわち、ＣＰＵ１２は、コア３０ａが実行するプロセスを変更する際に、アクセス対象のノードから再度アクセストークンテーブルの通知を受けずとも、コンテキストスイッチを行えば、迅速かつ容易にアクセストークンを変更することができる。
【００７８】
Ｌ２キャッシュタグ３２は、Ｌ２キャッシュ３２ａのタグであり、Ｌ２キャッシュ３２ａにアクセスするためのパイプラインである。なお、Ｌ２キャッシュタグ３２は、各コア３０ａ、３０ｄが発行した同一のアドレスに対するメモリアクセス要求をシリアライズ処理する機構を有する。
【００７９】
キャッシュスヌープコントローラ３３は、Ｌ２キャッシュ３２ａのスヌープを制御する。具体的には、キャッシュスヌープコントローラ３３は、ホームステートマシン３９、または、他のノードが発行したスヌープを受付ける。すると、キャッシュスヌープコントローラ３３は、Ｌ２キャッシュタグ３２に対してスヌープを発行することで、Ｌ２キャッシュ３２ａがキャッシュするデータの状態を検査する。その後、キャッシュスヌープコントローラ３３は、スヌープの発行元であるホームステートマシン３９、または、他のノードに対して、Ｌ２キャッシュ３２ａのスヌープ結果を送信する。
【００８０】
メモリリクエストステートマシン３４は、Ｌ２キャッシュ３２ａにアクセス対象となるデータが格納されていなかった場合、すなわち、Ｌ２キャッシュミスした際に以下の処理を実行する。すなわち、メモリリクエストステートマシン３４は、ホームステートマシン３９へのメモリアクセス要求の発行、および、応答の取得までの管理を実行する。
【００８１】
また、メモリリクエストステートマシン３４は、メモリアクセス要求を発行してから応答を取得するまでの間に、同一のメモリアドレスを対象とするメモリアクセス要求を取得した場合は、後段のメモリアクセス要求を待機させる。そして、メモリリクエストステートマシン３４は、前段のメモリアクセス要求の応答が発行された場合は、待機させたメモリアクセス要求を発行する。なお、メモリリクエストステートマシン３４は、複数のエントリを有し、エントリごとの識別子である８ビットのエントリＩＤをメモリリクエスト要求に付加して発行する。
【００８２】
また、メモリリクエストステートマシン３４は、メモリアクセス要求の対象となる物理アドレスを、アドレスマップ３５に出力することで、物理アドレスが示す記憶領域にアクセスするＣＰＵの識別子を取得する。そして、メモリリクエストステートマシン３４は、ＣＰＵの識別子をＤＩＤ（Destination  ID）、すなわち宛先として、メモリアクセス要求を発行する。
【００８３】
アドレスマップ３５は、物理アドレスと、物理アドレスが示す記憶領域にアクセスするＣＰＵの識別子とを対応付けて記憶し、物理アドレスをＣＰＵの識別子に変換する。例えば、アドレスマップ３５は、メモリリクエストステートマシン３４から物理アドレスを取得した場合には、取得した物理アドレスと対応付けて記憶されたＣＰＵの識別子をＤＩＤとしてメモリリクエストステートマシン３４に発行する。
【００８４】
メモリアクセスポート３６は、メモリ１９、メモリ２０に対するメモリアクセス要求、すなわち、ホームノード（自ノード）に対するメモリアクセス要求を受付けるポートである。例えば、メモリアクセスポート３６は、ＦＩＦＯであり、ホームノードに対するメモリアクセス要求を一時的に保持する。そして、メモリアクセスポート３６は、ホームステートマシン３９がメモリアクセス要求を実行可能な状態になった場合には、ターゲットアドレスチェッカ３７、メモリトークンチェッカ３８、ホームステートマシン３９に対して、保持したメモリアクセス要求を発行する。
【００８５】
ターゲットアドレスチェッカ３７は、メモリアクセスポート３６から、メモリアクセス要求のアクセス対象となるメモリアドレスが自ノードのメモリ、すなわちメモリ１９およびメモリ２０のメモリアドレスであるか否かを判別する。そして、ターゲットアドレスチェッカ３７は、判別結果をホームステートマシン３９に通知する。
【００８６】
メモリトークンチェッカ３８は、メモリアクセス要求のアクセス対象となるメモリアドレスに設定されたメモリトークンと、メモリアクセス要求とともに発行されたアクセストークンとが一致するか否かを判別する。そして、メモリトークンチェッカ３８は、メモリトークンとアクセストークンとが一致する場合には、アクセスの許可を示す信号をホームステートマシン３９に発行する。また、メモリトークンチェッカ３８は、メモリトークンとアクセストークンとが一致しなかった場合には、アクセスの不許可を示す信号をホームステートマシン３９に発行する。
【００８７】
なお、メモリトークンチェッカ３８は、メモリトークンを記憶するメモリトークンレジスタを有しており、レジスタコントローラ４４によって、メモリトークンの設定や更新が行われる。
【００８８】
ホームステートマシン３９は、メモリアクセス要求とともに発行されたアクセストークンがメモリトークンと一致するか否かに応じて、メモリアクセスを実行する。具体的には、ホームステートマシン３９は、メモリアクセスポート３６からメモリアクセス要求を取得する。また、ホームステートマシン３９は、ターゲットアドレスチェッカ３７から、メモリアクセス要求の対象が自ノードであるか否かを示す判別結果を取得する。また、ホームステートマシン３９は、メモリトークンチェッカ３８から、アクセスの許可を示す信号、または、アクセスの不許可を示す信号を取得する。
【００８９】
そして、ホームステートマシン３９は、メモリアクセス要求の対象が自ノードである旨の判別結果を取得し、かつ、アクセスの許可を示す信号を取得した場合には、メモリアクセスを実行する。また、ホームステートマシン３９は、メモリアクセス要求の対象が自ノードではない旨の判別結果を取得した場合、または、アクセスの不許可を示す信号を取得した場合には、メモリアクセス要求を実行せず、後述するアクセス例外処理を実行する。また、ホームステートマシン３９は、アクセスの不許可を示す信号を取得した場合には、メモリトークンとアクセストークンとが一致しない旨を示すトークン不一致エラーをエラーレジスタ４３に格納する。
【００９０】
なお、ホームステートマシン３９は、メモリアクセスを実行する場合は、以下の処理を実行する。まず、ホームステートマシン３９は、メモリアクセス要求の対象となる物理アドレスをメモリアクセスコントローラ４０に発行し、メモリアクセス要求の対象となるデータをメモリ１９、または、メモリ２０から取得する。次に、ホームステートマシン３９は、ディレクトリ情報を用いて、取得したデータのキャッシュ状態を判定する。
【００９１】
そして、ホームステートマシン３９は、判定結果に応じて、スヌープの発行等を行い、取得したデータと、キャッシュされたデータとを一致させる処理を実行する。なお、取得したデータとキャッシュされたデータとを一致させる処理については、コヒーレンシを保持する従来の方法を適用するものとする。その後、ホームステートマシン３９は、読出しや書込み等のメモリアクセスを実行し、その後、発行元に対して、メモリアクセスの完了応答を送信する。
【００９２】
メモリアクセスコントローラ４０は、メモリ１９およびメモリ２０に対してメモリアクセスを実行する。例えば、メモリアクセスコントローラ４０は、ホームステートマシン３９から物理アドレスとデータの読出し指示を取得する。すると、メモリアクセスコントローラ４０は、物理アドレスが示す記憶領域に格納されたデータをホームステートマシン３９に送信する。
【００９３】
また、メモリアクセスコントローラ４０は、ホームステートマシン３９から物理アドレスと書込み指示とデータとを取得した場合には、取得したデータを取得した物理アドレスが示す記憶領域に書込む。なお、メモリアクセスコントローラ４０は、パトロール機能やコレクトライト等の処理を実行する機能を有しても良い。
【００９４】
非キャッシュリクエストステートマシン４１は、ＣＰＵ１２が有する各コア３０ａ、３０ｄや、他のＣＰＵが有するコアから、ＵＣ領域のメモリアドレスによる指示を受付け、ＰＣＩｅを介した処理の設定等を実行する。
【００９５】
例えば、非キャッシュリクエストステートマシン４１は、各コア３０ａ、３０ｄがＨＤＤ２９等のＩ／Ｏ装置に対する読出しや書込みのリクエストを取得した場合には、取得したリクエストをＰＣＩｅインターフェース４２に発行する。そして、非キャッシュリクエストステートマシン４１は、ＰＣＩｅインターフェース４２からリクエストの応答を取得した場合には、取得した応答をコア３０ａ、３０ｄに送信する。
【００９６】
また、非キャッシュリクエストステートマシン４１は、レジスタコントローラ４４に対するリクエストを各コア３０ａ、３０ｄから取得する。このような場合には、非キャッシュリクエストステートマシン４１は、取得したリクエストをレジスタコントローラ４４に発行する。また、非キャッシュリクエストステートマシン４１は、レジスタコントローラ４４から、リクエストの応答を取得した場合には、取得した応答をコア３０ａ、３０ｄに送信する。
【００９７】
なお、非キャッシュリクエストステートマシン４１は、レジスタコントローラ４４を介して、サービスプロセッサ１１から、アドレスマップの設定要求を取得した場合には、取得した要求に従ってアドレスマップ３５の設定を行う機能を有する。
【００９８】
ＰＣＩｅインターフェース４２は、ＰＣＩｅスイッチ２５と接続されており、ＰＣＩｅのルートコンプレックスである。例えば、ＰＣＩｅインターフェース４２は、非キャッシュリクエストステートマシン４１からＩ／Ｏ装置等に対するリクエストを取得した場合には、取得したリクエストをＰＣＩｅスイッチ２５を介して、Ｉ／Ｏ装置等に発行する。そして、ＰＣＩｅインターフェース４２は、ＰＣＩｅスイッチ２５を介して、応答を取得した場合には、取得した応答を非キャッシュリクエストステートマシン４１に送信する。
【００９９】
なお、ＰＣＩｅインターフェース４２は、ＤＭＡ（Direct  Memory  Access）の機能を有しており、任意のＣＰＵに対してＤＭＡリクエストを発行することができる。また、ＰＣＩｅインターフェース４２は、他のノードからＤＭＡリクエストを取得した場合には、ＤＭＡリクエストを実行し、その後、ＤＭＡ応答をリクエスト元に発行する。
【０１００】
エラーレジスタ４３は、ＣＰＵ１２内において発生したエラーの情報を保持するレジスタである。レジスタコントローラ４４は、ＣＰＵ１２が有する各レジスタの書込みや読出しを行うコントローラである。例えば、エラーレジスタ４３は、物理アドレスをレジスタアドレスに変換する機能を有する。
【０１０１】
そして、レジスタコントローラ４４は、非キャッシュリクエストステートマシン４１等から、物理アドレスで指定されたレジスタの読出し要求や書込み要求を取得する。その後、レジスタコントローラ４４は、指定された物理アドレスをレジスタアドレスに変換し、レジスタアドレスが示すレジスタの書込みや読出しを実行する。
【０１０２】
また、レジスタコントローラ４４は、リクエストレジスタ４５を有し、サービスプロセッサ１１からＩ２ＣやＪＴＡＧ等を介してリクエストレジスタ４５の読出しや、書込み要求を取得する。このような場合には、レジスタコントローラ４４は、取得した要求を実行し、サービスプロセッサ１１に応答を出力する。例えば、レジスタコントローラ４４は、各コア３０ａ、３０ｄが実行するプロセスから、非キャッシュリクエストステートマシン４１を介して、メモリトークンの変更を指示された場合には、後述するメモリトークンレジスタを更新する。
【０１０３】
ルータ４６は、インターコネクト用のルータであり、ＤＩＤで指定された宛先ＣＰＵへパケットを送信する。なお、ルータ４６は、パケットを送信する場合には、送信するパケット保護のため、ＣＲＣ（Cyclic  Redundancy  Check）の付加等を行う。
【０１０４】
なお、図８に示す例では、スヌープを「Ｓｎｏｏｐ」と記載し、応答を「Ｒｅｓｐｏｎｓｅ」、または「Ｒｓｐ」と記載し、物理アドレスを「Ａｄｄｒｅｓｓ」と記載し、メモリトークン、または、アクセストークンを「Ｔｏｋｅｎ」と記載した。また、図８に示す例では、オペコードを「ｏｐ  ｃｏｄｅ」と記載した。また、メモリリクエストステートマシン３４が発行するメモリアクセス要求、すなわち、自ノードによるリクエストを「Ｈｏｍｅ  Ｒｅｑｕｅｓｔ」と記載した。
【０１０５】
また、メモリアクセス要求を「ＭＥＭ  Ｒｅｑ」と記載し、メモリアクセス要求に対する応答を「ＭＥＭ  Ｒｅｐ」と記載した。特に、メモリアクセス要求に対する自ノードのメモリからの応答を「ＭＥＭ  Ｒｅｐ  ｆｒｏｍ  ｏｗｎ」と記載し、他ノードのメモリからの応答を「ＭＥＭ  Ｒｅｐ  ｆｒｏｍ  ｏｔｈｅｒ」と記載した。また、他ノードからのメモリアクセス要求に対する応答を「ＭＥＭ  Ｒｅｐ  ｔｏ  ｏｔｈｅｒ」と記載した。
【０１０６】
また、他ノードからのスヌープを「Ｓｎｏｏｐ  ｆｒｏｍ  ｏｔｈｅｒ」と記載し、他ノードへ送信するスヌープを「Ｓｎｏｏｐ  ｔｏ  ｏｔｈｅｒ」と記載した。また、自身が有するＬ２キャッシュメモリに対して発行したスヌープを「Ｓｎｏｏｐ  ｔｏ  ｏｗｎ」と記載し、自身が有するＬ２キャッシュメモリに対して発行したスヌープの応答を「Ｓｎｏｏｐ  ｒｅｐ  ｔｏ  ｏｗｎ」と記載した。また、他ノードへ送信したスヌープに対する応答を「ｓｎｏｏｐ  ｒｅｐ  ｆｒｏｍ  ｏｔｈｅｒ」と記載し、他ノードへ送信するスヌープの応答を「ｓｎｏｏｐ  ｒｅｐ  ｔｏ  ｏｔｈｅｒ」と記載した。
【０１０７】
また、非キャッシュリクエストステートマシン４１が送受信するリクエストおよび応答を「ＮＣ（No  Coherence）  Ｒｅｑ／ＮＣ  Ｒｅｓｐｏｎｓｅ」と記載した。また、レジスタコントローラ４４が送受信するレジスタの読出し要求や、書込み要求、および応答を「ＲＥＧ  Ｒ／Ｗ  ＲＥＱ  ａｎｄ  Ｒｅｓｐｏｎｓｅ」と記載した。また、レジスタコントローラ４４が行うレジスタの読出しや書込みを「Ｒｅｇｉｓｔｅｒ  Ｒ／Ｗ  ａｎｄ  Ｒｅｓｐｏｎｓｅ」と記載した。また、ＰＣＩｅインターフェース４２を介する要求および応答を「ＰＣＩ  ＣＮＦＧ  Ｒｅｑ  ａｎｄ  Ｒｅｓｐｏｎｓｅ」と記載した。また、ＤＭＡリクエストを「ＤＭＡ  Ｒｅｑｕｅｓｔ」と記載し、ＤＭＡ応答を「ＤＭＡ  Ｒｅｓｐｏｎｓｅ」と記載した。
【０１０８】
次に、図９を用いて、ＣＰＵ１２が有するレジスタとしてのアクセストークンテーブル３１について説明する。図９は、実施例１に係るアクセストークンテーブルのレジスタ構成を説明するための図である。図９に示すように、ＣＰＵ１２は、コア３０ａから直接書込み可能な複数のＡＳＩ（Address  Space  Identifier）レジスタ４７〜４７ｃを有する。また、ＣＰＵ１２は、ＡＳＩレジスタの１つをアクセストークンテーブル３１として利用する。
【０１０９】
ここで、図１０は、アクセストークンテーブルのレジスタフィールドを説明するための図である。図１０に示す例では、アクセストークンテーブル３１は、「０」から「３１」までの３２ビットのフィールドを有し、「３１」〜「１３」ビットまでをリザーブとする。また、アクセストークンテーブル３１は、「１２」〜「０」ビットまでをアクセストークンを格納するフィールドとして用いる。
【０１１０】
ここで、アクセストークンテーブル３１は、「１２」〜「０」ビットまでの１３ビットをアクセストークンとする。すなわち、アクセストークンテーブル３１は、セグメントと同数のアクセストークンを設定した場合は、アクセスフリー用のアクセストークンを設定することができなくなる。そこで、アクセストークンテーブル３１は、セグメントよりも多い数のアクセストークンを設定する。
【０１１１】
図９に戻って、コア３０ａは、各ＡＳＩレジスタ４７〜４７ｃ、およびアクセストークンテーブル３１に対して、「ＡＳＩ  Ｒｅｇ  Ｒ／Ｗ  ｃｏｍｍａｎｄ」と「Ａｄｄｒｅｓｓ［１１：２］」と、「Ｂｙｔｅ  Ｅｎａｂｌｅ［３：０］」とを発行する。ここで「ＡＳＩ  Ｒｅｇ  Ｒ／Ｗ  ｃｏｍｍａｎｄ」は、各ＡＳＩレジスタ４７〜４７ｃ、およびアクセストークンテーブル３１の読出し、または、書込みを指示するコマンドである。
【０１１２】
また、「Ａｄｄｒｅｓｓ［１１：２］」とは、メモリアクセス要求の対象となる仮想アドレスである。また、「Ｂｙｔｅ  Ｅｎａｂｌｅ［３：０］」とは、イネーブルを示すビットである。なお、コア３０ａは、各ＡＳＩレジスタ４７〜４７ｃ、アクセストークンテーブル３１に、書込みを指示する場合には、「ＡＳＩ  Ｒｅｇ  ｗｒｉｔｅ  ｄａｔａ［３１：０］」を同時に発行する。
【０１１３】
ＡＳＩレジスタ４７〜４７ｃは、読出しを指示するコマンドを取得すると、「Ｒｅａｄ  Ｄａｔａ  Ｒｅｇ  Ａ［３１：０］」〜「Ｒｅａｄ  Ｄａｔａ  Ｒｅｇ  Ｘ［３１：０］」を発行する。また、アクセストークンテーブル３１は、「Ｒｅａｄ  Ｄａｔａ  Ｒｅｇ  ＡＫＴ［０：３１］」を出力する。その後、コア３０ａは、「Ｒｅａｄ  Ｄａｔａ  Ｒｅｇ  Ａ［３１：０］」〜「Ｒｅａｄ  Ｄａｔａ  Ｒｅｇ  Ｘ［３１：０］」、「Ｒｅａｄ  Ｄａｔａ  Ｒｅｇ  ＡＫＴ［０：３１］」に基づく「Ｒｅａｄ  Ｄａｔａ［３１：０］」を取得する。
【０１１４】
ここで、アクセストークンテーブル３１は、読出しを指示するコマンドを取得すると、アクセストークン［１２：０］を出力する。また、Ｌ１キャッシュ３０ｂは、コア３０ａからメモリアクセス要求である「ＭＥＭ  ＲＥＱ」を受信すると、キャッシュヒットするか判別する。そして、Ｌ１キャッシュ３０ｂは、キャッシュヒットした場合には、キャッシュヒットしたデータを「ＭＥＭ  ＲＥＱ  Ｌ１  ＨＩＴ  応答」としてコア３０ａに送信する。
【０１１５】
一方、Ｌ１キャッシュ３０ｂは、キャッシュミスした場合は、メモリアクセス要求をＴＬＢ３０ｃに送信する。ＴＬＢ３０ｃは、メモリアクセス要求の対象となる仮想アドレスを物理アドレスに変換し、メモリアクセス要求をＬ２キャッシュタグ３２に発行する。Ｌ２キャッシュタグ３２は、メモリアクセス要求の対象となる物理アドレスがキャッシュヒットするか判別し、キャッシュヒットした場合には、データをＴＬＢ３０ｃを介して、Ｌ１キャッシュ３０ｂ、コア３０ａに送信する。
【０１１６】
一方、Ｌ２キャッシュ３２は、キャッシュミスした場合には、メモリアクセス要求をメモリリクエストステートマシン３４に送信する。この際、メモリアクセス要求には、アクセストークンテーブル３１が発行したアクセストークン［１２：０］が付与され、「Ｈｏｍｅ  Ｒｅｑｕｅｓｔ」として、メモリリクエストステートマシン３４に送信される。なお、コア３０ａが発行する「ＮＣ  Ｒｅｑｕｅｓｔ」は、ＴＬＢ３０ｃを介して非キャッシュリクエストステートマシン４１によって実行され、「ＮＣ  Ｒｅｓｐｏｎｓｅ」がコア３０ａに発行される。
【０１１７】
次に、図１１を用いて、メモリトークンチェッカ３８の構成例について説明する。図１１は、実施例１に係るメモリトークンチェッカの一例を説明するための図である。図１１に示す例では、メモリトークンチェッカ３８は、自ノードＩＤレジスタ３８ａ、メモリトークンレジスタ３８ｂ、オペコードトークンデコーダー３８ｃ、アクセス判定制御器３８ｄを有する。なお、図１１に示す例では、１つのノードに４つのＣＰＵが含まれる例について説明する。また、メモリトークンレジスタ３８ｂは、図１０に示すアクセストークンレジスタと同様のレジスタを、５１２エントリ分有するレジスタであるものとする。
【０１１８】
例えば、メモリトークンチェッカ３８は、レジスタコントローラ４４から、「Ｒｅｇ  Ｒ／Ｗ  ｃｏｍｍａｎｄ」、「Ａｄｄｒｅｓｓ［１１：２］」、「Ｂｙｔｅ  Ｅｎａｂｌｅ［３：０］」、「Ｗｒｉｔｅ  Ｄａｔａ［３１：０］」を取得する。また、トークンチェッカ３１は、レジスタコントローラ４４から「ＳＩＤ（Sender  ID）［７：３］」を取得する。ここで、「ＳＩＤ（Sender  ID）［７：３］」とは、メモリリクエスト要求の要求元となるＣＰＵを示す識別子である。
【０１１９】
また、メモリトークンチェッカ３８は、メモリアクセスポート３６からメモリアクセス要求を取得する。ここで、図１２は、メモリアクセス要求の一例を説明するための図である。図１２に示すように、メモリアクセス要求のパケットには、フォーマット、送信先ＩＤ、オペコード、送信元ＩＤ、エントリＩＤ、トークン、対象アドレスが格納される。ここで、フォーマットには、パケットのフォーマットタイプを示す４ビットの情報が格納される。
【０１２０】
送信先ＩＤには、送信先のＣＰＵを示すＩＤ、すなわち８ビットのＤＩＤが格納される。オペコードには、メモリアクセス要求の内容を示す４ビットの情報が格納される。トークンには、１６ビットのアクセストークンが格納される。対象アドレスには、メモリアクセス要求の対象となる物理アドレスが格納される。なお、データの書込みを要求するメモリアクセス要求には、図１２に示すパケットに加えて、バイトイネーブルと書込むデータが送信される。
【０１２１】
また、アクセストークンを必要としないメモリアクセス要求、例えば、フラッシュバック命令、ライトバック命令については、トークンをリザーブとするパケットが送信される。また、スヌープについては、トークンの代わりに、リクエスト元のＣＰＵを示す８ビットのＣＰＵＩＤと、リクエスト元のプロセスを一意に示す８ビットのエントリＩＤとが格納される。
【０１２２】
また、メモリアクセス要求についての応答も、図１２に示すパケットに類似する形式のパケットが送信される。例えば、スヌープの返信には、トークンの変わりに、８ビットのスヌープレスポンス情報が格納される。また、メモリアクセス要求の完了応答には、トークンをリザーブとしたパケットが送信され、読出しの要求に対する応答には、読み出したデータが付加されることとなる。
【０１２３】
図１１に戻って、メモリトークンチェッカ３８は、取得したメモリアクセス要求からＳＩＤ［７：０］を取得し、取得したＳＩＤが、自ノードが有するＣＰＵのＩＤである自ノードＩＤと一致するか否かを判別する、図１１に示す例では、メモリトークンチェッカ３８は、ＣＰＵＩＤ０〜ＣＰＵＩＤ３までの４つのＣＰＵのＩＤとＳＩＤが一致するか否かを判別する。そして、メモリトークンチェッカ３８は、判別結果を「ＭＹ  Ｎｏｄｅ  ＨＩＴ」としてアクセス判定制御器３８ｄに入力する。
【０１２４】
また、メモリトークンチェッカ３８は、メモリアクセス要求からオペコード（ｏｐ  ｃｏｄｅ［３：０］）を取得し、オペコードトークンデコーダー３８ｃに入力する。このような場合には、オペコードトークンデコーダー３８ｃは、取得したオペコードを解析し、処理内容が、アクセストークンとメモリトークンとの一致を要する処理であるか否かを判別する。そして、オペコードトークンデコーダー３８ｃは、判別結果をトークンイネーブルとして、アクセス判定制御器３８ｄに入力する。
【０１２５】
ここで、図１３は、オペコードが示す処理の一例を説明するための図である。なお、図１３には、ＭＥＳＩプロトコル（イリノイプロトコル）を用いたキャッシュコヒーレンシが実行される際に発行されるメモリアクセス要求のオペコードを示す。
【０１２６】
例えば、オペコード「００００」が格納されたメモリアクセス要求は、「ＲＥＡＤ  ＩＦ」と呼ばれる処理の実行要求である。なお、「ＲＥＡＤ  ＩＦ」は、コアからの命令領域リード、および、キャッシュのステートが「Ｓ（Shared）」である際にキャッシュの獲得を実行する処理である。オペコード「０００１」が格納されたメモリアクセス要求は、「ＲＥＡＤ  ＯＰ」と呼ばれる処理の実行要求である。なお、「ＲＥＡＤ  ＯＰ」は、コアからのデータ領域リード、および、キャッシュのステートが「Ｓ」または「Ｅ（Exclusive）」である際にキャッシュの獲得を実行する処理である。
【０１２７】
オペコード「００１０」が格納されたメモリアクセス要求は、「ＲＥＡＤ  ＥＸ」と呼ばれる処理の実行要求である。なお、「ＲＥＡＤ  ＥＸ」は、コアからのデータストアのための排他権獲得リードの獲得、および、キャッシュのステートが「Ｓ（Ｓｈａｒｅｄ）」である際にキャッシュの獲得を実行する処理である。オペコード「０１００」が格納されたメモリアクセス要求は、「ＤＭＡ  Ｒｅａｄ」と呼ばれる処理の実行要求である。なお、「ＤＭＡ  Ｒｅａｄ」は、Ｉ／ＯからのＤＭＡリードを示し、キャッシュの獲得を行わない処理である。
【０１２８】
オペコード「０１１０」が格納されたメモリアクセス要求は、「ＤＭＡ  Ｗｒｉｔｅ」と呼ばれる処理の実行要求である。なお、「ＤＭＡ  Ｗｒｉｔｅ」は、Ｉ／ＯからのＤＭＡライトを示し、キャッシュの獲得を行わない処理である。オペコード「０１１１」が格納されたメモリアクセス要求は、「ＤＭＡ  Ｗｒｉｔｅ  Ｐａｒｔｉａｌ」と呼ばれる処理の実行要求である。なお、「ＤＭＡ  Ｗｒｉｔｅ  Ｐａｒｔｉａｌ」は、Ｉ／ＯからのＤＭＡライトをパーシャルに実行する処理であり、キャッシュの獲得を行わない処理である。
【０１２９】
オペコード「１０００」が格納されたメモリアクセス要求は、「Ｗｒｉｔｅ  Ｂａｃｋ」と呼ばれる処理の実行要求である。なお、「Ｗｒｉｔｅ  Ｂａｃｋ」は、ＣＰＵのキャッシュ追い出しを行う際に、キャッシュステートが「Ｍ（Modified）」のデータを書き出す処理である。オペコード「１００１」が格納されたメモリアクセス要求は、「Ｆｌａｓｈ  Ｂａｃｋ」と呼ばれる処理の実行要求である。
【０１３０】
なお、「Ｆｌａｃｈ  Ｂａｃｋ」は、ＣＰＵのキャッシュ追い出しを行う際に、キャッシュステートが「Ｅ」または「Ｓ」を「Ｉ（Invalid）」とする処理である。オペコード「１０１０」が格納されたメモリアクセス要求は、「Ｃａｃｈｅ  Ｆｌａｓｈ」と呼ばれる処理の実行要求である。なお、「Ｃａｃｈｅ  Ｆｌａｃｈ」は、コアからのキャッシュフラッシュの実行要求である。
【０１３１】
図１３に示す例では、オペコードトークンデコーダー３８ｃは、オペコードが「００００」、「０００１」、「００１０」の際は、アクセストークンとメモリトークンとの一致を要すると判別し、トークンイネーブル「１」を出力する。また、オペコードトークンデコーダー３８ｃは、オペコードが「００００」、「０００１」、「００１０」以外の際は、アクセストークンとメモリトークンとの一致を要しないと判別し、トークンイネーブル「０」を出力する。なお、図１３に示すオペコードと各処理の対応は、あくまで一例であり、任意のオペコードを任意の処理と対応付けることができる。
【０１３２】
図１１に戻って、メモリトークンチェッカ３８は、アクセス対象となる物理アドレスを含むセグメントアドレスを用いて、メモリトークンレジスタ３８ｂからメモリトークンを検索する。そして、メモリトークンチェッカ３８は、検索したメモリトークンと、メモリアクセス要求のアクセストークンとが一致するか否かを示す「トークンマッチ」をアクセス判定制御器３８ｄに入力する。
【０１３３】
なお、図１１に示す例では、１つのノードのセグメントに連続したメモリアドレスが割当てられている例であり、不連続なメモリアドレスが割当てられている場合には、前段に、アドレストークンエントリ番号を変換する回路を設置すればよい。図１１に示す例では、メモリトークンチェッカ３８は、アドレストークンが「００００」である場合には、ノンプロテクト領域に対するメモリアクセス要求であるため、「アクセスフリー」を示す信号をアクセス判定制御器３８ｄに入力する。
【０１３４】
アクセス判定制御器３８ｄは、入力された「ＭＹ  Ｎｏｄｅ  ＨＩＴ」と、「トークンイネーブル」と、「トークンマッチ」と、「アクセスフリー」とに応じて、メモリアクセス要求の実行を許可するか不許可とするかをホームステートマシン３９に通知する。ここで、図１４は、アクセス判定制御器による判定の一例を説明するための図である。
【０１３５】
例えば、アクセス判定制御器３８ｄは、「ＭＹ  Ｎｏｄｅ  ＨＩＴ」が「Ｎｏ（０）」、トークンイネーブルが「Ｙｅｓ（１）」、トークンマッチが「Ｎｏ（０）」、アクセスフリーが「Ｎｏ（０）」を示す場合には、メモリアクセス要求の実行を不許可とする。これ以外の場合には、アクセス判定制御器３８ｄは、メモリアクセス要求の実行を許可する。つまり、アクセス判定制御器３８ｄは、ライトバック等の、キャッシュコヒーレンスを保持するための処理については、トークンマッチの値に係らず、メモリアクセス要求の実行を許可することとなる。
【０１３６】
図１１に戻って、ホームステートマシン３９は、アクセス判定制御器３８ｄとターゲットアドレスチェッカ３７からの通知とに応じて、メモリアクセスポート３６から取得したメモリアクセスの要求を実行する。図１５は、ホームステートマシンが実行する処理の内容を示す図である。例えば、ホームステートマシン３９は、アクセス判定制御器３８ｄからメモリアクセス要求の実行を不許可とする旨を通知されると、アクセストークンとメモリトークンとが一致しない場合のアクセス例外動作を実施する。
【０１３７】
また、ホームステートマシン３９は、アクセス判定制御器３８ｄからメモリアクセス要求の実行を許可とする旨の通知を受け、かつ、ターゲットアドレスチェッカ３７から自ノードのメモリでない旨（ＭＩＳＳ）を通知された場合には、以下の処理を実行する。すなわち、ホームステートマシン３９は、対象アドレスが一致しない場合のアクセス例外動作を実施する。
【０１３８】
また、ホームステートマシン３９は、アクセス判定制御器３８ｄからメモリアクセス要求の実行を許可とする旨の通知を受け、かつ、ターゲットアドレスチェッカ３７から自ノードのメモリである旨（ＨＩＴ）を通知された場合には、メモリアクセス要求を実施する。なお、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、自身が発行したメモリアクセス要求の実行が許可されなかった場合には、同一のメモリアクセス要求を送信することで、リトライを実行してもよい。
【０１３９】
次に、図１６を用いて、情報処理システム１においてノード間のメモリアクセスがどのように実行されるかを説明する。図１６は、ノード間のメモリアクセスの流れを説明するための図である。なお、図１６には、ノード＃１がノード＃２のメモリに対してメモリアクセスを行う例について示す。
【０１４０】
例えば、図１６中（Ｅ）に示すように、ノード＃２が実行するアプリケーションは、メモリトークン管理テーブルを用いて、未使用のメモリトークンを選択する。そして、ノード＃２が実行するアプリケーションは、図１６中（Ｆ）に示すように、ノード＃１が実行するアプリケーションに対して、アクセス対象となるアドレスリージョンと、メモリトークンと同じアクセストークンとを通知する。
【０１４１】
このような場合には、図１６中（Ｇ）に示すように、ノード＃１が実行するアプリケーションは、アクセストークンをアクセストークンテーブル３１にセットする。また、図１６中（Ｈ）に示すように、ノード＃２が実行するアプリケーションは、ノード＃１に通知したアクセストークンと同じメモリトークンをメモリトークンレジスタ３８ｂにセットする。
【０１４２】
ここで、ノード＃１は、図１６中（Ｉ）に示すように、コア３０ａがメモリアクセス要求を発行すると、アクセストークンテーブル３１にセットしたアクセストークンを付与し、インターコネクトを介してメモリアクセス要求をノード＃２に送信する。すると、ノード＃２は、図１６中（Ｊ）に示すように、メモリアクセス要求に付与されたアクセストークンと、メモリトークンレジスタ３８ｂにセットされたメモリトークンとが一致するか否かを判別する。
【０１４３】
そして、ノード＃２は、アクセストークンとメモリトークンとが一致する場合には、アクセス対象領域に対するメモリアクセス要求を実行し、アクセストークンとメモリトークンとが一致しない場合は、メモリアクセス要求を実行しない。
【０１４４】
このように、情報処理システム１の各ノードは、自ノードのメモリにアクセスするノードに対して、アクセストークンを通知するとともに、通知したアクセストークンをメモリトークンとしてメモリトークンレジスタに格納する。そして、各ノードは、他ノードのメモリにアクセスする場合には、アクセス対象のノードから通知されたアクセストークンをメモリアクセス要求に付与して送信する。その後、各ノードは、メモリアクセス要求に付与されたアクセストークンとメモリトークンとが一致するか否かを判別し、一致すると判別した場合には、メモリアクセスを実行する。
【０１４５】
このため、情報処理システム１は、いずれかのノードが故障した場合にも他のノードの通信ができなくなった場合にも、アクセス対象となるノードがメモリトークンを変更することで、故障したノードからのメモリアクセスを止めることができる。この結果、情報処理システム１は、フェールオーバを正しく行う事ができる。
【０１４６】
以下、図面を用いて、アクセス対象となるノードがメモリトークンを変更することで、故障したノードからのメモリアクセスを止める処理について説明する。図１７は、故障したノードからのメモリアクセスを止める処理について説明するための図である。なお、図１７には、ノード＃１がノード＃２のメモリに対してアクセスを行っている例について説明する。例えば、ノード＃１は、ノード＃２のアプリケーションから通知されたアクセストークンをアクセストークンテーブルに格納し、メモリアクセスにアクセストークンを付加してノード＃２に送信する。
【０１４７】
ここで、ノード＃１が実行するアプリケーションに故障が発生し、ノード＃２と通信が行えなくなった場合には、ノード＃２のアプリケーションは、ノード＃１のアクセストークンを変更することができない。しかし、ノード＃２が実行するアプリケーションは、自ノードが記憶するメモリトークンを変更することができる。このため、ノード＃２が実行するアプリケーションは、自ノードがメモリトークンレジスタに記憶するメモリトークンを変更する。すると、故障したノード＃１が送信するアクセストークンと、ノード＃２が記憶するメモリトークンとが一致しなくなるので、ノード＃２は、ノード＃１からのメモリアクセスを防ぐことができる。
【０１４８】
ここで、ノード＃２は、メモリトークンを任意のタイミングで変更することができる。すなわち、ノード＃２は、メモリトークンを変更するとともに、変更後のメモリトークンをアクセストークンとしてノード＃１に送信する。すると、ノード＃１は、ノード＃２と通信が行える場合は、正常にアクセストークンを変更するので、ノード＃２へのアクセスを継続することができる。
【０１４９】
一方、ノード＃１は、故障が発生し、ノード＃２と通信が行えない場合は、アクセストークンを変更することができないので、ノード＃２へのアクセスを行えなくなる。この結果、情報処理システム１は、ノード＃１が実行する処理を他のノードに移した際に、スプリットブレイン状態が発生することを防ぐことができる。このため、情報処理システム１は、正しくフェールオーバを実行することができる。
【０１５０】
以下、図１８、図１９を用いて、故障が生じたノードの切り離しを行う処理について説明する。図１８は、故障が生じたノードによるメモリアクセスを防ぐ処理を説明するための第１の図である。図１９は、故障が生じたノードによるメモリアクセスを防ぐ処理を説明するための第２の図である。なお、図１８、図１９では、ノード＃１〜＃３がノード＃４に対してメモリアクセス要求を発行する際に、ノード＃１のアプリケーションが故障し、他のノード＃２〜＃４と通信が行えなくなった例について説明する。
【０１５１】
例えば、図１８中（Ｋ）に示すように、ノード＃４が実行する監視アプリケーションは、任意のタイミングで、ノード＃４が記憶するメモリトークン「７７７」を「８８８」に変更する。また、ノード＃４は、新たなメモリトークン「８８８」をアクセストークンとして、ノード＃１〜＃３に対して配信する。
【０１５２】
ここで、ノード＃１は、アプリケーションが故障し、他のノード＃２〜＃４と通信を行う事ができないため、図１８中（Ｌ）に示すように、アクセストークン「７７７」を新たなアクセストークン「８８８」に更新することができない。一方、ノード＃２およびノード＃３は、図１８中（Ｍ）に示すように、アクセストークン「７７７」を新たなアクセストークン「８８８」に変更することができる。
【０１５３】
この結果、図１９中（Ｎ）に示すように、アプリケーションが故障したノード＃１は、ノード＃４にアクセスすることができないが、ノード＃２およびノード＃３は、ノード＃４へのアクセスを継続することができる。このため、各ノード＃１〜＃４は、故障したノードの切り離しを容易に行う事ができる。
【０１５４】
また、各ノード＃１〜＃４は、ハンドシェーク等の処理によりアプリケーションに故障が発生したか否かを判別せずともよい。つまり、各ノード＃１〜＃４は、いずれかのノードに故障が発生したことを識別せずとも、故障したノードの切り離しを行うことができる。このため、各ノード＃１〜＃４は、故障したノードを高速に切り離すことができる。
【０１５５】
次に、図２０〜図２５を用いて、メモリトークンおよびアクセストークンを用いたメモリアクセスの処理の流れについて説明する。なお、以下の説明においては、コア３０ａとメモリ１９とを有するノード＃１が、コア３０ｇとメモリ１９ａおよびメモリ１９ｂを有するノード＃２に対してメモリアクセス要求を送信する例について説明する。なお、メモリ１９ａは、ローカル領域のみを有するメモリであり、メモリ１９ｂは、共有メモリ領域のみを有するメモリである。
【０１５６】
なお、以下の説明において、アプリとは、各ノード＃１、＃２が実行するアプリケーションであり、ＯＳとは、各ノード＃１、＃２が独立して動作させるＯＳであり、共有メモリドライバとは、共有メモリ領域の制御を行うドライバである。なお、各ノード間のトークンに関する要求、通知を実現する通信手段としては、各ノードの各アプリケーション間の通信ができればよく、ＬＡＮ経由のメッセージ通信、インターコネクト経由で共有メモリを用いたメッセージ通信、共有ストレージを用いた通信などの手段で実現できる。
【０１５７】
まず、図２０を用いて、ノード＃１がアクセストークンを取得する処理の流れについて説明する。図２０は、アクセストークンを取得する処理の流れを説明するためのシーケンス図である。例えば、コア３０ａが実行するアプリケーションは、コア３０ｇが実行するアプリケーションに対して、アクセストークンを要求する（ステップＳ１０１）。すると、コア３０ｇが実行するアプリケーションは、共有メモリドライバにメモリトークンの割り当てを要求する（ステップＳ１０２）。
【０１５８】
すると、コア３０ｇが実行する共有メモリドライバは、メモリ１９ａに格納されたメモリトークン管理テーブルを参照する。そして、コア３０ｇが実行する共有メモリドライバは、使用されていないメモリトークンをメモリトークン管理テーブルに登録し（ステップＳ１０３）、メモリトークンを取得する（ステップＳ１０４）。この際、コア３０ｇが実行する共有メモリドライバは、メモリトークンを利用するプロセスのアプリＩＤの登録を合わせて行う。
【０１５９】
また、コア３０ｇが実行する共有メモリドライバは、共有メモリセグメント管理テーブルと、メモリトークンレジスタとに、取得したメモリトークンを登録する（ステップＳ１０５）。この際、コア３０ｇが実行する共有メモリドライバは、アクセス対象となるセグメント番号や、使用フラグ、アプリＩＤ等の登録を合わせて行う。また、コア３０ｇが実行する共有メモリドライバは、メモリトークンをアクセストークンとしてコア３０ａが実行するアプリケーションに通知する（ステップＳ１０６）。
【０１６０】
一方、コア３０ａが実行するアプリケーションは、アクセストークンを取得すると（ステップＳ１０７）、取得したアクセストークンをセットするようコア３０ａが実行する共有メモリドライバに要求する（ステップＳ１０８）。すると、コア３０ａが実行する共有メモリドライバは、アクセストークンテーブル３１に、取得したアクセストークンをセットする（ステップＳ１０９）。
【０１６１】
次に、コア３０ａが実行する共有メモリドライバは、アクセス対象となるＶＡ（Virtual  Address：仮想アドレス）をコア３０ａが実行するアプリケーションに通知する（ステップＳ１１０）。すると、コア３０ａが実行するアプリケーションは、データリード要求を発行する（ステップＳ１１１）。ここで、データリード要求には、アクセストークンテーブル３１にセットされたアクセストークンがセットされる（ステップＳ１１２）。
【０１６２】
すると、ノード＃２は、データリード要求にセットされたアクセストークンがメモリトークンレジスタに登録されたメモリトークンと一致するか否かを判別する（ステップＳ１１３）。そして、ノード＃２は、アクセストークンとメモリトークンとが一致する場合には、セグメント領域へのアクセスを許可する（ステップＳ１１４）。
【０１６３】
次に、図２１を用いて、ノード＃１がノード＃２の複数のセグメントに対してアクセスを行う例について説明する。図２１は、複数のセグメントに対してアクセスを行う処理の流れを説明するためのシーケンス図である。例えば、コア３０ａが実行するアプリケーションは、メモリ１９ｂのセグメント＃Ａにアクセスするためのアクセストークン＃Ａをセットするようコア３０ａが実行する共有メモリドライバに要求する（ステップＳ２０１）。すると、コア３０ａが実行する共有メモリドライバは、アクセストークンテーブル３１にアクセストークン＃Ａをセットする（ステップＳ２０２）。
【０１６４】
また、コア３０ａが実行するアプリケーションは、セグメント＃Ａに対するデータリード要求を発行する（ステップＳ２０３）。この際、データリード要求には、アクセストークン＃Ａがセットされる（ステップＳ２０４）。すると、ノード＃２は、データリード要求にセットされたアクセストークン＃Ａがセグメント＃Ａのメモリトークンと一致するか否かを判別する（ステップＳ２０５）。そして、ノード＃２は、アクセストークン＃Ａとセグメント＃Ａのメモリトークンとが一致する場合には、セグメント＃Ａに対するメモリアクセスを許可する（ステップＳ２０６）。
【０１６５】
また、コア３０ａが実行するアプリケーションは、メモリ１９ｂのセグメント＃Ｂにアクセスするためのアクセストークン＃Ｂをセットするようコア３０ａが実行する共有メモリドライバに要求する（ステップＳ２０７）。すると、コア３０ａが実行する共有メモリドライバは、アクセストークンテーブル３１にアクセストークン＃Ｂをセットする（ステップＳ２０８）。
【０１６６】
また、コア３０ａが実行するアプリケーションは、セグメント＃Ｂに対するデータリード要求を発行する（ステップＳ２０９）。この際、データリード要求には、アクセストークン＃Ｂがセットされる（ステップＳ２１０）。すると、ノード＃２は、データリード要求にセットされたアクセストークン＃Ｂがセグメント＃Ｂのメモリトークンと一致するか否かを判別する（ステップＳ２１１）。そして、ノード＃２は、アクセストークン＃Ｂとセグメント＃Ｂのメモリトークンとが一致する場合には、セグメント＃Ｂに対するメモリアクセスを許可する（ステップＳ２１２）。
【０１６７】
次に、図２２を用いて、コンテキストスイッチが発生した際に、アクセストークンテーブル３１のデータがスタックされる処理の流れについて説明する。図２２は、コンテキストスイッチの流れを説明するためのシーケンス図である。なお、図２２に示す例では、コア３０ａがアプリケーション＃Ａを実行中に、割り込み処理が発生したため、実行するアプリケーションをアプリケーション＃Ｂにスイッチする処理の流れについて説明する。
【０１６８】
例えば、コア３０ａがアプリケーション＃Ａの実行中に、タイマ割り込みが発生する（ステップＳ３０１）。このような場合には、コア３０ａが実行するＯＳは、アクセストークンテーブル３１のデータを含めたコンテキストスイッチを実行し（ステップＳ３０２）、各レジスタの値をメモリ１９にスタックする（ステップＳ３０３）。次に、コア３０ａが実行するＯＳは、メモリ１９にスタックしてあったアプリケーション＃Ｂ実行時の各レジスタの値を取得する（ステップＳ３０４）。そして、コア３０ａが実行するＯＳは、アクセストークンテーブル３１とともに、取得した値をセットする（ステップＳ３０５）。
【０１６９】
続いて、コア３０ａが実行するアプリケーション＃Ｂがデータリード要求を発行する（ステップＳ３０６）。すると、アクセストークンテーブル３１にセットされたアクセストークン、すなわち、アプリケーション＃Ｂが使用するアクセストークンがデータリード要求にセットされる（ステップＳ３０７）。すると、ノード＃２は、アプリケーション＃Ｂが利用するセグメントのメモリトークンと、データリード要求にセットされたアクセストークンとが一致するか否かを判別する（ステップＳ３０８）。そして、ノード＃２は、メモリトークンとアクセストークンとが一致した場合は、共有メモリ領域へのアクセスを許可する（ステップＳ３０９）。
【０１７０】
次に、図２３を用いて、ノード＃２がメモリトークンを変更する処理について説明する。図２３は、メモリトークンを変更する処理の流れを説明するためのシーケンス図である。なお、図２３に示す例では、ノード＃１に障害が発生しておらず、ノード＃２がメモリトークンの変更を行った後にも、正常にアクセスを行える例について説明する。なお、図２３中のステップＳ４１１〜Ｓ４１４は、図２２に示すステップＳ３０６〜Ｓ３０９と同様の処理であるものとし、以下の説明を省略する。
【０１７１】
例えば、コア３０ｇが実行するアプリケーションは、任意のタイミングでトークンの更新をコア３０ｇが実行する共有メモリドライバに要求する（ステップＳ４０１）。すると、コア３０ｇが実行する共有メモリドライバは、メモリトークン管理テーブルから、新たに使用可能なメモリトークンを検索し（ステップＳ４０２）、新たに使用するメモリトークンをコア３０ｇが実行するアプリケーションに通知する。次に、コア３０ｇが実行するアプリケーションは、コア３０ａが実行するアプリケーションに対して、アクセスの停止要求を発行し（ステップＳ４０３）、一定時間待機する（ステップＳ４０４）。
【０１７２】
その後、コア３０ｇが実行するアプリケーションは、新たに使用するメモリトークンをコア３０ｇが実行する共有メモリドライバに通知する（ステップＳ４０５）。このような場合には、コア３０ｇが実行する共有メモリドライバは、新たなメモリトークンをメモリトークンレジスタにセットする（ステップＳ４０６）。また、コア３０ｇが実行する共有メモリドライバは、メモリトークン管理テーブルの更新を行う（ステップＳ４０７）。
【０１７３】
すると、コア３０ｇが実行するアプリケーションは、新たなアクセストークンをコア３０ａが実行するアプリケーションに通知するとともに、メモリアクセスの再開を通知する（ステップＳ４０８）。このような場合には、コア３０ａが実行するアプリケーションは、コア３０ａが実行する共有メモリドライバに対して新たなアクセストークンを通知する（ステップＳ４０９）。すると、コア３０ａが実行する共有メモリドライバは、アクセストークンテーブル３１に新たなアクセストークンをセットする（ステップＳ４１０）。
【０１７４】
なお、メモリアクセスのリトライを認める場合には、メモリトークンを変更する処理を実行する際に待機する必要はない。そこで、図２４を用いて、ノード＃２がメモリトークンを変更する処理のバリエーションについて説明する。図２４は、メモリトークンを変更する処理のバリエーションを説明するためのシーケンス図である。なお、図２４に示す例では、ノード＃１に障害が発生しておらず、ノード＃２がメモリトークンの変更を行った後にも、正常にアクセスを行える例について説明する。
【０１７５】
例えば、コア３０ｇが実行するアプリケーションは、任意のタイミングでトークンの更新をコア３０ｇが実行する共有メモリドライバに要求する（ステップＳ５０１）。すると、コア３０ｇが実行する共有メモリドライバは、メモリトークン管理テーブルから、新たに使用可能なメモリトークンを検索し（ステップＳ５０２）、新たに使用するメモリトークンをコア３０ｇが実行するアプリケーションに通知する（ステップＳ５０３）。
【０１７６】
次に、コア３０ｇが実行するアプリケーションは、新たに使用するメモリトークンをコア３０ｇが実行する共有メモリドライバに通知する（ステップＳ５０４）。このような場合には、コア３０ｇが実行する共有メモリドライバは、新たなメモリトークンをメモリトークンレジスタにセットする（ステップＳ５０５）。また、コア３０ｇが実行する共有メモリドライバは、メモリトークン管理テーブルに新たなメモリトークンを登録し（ステップＳ５０６）、新たなメモリトークンの登録を、コア３０ｇが実行するアプリケーションに通知する（ステップＳ５０７）。
【０１７７】
また、コア３０ｇが実行するアプリケーションは、新たなアクセストークンをコア３０ａが実行するアプリケーションに送信する（ステップＳ５０８）。ここで、コア３０ａが実行するアプリケーションは、データリード要求を発行する（ステップＳ５０９）。すると、コア３０ａが実行する共有メモリドライバは、アクセストークンテーブル３１に新たなアクセストークンをセットする（ステップＳ５１０）。
【０１７８】
しかし、ステップＳ５１０でセットされたアクセストークンは、新たなメモリトークンと一致しないため、メモリアクセスが拒否される（ステップＳ５１１）。このため、ノード＃２は、ノード＃１にアクセス許否の応答を送信する（ステップＳ５１２）。ここで、コア３０ａが実行するアプリケーションは、コア３０ｇが実行するアプリケーションから新たなアクセストークンを受信するので、コア３０ａが実行する共有メモリドライバにトークンを通知する（ステップＳ５１３）。すると、コア３０ａが実行する共有メモリドライバは、新たなアクセストークンをアクセストークンテーブル３１に設定する（ステップＳ５１４）。
【０１７９】
その後、コア３０ａが実行するアプリケーションは、データリード要求のリトライを送信する（ステップＳ５１５）。すると、データリード要求のリトライには、新たなアクセストークンがセットされる（ステップＳ５１６）。この結果、ノード＃２は、アプリケーション＃Ｂが利用するセグメントのメモリトークンと、データリード要求にセットされたアクセストークンとが一致するか否かを判別する（ステップＳ５１７）。
【０１８０】
そして、ノード＃２は、メモリトークンとアクセストークンとが一致した場合は、共有メモリ領域へのアクセスを許可する（ステップＳ５１８）。なお、ノード＃２は、ノード＃１から受信したリトライのアクセストークンが、メモリトークンと一致しなかった場合には、メモリアクセスエラーが発生したものと判別し、ノード＃１の切り離し処理を実行することとしても良い。
【０１８１】
次に、図２５を用いて、ノード＃２がメモリトークンを変更した際に、ノード＃１に障害が発生し、正常にアクセスが行えないため、ノード＃１の切り離しを行う処理の流れについて説明する。図２５は、故障したノードを切り離す処理の流れを説明するためのシーケンス図である。
【０１８２】
なお、図２５に示す例では、ノード＃１に障害が発生し、ノード＃２と通信が行えなくなった例について説明する。また、図２５に示す例では、ノード＃１は、アクセス先のノード＃２に対して、所定の時間おきに生存通知を発行するものとする。
【０１８３】
まず、コア３０ａが実行するアプリケーションは、生存通知を発行する（ステップＳ６０１）。しかし、ノード＃１に障害が発生しているため、ノード＃２に生存通知が届かない。このため、コア３０ｇが実行するアプリケーションは、ノード＃１の異常を検出する（ステップＳ６０２）。すると、コア３０ｇが実行するアプリケーションは、メモリトークンの更新をコア３０ｇが実行する共有メモリドライバに要求する（ステップＳ６０３）。すると、コア３０ｇが実行する共有メモリドライバは、メモリトークン管理テーブルから新たなメモリトークンを検索し（ステップＳ６０４）、新たなメモリトークンをコア３０ｇが実行するアプリケーションに通知する。
【０１８４】
すると、コア３０ｇが実行するアプリケーションは、新たなメモリトークンをアクセストークンとしてノード＃１に送信するが、ノード＃１に障害が発生しているため、新たなアクセストークンはノード＃１に到達しない。次に、コア３０ｇが実行するアプリケーションは、新たに使用するメモリトークンをコア３０ｇが実行する共有メモリドライバに通知する（ステップＳ６０５）。
【０１８５】
このような場合には、コア３０ｇが実行する共有メモリドライバは、新たなメモリトークンをメモリトークンレジスタにセットする（ステップＳ６０６）。また、コア３０ｇが実行する共有メモリドライバは、メモリトークン管理テーブルに新たなメモリトークンを登録し（ステップＳ６０７）、新たなメモリトークンの登録を、コア３０ｇが実行するアプリケーションに通知する。
【０１８６】
また、コア３０ｇが実行するアプリケーションは、通信の再開通知をノード＃１に通知するが（ステップＳ６０８）、ノード＃１に故障が発生しているため、通信の再開通知はノード＃１に到達しない。そこで、コア３０ｇが実行するアプリケーションは、ノード＃１の切り離し要求をコア３０ｇが実行する共有メモリドライバに発行する（ステップＳ６０９）。すると、コア３０ｇが実行する共有メモリドライバは、切り離し対象となるノード＃１が使用する共有メモリ領域を共有メモリセグメント管理テーブルから検索する（ステップＳ６１０）。
【０１８７】
ここで、コア３０ａが実行するアプリケーションがデータリード要求を発行すると（ステップＳ６１１）、ノード＃１は、データリード要求にアクセストークンをセットし（ステップＳ６１２）、ノード＃２に送信する。しかし、アクセストークンと新たなメモリトークンとが一致しないので、（ステップＳ６１３）、ノード＃２は、メモリアクセスを拒否し、アドレス例外をノード＃１に送信する（ステップＳ６１４）。
【０１８８】
このような場合には、ノード＃１は、Ｌ１キャッシュ３０ｂ、Ｌ１キャッシュ３０ｅ、Ｌ２キャッシュ３２ａに格納されたデータをノード＃２に送信するライトバック処理を実行する（ステップＳ６１５）。このように、ノード＃１からライトバックのデータを取得した場合には、ノード＃２は、メモリアクセスの可否判断を行わずに、共有メモリ領域へのライトバックを行う（ステップＳ６１６）。
【０１８９】
その後、ノード＃１とノード＃２とは、キャッシュフラッシュとインプリシッドライトバックとを用いて、各キャッシュ３０ｂ、３０ｅ、３２ａに保持されたデータとメモリ１９ｂに保持されたデータとを一致させる。そして、ノード＃２は、ノード＃１のコア３０ａが実行していたプロセスのジョブを他のＣＰＵが実行するプロセスに移動させ、ノード＃１の切り離しを行う切り離し処理を実行する（ステップＳ６１７、ステップＳ６１８）。その後、コア３０ｇが実行する共有メモリドライバは、ノード＃１の切り離しが完了した旨を、コア３０ｇが実行するアプリケーションに通知する（ステップＳ６１９）。
【０１９０】
次に、図２６を用いて、メモリトークンを変更する処理の一例について説明する。図２６は、メモリトークンを変更する処理の流れの一例を説明するためのフローチャートである。なお、図２６に示す例では、ＣＰＵ１２は、プロセスごとに、メモリアクセス要求がトークンエラーとなった回数「Ｎ」をカウントするものとする。また、ＣＰＵ１２は、図２６に示す処理を実行する前に、各プロセスの「Ｎ」に初期値「０」を設定する。また、図２６には、１０回以上リトライが失敗したノードをメモリエラーハンドリングにより切り離す例を示す。
【０１９１】
例えば、ＣＰＵ１２は、メモリトークンとアクセストークンとに応じたメモリアクセス要求の実行を正常なプロセスとして実行する（ステップＳ７０１）。ここで、ＣＰＵ１２は、エラーシグナルが発生したか否かを判別する（ステップＳ７０２）。なお、エラーシグナルとは、エラーが発生した際に通知される信号であり、例えば、エラーレジスタ４３にエラーが格納されると通知される信号である。
【０１９２】
ここで、ＣＰＵ１２は、エラーシグナルが発生したと判別した場合には（ステップＳ７０２肯定）、エラーシグナルが示すエラーの内容が、メモリトークンとアクセストークンとの不一致を示すトークンエラーであるか否かを判別する（ステップＳ７０３）。そして、ＣＰＵ１２は、エラーシグナルが示すエラーの内容がトークンエラーであると判別した場合には（ステップＳ７０３肯定）、以下の処理を実行する。すなわち、ＣＰＵ１２は、トークンエラーとなったメモリアクセスを要求したプロセスの「Ｎ」の値が「１０」未満であるか否かを判別する（ステップＳ７０４）。
【０１９３】
そして、ＣＰＵ１２は、メモリアクセスを要求したプロセスの「Ｎ」の値が「１０」未満であると判別した場合には（ステップＳ７０４肯定）、メモリアクセスを要求したプロセスの「Ｎ」の値に「１」を加算する（ステップＳ７０５）。その後、ＣＰＵ１２は、再度正常プロセスを実行する（ステップＳ７０１）。
【０１９４】
また、ＣＰＵ１２は、メモリアクセスを要求したプロセスの「Ｎ」の値が「１０」以上であると判別した場合には（ステップＳ７０４否定）、以下の処理を実行する。すなわち、ＣＰＵ１２は、メモリエラーハンドリングを実行し（ステップＳ７０６）、メモリアクセスを要求したプロセスを実行するノードの切り離しを行い、処理を終了する。
【０１９５】
次に、ＣＰＵ１２がノードの切り離し処理を実行する際に、共有メモリセグメント管理テーブルとメモリトークン管理テーブルとを更新する処理について説明する。図２７は、共有メモリセグメント管理テーブルとメモリトークン管理テーブルとを更新する処理の流れについて説明するためのフローチャートである。なお、ＣＰＵ１２は、共有メモリセグメント管理テーブルのエントリ毎に、図２７に示す処理を実行する。また、ＣＰＵ１２は、メモリアクセス要求発行元のノードが実行するプロセスから、セグメントの解除要求を取得したことを契機として、図２７に示す処理を実行する。
【０１９６】
例えば、ＣＰＵ１２は、使用フラグを参照し、使用フラグが「１」であるかを判別する（ステップＳ８０１）。そして、ＣＰＵ１２は、使用フラグが「１」である場合は（ステップＳ８０１肯定）、セグメント解除要求を発行したプロセスのアプリＩＤと、エントリのアプリＩＤとが一致するか否かを判別する（ステップＳ８０２）。
【０１９７】
そして、ＣＰＵ１２は、アプリＩＤが一致すると判別した場合には（ステップＳ８０２肯定）、セグメント解除要求を発行したプロセスを実行するノードの使用ノードフラグが「１」であるか否かを判別する（ステップＳ８０３）。そして、ＣＰＵ１２は、セグメント解除要求を発行したプロセスを実行するノードの使用ノードフラグが「１」である場合には（ステップＳ８０３肯定）、セグメント解除要求を発行したプロセスを実行するノードの使用ノードフラグを「０」にする（ステップＳ８０４）。
【０１９８】
次に、ＣＰＵ１２は、他の使用ノードフラグが「０」であるか否かを判別し（ステップＳ８０５）、他の使用ノードフラグが「０」である場合は（ステップＳ８０５肯定）、使用フラグを「０」にする（ステップＳ８０６）。次に、ＣＰＵ１２は、エントリのメモリトークンの値を識別し、メモリトークン管理テーブルの各エントリのうち、識別した値と同じ値のメモリトークンが格納されたエントリを検索する。そして、ＣＰＵ１２は、検索したエントリの使用フラグを「０」にする（ステップＳ８０７）。
【０１９９】
その後、ＣＰＵ１２は、ノードの切り離しが終了した旨の完了応答を発行し（ステップＳ８０８）、処理を終了する。なお、ＣＰＵ１２は、使用フラグが「１」ではない場合（ステップＳ８０１否定）、アプリＩＤが一致しない場合（ステップＳ８０２否定）、使用ノードフラグが「０」である場合（ステップＳ８０３否定）には、完了応答を発行する（ステップＳ８０８）。また、ＣＰＵ１２は、使用ノードフラグがすべて「０」ではない場合には（ステップＳ８０５否定）、完了応答を発行する（ステップＳ８０８）。
【０２００】
ここで、図２８は、共有メモリセグメント管理テーブルの更新を説明するための図である。例えば、図２８中の網掛けで示すように、ＣＰＵ１２は、図２７中ステップＳ８０４およびステップＳ８０６に示す処理を実行することにより、使用フラグと使用ノードフラグとを「０」に設定する。
【０２０１】
また、図２９は、メモリトークン管理テーブルの更新を説明するための図である。例えば、図２９中の網掛けで示すように、ＣＰＵ１２は、図２７中ステップＳ８０７に示す処理を実行する事により、使用フラグを「０」に設定する。このように、ＣＰＵ１２は、図２７に示す処理を実行することで、共有メモリセグメント管理テーブルとメモリトークン管理テーブルとを適切に更新し、ノードの切り離しを行うことができる。
【０２０２】
［実施例１の効果］
上述したように、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、アクセストークンテーブル３１、３１ａを有する。そして、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、他ノードへのメモリアクセス要求に、アクセストークンを付加して送信する。また、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、自身にメモリアクセス要求を発行するＣＰＵに対して送信したアクセストークンと同じ値のメモリアクセストークンを記憶するメモリトークンレジスタを有する。そして、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、受信したメモリアクセス要求のアクセストークンとメモリトークンレジスタが記憶するメモリトークンとに基づいて、メモリアクセス要求の実行可否を制御する。
【０２０３】
このため、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、自身のメモリトークンレジスタが記憶するメモリトークンを変更することで、故障したノードが発行したメモリアクセス要求の実行を防ぐことができる。この結果、情報処理システム１は、スプリットブレイン状態の発生を回避する結果、正しくフェールオーバを実行することができる。
【０２０４】
また、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリトークンを変更する際に、新たなメモリトークンをアクセストークンとして、メモリアクセス要求の発行元となるノードに通知する。そして、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、新たなメモリトークンと、受信したメモリアクセス要求のアクセストークンとが一致した場合には、メモリアクセス要求の実行を許可する。
【０２０５】
このため各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、アクセス元のノードに故障が生じているか否かを判別せずとも、故障が生じたノードによるメモリアクセスを防ぐことができる。この結果、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、ハンドシェイク等を用いてアクセス元のノードに故障が生じているか判別する手法よりも、高速かつ容易にノードの切り離しを行うことができる。
【０２０６】
また、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリアクセス要求の実行を拒否した場合には、メモリトークンの更新を行い、その後、メモリアクセス要求の発行元となるノードのＣＰＵがキャッシュしたデータを自身がアクセスするメモリに書き戻す。このため、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、キャッシュメモリを有する場合にも、キャッシュコヒーレンシを保持したままで、ノードの切り離しを正しく行うことができる。
【０２０７】
また、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリアクセス要求の発行元に対してアクセス停止の指示とともに、新たなアクセストークンを送信する。そして、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、一定時間経過後に、メモリトークンを更新するとともに、アクセス再開をメモリアクセス要求の発行元に指示する。
【０２０８】
このため、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリアクセス要求の発行元からリトライを受け付けずとも、故障したノードからのメモリアクセスを不許可とすることができる。この結果、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリアクセス要求を不許可とした際に、発生したエラーの種別を判別せずとも、適切に故障したノードの切り離しを行うことができる。
【０２０９】
なお、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、他ノードに対するメモリアクセスが不許可となった場合には、リトライを行ってもよい。すなわち、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリアクセスが不許可となった場合には、同一のメモリアクセスを要求するリトライ機能を有する。
【０２１０】
このような場合には、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、新たなアクセストークンを通知した際に待機せずとも、故障したノードを正しく切り離すことができる。すなわち、アクセス元のノードが変更後のアクセストークンを適用してメモリアクセスを行うタイミングと、アクセス先のノードがメモリトークンを変更するタイミングとには、ずれが存在するので、アクセスが拒否される場合がある。
【０２１１】
例えば、アクセス元のノードが変更前のアクセストークンを付与し、アクセス先のノードが変更後のメモリトークンでアクセスの可否を判別する結果、アクセスが許否される場合がある。同様に、アクセス元のノードが変更後のアクセストークンを付与し、アクセス先のノードが変更前のメモリトークンでアクセスの可否を判別する結果、アクセスを許否される場合がある。
【０２１２】
ここで、アクセスが拒否された場合は、アクセス元のノードがリトライを送信する。すると、正常に動作するアクセス元のノードは、メモリアクセスのリトライに変更後のアクセストークンを付与する。そして、アクセス先のノードが変更後のメモリトークンでアクセスの可否を判別する。この結果、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、正常に動作するアクセス元のノードによるメモリアクセスを許可することができる。
【０２１３】
一方、正常に動作できないアクセス元のノードは、メモリアクセスのリトライに変更前のアクセストークンを付与し、アクセス先のノードは、変更後のメモリトークンでアクセスの可否を判別する。この結果、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、正常に動作できないアクセス元のノードによるメモリアクセスのリトライを許否し、リトライの発行元となるノードの切り離しを行うことができる。
【０２１４】
なお、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、メモリアクセスのリトライを許否した場合には、メモリアクセス要求の発行元となるノードのＣＰＵがキャッシュしたデータを自身がアクセスするメモリに書き戻す。このため、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、キャッシュコヒーレンシを保持したままで、ノードの切り離しを正しく行うことができる。
【０２１５】
また、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、コンテキストスイッチを行う際にスタックするレジスタをアクセストークンテーブルとする。このため、各ＣＰＵ１２〜１５、１２ａ〜１２ｍは、マルチスレッドで処理を実行する場合にも、ＯＳやアプリケーションを複雑化させること無く、故障したノードからのメモリアクセスを防ぎ、フェールオーバを正しく実行することができる。
【実施例２】
【０２１６】
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、以下では実施例２として本発明に含まれる他の実施例を説明する。
【０２１７】
（１）アクセストークンテーブルについて
上述したＣＰＵ１２は、各コア３０ａ、３０ｄに１つのアクセストークンテーブル３１、３１ａを有していた。しかし、実施例は、これに限定されるものではない。例えば、ＣＰＵ１２は、コア３０ａがマルチスレッド対応である場合には、ハードスレッドごとにアクセストークンテーブルを設置することとしても良い。
【０２１８】
例えば、図３０は、マルチスレッド対応のアクセストークンテーブルの一例を説明するための図である。図３０に示す例では、コア３０ａは、２つのハードスレッドを有する。このような場合には、ＣＰＵ１２は、各ハードスレッドが用いる２つのアクセストークンテーブル３１ｂ、３１ｃを有する。そして、ＣＰＵ１２は、メモリアクセス要求を発行したスレッドが用いるアクセストークンテーブルが出力したアクセストークンをパケットに格納する。なお、ＣＰＵ１２は、図３０に示す例に限らず、任意の数のアクセストークンテーブルを有することとしてもよい。
【０２１９】
このように、ＣＰＵ１２は、ハードスレッドごとにアクセストークンテーブルを設置した場合には、マルチスレッドで処理を実行する場合にも、ＯＳやアプリケーションを複雑化させること無く、故障したノードからのメモリアクセスを防ぐ。この結果、情報処理システム１は、フェールオーバを正しく実行することができる。
【０２２０】
（２）ノンプロテクト領域について
上述したＣＰＵ１２は、ノンプロテクト領域にアクセスを行う場合には、アクセストークンおよびメモリトークンとして「ａｌｌ０」を用いた。しかし、実施例はこれに限定されるものではない。例えば、メモリトークンレジスタが記憶するメモリトークンにバリッドビットを設定し、バリッドビットを用いてアクセス対象がプロテクト領域であるかノンプロテクト領域であるかを示すこととしてもよい。
【０２２１】
例えば、図３１は、メモリトークンチェッカのバリエーションを説明するための図である。図３１に示す例では、メモリトークンチェッカ３８ｅは、メモリトークンレジスタ３８ｆを有する。メモリトークンレジスタ３８ｆは、メモリトークンレジスタ３８ｂが有するリザーブの１ビットをバリッドビットとし、ノンプロテクト領域と対応するフィールドにバリッドビット「０」を記憶する。このような場合には、アクセス対象がノンプロテクト領域である場合には、アクセス判定制御器３８ｄにアクセスフリーを示す信号が入力されるので、ノンプロテクト領域に対するメモリトークンを設定すること無く、適切なメモリアクセスを実現できる。
【０２２２】
（３）不正なアクセスによるメモリトークンの一致について
上述したＣＰＵ１２は、メモリトークンとアクセストークンとが一致するか否かに応じてメモリアクセス要求の実行可否を判断した。しかし、実施例は、これに限定されるものではなく、例えば、メモリトークンとアクセストークンとが一致するか否かに加えて、メモリアクセス要求を発行したノードが予め許可されたノードであるか否かをあわせて判別してもよい。
【０２２３】
例えば、図３２は、予め許可されたノードのみにメモリアクセスを許可するメモリトークンチェッカを説明するための図である。図３２に示す例では、メモリトークンチェッカ３８ｇは、メモリトークンレジスタ３８ｂに加えて、ノード判定回路３８ｈを有し、ノード判定回路３８ｈは、ノードリストレジスタ３８ｉを有する。ここで、ノードリストレジスタ３８ｉは、各セグメント領域ごとに、アクセスを許可したノードのノードＩＤが格納されている。
【０２２４】
ノードリストレジスタ３８ｉは、メモリアクセス要求の対象となるセグメントのアドレスから、アクセスが許可されたノードのノードＩＤを出力する。そして、ノード判定回路３８ｈは、ノードリストレジスタ３８ｉが出力したノードＩＤと、メモリアクセス要求の発行元であるノードのノードＩＤとが一致するか否かを示すノードＩＤマッチをアクセス判定制御器３８ｄに出力する。
【０２２５】
そして、アクセス判定制御器３８ｄは、トークンイネーブルが「Ｙｅｓ（１）」であり、ＭＹ  Ｎｏｄｅ  ＨＩＴとトークンマッチとノードＩＤマッチとアクセスフリーとが共に「０」である場合には、メモリアクセス要求の実行を不許可とする。これ以外の場合には、アクセス判定制御器３８ｄは、メモリアクセス要求の実行を許可する。このように、ＣＰＵ１２は、ノードＩＤのチェックを行うことによって、不正なアクセスを防止することができる。
【符号の説明】
【０２２６】
１  情報処理システム
２、２ａ  クライアント端末
３、５  ＬＡＮスイッチ
４  管理端末
６  グローバルクロスバ
７  サービスプロセッサ
１０〜１０ｍ  ノード
１１〜１１ｍ  サービスプロセッサ
１２〜１２ｍ、１３〜１５  ＣＰＵ
１６〜１６ｍ  ローカルＸＢ
１７〜２４  メモリ
２５  ＰＣＩｅスイッチ
２６、２７  ＬＡＮアダプタ
２８  ＳＡＳ
２９  ＨＤＤ
３０ａ、３０ｄ  コア
３０ｂ、３０ｅ  Ｌ１キャッシュ
３０ｃ、３０ｆ  ＴＬＢ
３１〜３１ｃ  アクセストークンテーブル
３２  Ｌ２キャッシュタグ
３２ａ  Ｌ２キャッシュ
３３  キャッシュスヌープコントローラ
３４  メモリリクエストステートマシン
３５  アドレスマップ
３６  メモリアクセスポート
３７  ターゲットアドレスチェッカ
３８、３８ｅ、３８ｇ  メモリトークンチェッカ
３８ａ  自ノードＩＤレジスタ
３８ｂ、３８ｆ  メモリトークンレジスタ
３８ｃ  オペコードトークンデコーダー
３８ｄ  アクセス判定制御器
３８ｈ  ノード判定回路
３８ｉ  ノードリストレジスタ
３９  ホームステートマシン
４０  メモリアクセスコントローラ
４１  非キャッシュリクエストステートマシン
４２  ＰＣＩｅインターフェース
４３  エラーレジスタ
４４  レジスタコントローラ
４５  リクエストレジスタ
４７〜４７ｃ  ＡＳＩレジスタ
【図１】
0005541275.tif 000002
【図２】
0005541275.tif 000003
【図３】
0005541275.tif 000004
【図４】
0005541275.tif 000005
【図５】
0005541275.tif 000006
【図６】
0005541275.tif 000007
【図７】
0005541275.tif 000008
【図８】
0005541275.tif 000009
【図９】
0005541275.tif 000010
【図１０】
0005541275.tif 000011
【図１１】
0005541275.tif 000012
【図１２】
0005541275.tif 000013
【図１３】
0005541275.tif 000014
【図１４】
0005541275.tif 000015
【図１５】
0005541275.tif 000016
【図１６】
0005541275.tif 000017
【図１７】
0005541275.tif 000018
【図１８】
0005541275.tif 000019
【図１９】
0005541275.tif 000020
【図２０】
0005541275.tif 000021
【図２１】
0005541275.tif 000022
【図２２】
0005541275.tif 000023
【図２３】
0005541275.tif 000024
【図２４】
0005541275.tif 000025
【図２５】
0005541275.tif 000026
【図２６】
0005541275.tif 000027
【図２７】
0005541275.tif 000028
【図２８】
0005541275.tif 000029
【図２９】
0005541275.tif 000030
【図３０】
0005541275.tif 000031
【図３１】
0005541275.tif 000032
【図３２】
0005541275.tif 000033
【図３３】
0005541275.tif 000034
【図３４】
0005541275.tif 000035
【図３５】
0005541275.tif 000036
【図３６】
0005541275.tif 000037
【図３７Ａ】
0005541275.tif 000038
【図３７Ｂ】
0005541275.tif 000039