(57)【特許請求の範囲】
【請求項１】
複数の領域を含み、複数のノードにより共有される共有メモリと、
前記共有メモリの領域毎のアクセスを制御するための識別情報を記憶する第１記憶部と、
前記複数のノードの各々に設けられ、前記共有メモリの特定の領域のアクセスにあたり、前記特定の領域をアクセスするリクエストとともに送信すべきアクセス識別情報を記憶する第２記憶部と、前記共有メモリの特定の領域にアクセスするにあたり、アクセスすべき領域が複数の領域にわたっている場合、当該複数の領域に対応する複数のアクセス識別情報を前記第２記憶部から読み出して当該複数の領域の各領域をアクセスするリクエストとともに送信する送信部とを備える演算処理装置と、
前記共有メモリに含まれる領域をアクセスするリクエストについて、当該リクエストとともに前記送信部から送信された複数のアクセス識別情報と前記第１記憶部に記憶された識別情報とを参照し、当該リクエストのアクセスを許可するかを判定する判定部と、
を有することを特徴とする情報処理システム。
【請求項２】
請求項１に記載の情報処理システムにおいて、
前記共有メモリと、前記第１記憶部と、前記判定部とは、前記演算処理装置を備える第１ノードに備えられ、
前記第１ノードが備える第１の演算処理装置は、
前記第１ノードの共有メモリに含まれる複数の領域毎のアクセスを制御するための複数の識別情報を予め前記第１ノードの第１記憶部に格納し、
前記複数の領域毎に、当該領域のアクセス制御に用いる識別情報に対応する識別情報を、当該領域をアクセスする他のノードの演算処理装置に送信し、
前記複数のノードに含まれる第２ノードが備える第２の演算処理装置は、
他のノードの演算処理装置から受信した、前記共有メモリのアクセス制御に用いる複数の識別情報に基づいて、前記第２の演算処理装置が備える第２記憶部に複数のアクセス識別情報を記憶する、
ことを特徴とする情報処理システム。
【請求項３】
請求項２に記載の情報処理システムにおいて、
前記第１ノードの判定部は、
前記第２ノードから受信したリクエストがアクセスする、前記第１ノードの共有メモリに含まれる共有領域に対応する識別情報が、当該リクエストとともに送信された複数のアクセス識別情報のいずれにも対応しない場合には、当該リクエストに対してエラーを応答し、
前記第２の演算処理装置は、
当該リクエストに対するエラーに基づいて、前記第２の演算処理装置が備える第２記憶部に記憶した複数のアクセス識別情報のうち最も古い識別情報を、予め他のノードから受信した前記複数の識別情報に基づいて、前記第２記憶部に記憶されていない他の識別情報に更新し、
前記更新を行った後に、更新した第２記憶部に記憶した複数のアクセス識別情報を用いて、前記エラーが発生したリクエストのメモリアクセスを再実行する、
ことを特徴とする情報処理システム。
【請求項４】
請求項３に記載の情報処理システムにおいて、
前記複数のノードの各々が備える演算処理装置は、オペレーティングシステム（ＯＳ）および前記ＯＳ上で動作するアプリケーションプログラムを実行し、
前記共有メモリをアクセスするリクエストに対するエラーに基づく前記第２の演算処理装置が備える第２記憶部の更新および前記メモリアクセスの再実行は、前記アプリケーションプログラムの処理を伴わずに前記ＯＳが実行する、
ことを特徴とする情報処理システム。
【請求項５】
請求項４に記載の情報処理システムにおいて、
前記複数のノードの各々は、各ノードが備える演算処理装置上で実行されるアプリケーションプログラムがアクセスする共有メモリの領域の制御に用いる識別情報に対応する識別情報を記憶する管理情報格納部を有し、
前記ＯＳは、
前記第２記憶部の更新を行うに際し、前記エラーを発生させたリクエストのアドレス情報に基づいて当該リクエストがアクセスしようとした領域に対応する識別情報を前記管理情報格納部から読み出し、
前記管理情報格納部から読み出した識別情報を用いて前記第２記憶部に記憶したアクセス識別情報を更新する、
ことを特徴とする情報処理システム。
【請求項６】
請求項３〜５のいずれか１項に記載の情報処理システムにおいて、
前記第２の演算処理装置が備える第２記憶部の更新は、再実行したメモリアクセスに対するエラーがなくなるまで繰り返し行われる、
ことを特徴とする情報処理システム。
【請求項７】
請求項１に記載の情報処理システムにおいて、
前記第２記憶部は、複数のアクセス識別情報の各々を記憶する複数のレジスタを備える
ことを特徴とする情報処理システム。
【請求項８】
請求項１に記載の情報処理システムにおいて、
前記第２記憶部は、前記複数のアクセス識別情報を格納するＦＩＦＯ（Ｆｉｒｓｔ−Ｉｎ−Ｆｉｒｓｔ−Ｏｕｔ）バッファを備える
ことを特徴とする情報処理システム。
【請求項９】
請求項１に記載の情報処理システムにおいて、
前記複数のノードの各々は、前記第１記憶部に記憶された識別情報のうち、各ノードが備える前記演算処理装置がアクセスする領域に対応する識別情報を複製した識別情報を記憶する第３記憶部を備え、
前記判定部は、前記演算処理装置ごとに、当該演算処理装置を備えるノード内に設けられ、
前記演算処理装置から前記共有メモリに含まれる領域をアクセスするリクエストが送信された場合、当該演算処理装置に対応する判定部は、当該演算処理装置に対応する第３記憶部に記憶した複製された識別情報と、当該リクエストとともに送信された複数のアクセス識別情報とを参照して、当該リクエストのアクセスを許可するかを判定する、
ことを特徴とする情報処理システム。
【請求項１０】
請求項１〜９のいずれか１項に記載の情報処理システムにおいて、
前記演算処理装置は、演算処理を行う複数の処理部を備え、
前記第２記憶部は、前記複数の処理部ごとに設けられる
ことを特徴とする情報処理システム。
【請求項１１】
複数の領域を含む共有メモリと、
前記共有メモリの領域毎のアクセスを制御するための識別情報を記憶する第１記憶部と、
前記共有メモリの特定の領域のアクセスにあたり、前記特定の領域をアクセスするリクエストとともに送信すべきアクセス識別情報を記憶する第２記憶部と、前記共有メモリの特定の領域にアクセスするにあたり、アクセスすべき領域が複数の領域にわたっている場合、当該複数の領域に対応する複数のアクセス識別情報を前記第２記憶部から読み出して当該複数の領域の各領域をアクセスするリクエストとともに送信する送信部とを備える複数の演算処理装置と、
前記共有メモリに含まれる領域をアクセスするリクエストについて、当該リクエストとともに前記送信部から送信された複数のアクセス識別情報と前記第１記憶部に記憶された識別情報とを参照し、当該リクエストのアクセスを許可するかを判定する判定部と、
を有することを特徴とする情報処理装置。
【請求項１２】
互いに接続される複数のノードと、
演算処理装置と、複数の領域を含む共有メモリとを有し、互いに接続される複数のノードを備える情報処理システムにおけるメモリアクセス制御方法において、
前記演算処理装置の各々は、
前記共有メモリ特定の領域のアクセスにあたり、前記特定の領域をアクセスするリクエストとともに送信すべきアクセス識別情報を記憶し、
前記共有メモリの特定の領域にアクセスするにあたり、アクセスすべき領域が複数の領域にわたっている場合、当該複数の領域に対応する複数のアクセス識別情報を当該複数の領域の各領域をアクセスするリクエストとともに送信し、
前記複数のノードの各々は、
前記共有メモリの領域毎のアクセスを制御するための識別情報を保持し、
前記共有メモリに含まれる領域をアクセスするリクエストについて、当該リクエストとともに送信された複数のアクセス識別情報と前記保持した識別情報とを参照し、当該リクエストのアクセスを許可するかを判定する
処理を実行することを特徴とするメモリアクセス制御方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理システム、情報処理装置、メモリアクセス制御方法に関する。
【背景技術】
【０００２】
従来、１つ又は複数のＣＰＵと共有メモリとを有する複数のノードをクロスバ等で接続し、各ノードの共有メモリを他のノードのＣＰＵからもアクセスできる情報処理システムがある。このような情報処理システムにおいて、共有メモリに含まれる複数の領域ごとに設定されるメモリトークンと、メモリトークンが設定された領域にアクセスする他のノードのＣＰＵからのリクエストに付加したアクセストークンとを用いてアクセス制御を行う技術が考案されている。具体的には、共有メモリのアクセスが行われる際、メモリトークンと、リクエストに付加されたアクセストークンとが一致する場合に、リクエストのメモリアクセスが許可される。この技術によれば、共有メモリに含まれる領域毎に他のノードからのアクセスを許可するかどうかを制御することができる。
【先行技術文献】
【特許文献】
【０００３】
【特許文献１】特開２０１３−１４０４４６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００４】
上述の技術は、データのアクセス保護を行うプロテクト領域と、アクセスの保護を行わないノンプロテクト領域との間を必要に応じてデータを転送して使用する場合に有用である。この場合、プロテクト領域に対するメモリトークンと、そのプロテクト領域をアクセスするＣＰＵにおいてアクセストークンを設定する処理を予め行っておけば、データのコピー自体は、ＣＰＵのロード命令やストア命令を用いて行うことができる。
【０００５】
例えば、図２１は、あるノードが、メモリトークンの値が「ａ」に設定されているセグメントＡの領域のデータを、メモリトークンの設定がない通常のローカルメモリ領域に８バイト単位で８×Ｎバイトコピーする場合のフローチャートの例を示す。まず、ステップＳ３０１において、共有メモリのセグメントＡをアクセスするためのアクセストークン「ａ」を設定する。続いて、Ｎ回分、セグメントＡの領域から８バイトロードしてレジスタＸに格納して（ステップＳ３０２）、レジスタＸの値をセグメントＢのメモリ領域へ８バイトストアする（ステップＳ３０３）。この場合、全体のステップ数は、２Ｎ＋１となり、例えば６４Ｋバイト（Ｎ＝８１９２）の転送を行う場合、２×８１９２＋１＝１６３８５ステップとなる。
【０００６】
しかしながら、例えばあるノードのＣＰＵが、異なるメモリトークンが設定された第１及び第２の共有メモリ領域間でデータをコピーするような場合においては、アクセストークンを頻繁に設定しなおす必要が生じてくる。すなわち、ロードするデータとストアするデータとがそれぞれ異なるメモリトークンが設定されたメモリ領域に格納されているため、ロード命令とストア命令とを実行する度に、アクセストークンを設定しなおす必要が出てくる。
【０００７】
例えば、図２２は、あるノードが、メモリトークンの値が「ａ」に設定されているセグメントＡの領域のデータを、メモリトークンの値が「ｂ」に設定されているセグメントＢの領域に８バイト単位で８×Ｎバイトコピーする場合のフローチャートの例を示す。この場合、データ転送元からのロードとデータ転送先へのストアとを行う際に使用するアクセストークンがそれぞれ異なるので、ロードとストアを行う度にアクセストークンを設定しなおす必要がある。
【０００８】
具体的には、アクセストークンをセグメントＡの値「ａ」に設定してから（ステップＳ３１１）、セグメントＡから８バイトのデータをレジスタＸにロードする（ステップＳ３１２）。そして、アクセストークンをセグメントＢの値「ｂ」に設定しなおしてから（ステップＳ３１３），レジスタＸの値をセグメントＢのメモリ領域へ８バイトストアする（ステップＳ３１４）。このＳ３１１〜Ｓ３１４の動作をＮ回繰り返すことで８×Ｎバイトのコピーを行う。この場合、全体のステップ数は、４Ｎとなり、例えば６４Ｋバイト（Ｎ＝８１９２）の転送を行う場合、４×８１９２＝３２７６８ステップとなる。
【０００９】
図２２の例では、先の図２１の例で示される場合に比べてほぼ倍のステップ数が必要となってしまうが、その原因としては、アクセストークンの再設定を行うためのオーバーヘッドが影響している。コピーするデータのサイズが大きくなるほど、アクセストークン再設定のためのオーバーヘッドが無視できなくなってくる。
【００１０】
このようなデータ転送時のアクセストークンの再設定のオーバーヘッドは、データをコピーする場合に限らず、異なるメモリトークンが設定されたメモリ領域をロード命令やストア命令で順にアクセスするような場合にも生じてくる。従って、異なるメモリトークンが設定された複数の共有メモリ領域をアクセスするアプリケーションプログラムを実行しようとする場合には、アクセストークンを頻繁に再設定する処理のオーバーヘッドを軽減できることが望ましい。
【００１１】
本開示の１つの側面では、異なるメモリトークンが設定された複数のメモリ領域にアクセスを行う際の、アクセストークンの再設定のオーバーヘッドを低減することを目的とする。
【課題を解決するための手段】
【００１２】
発明の一つの側面によれば、複数の領域を含み、複数のノードにより共有される共有メモリと、前記共有メモリの領域毎のアクセスを制御するための識別情報を記憶する第１記憶部と、前記複数のノードの各々に設けられ、前記共有メモリの特定の領域のアクセスにあたり、前記特定の領域をアクセスするリクエストとともに送信すべきアクセス識別情報を記憶する第２記憶部と、前記共有メモリの特定の領域にアクセスするにあたり、アクセスすべき領域が複数の領域にわたっている場合、当該複数の領域に対応する複数のアクセス識別情報を前記第２記憶部から読み出して当該複数の領域の各領域をアクセスするリクエストとともに送信する送信部とを備える演算処理装置と、前記共有メモリに含まれる領域をアクセスするリクエストについて、当該リクエストとともに前記送信部から送信された複数のアクセス識別情報と前記第１記憶部に記憶された識別情報とを参照し、当該リクエストのアクセスを許可するかを判定する判定部と、を有することを特徴とする情報処理システムが提供される。
【発明の効果】
【００１３】
一実施態様によれば、異なるメモリトークンが設定された複数のメモリ領域にアクセスを行う際の、アクセストークンの再設定のオーバーヘッドを低減することができる。
【図面の簡単な説明】
【００１４】
【図１】図１は、実施例１に係る情報処理システム１００の構成例を示す図である。
【図２】図２は、実施例１に係る情報処理システム２００のハードウェア構成例を示す図である。
【図３】図３は、ＣＰＵチップの構成例を示す図である。
【図４】図４は、アクセストークン記憶部の構成例を示す図である。
【図５】図５は、レジスタ部３４の構成例を示す図である。
【図６】図６は、判定部の構成例を示す図である。
【図７】図７は、実施例１に係る情報処理システム２００のハードウェアの論理構成及びソフトウェアの機能構成の一例を示す図である。
【図８】図８は、ノード毎に作成する共有メモリのセグメント管理テーブルの一例を示す。
【図９】図９は、実施例１に係るアクセストークンを用いた共有メモリアクセス時の例外トラップ処理の概要を示すフローチャートである。
【図１０】図１０は、複数のノードにおいてアプリケーションプログラムがアクセストークンを用いて共有メモリのアクセスを行う場合の処理の一例を示すフローチャートである。
【図１１】図１１は、２個のアクセストークンを設定する処理の一例を示すフローチャートである。
【図１２】図１２は、４個のアクセストークンを設定する処理の一例を示すフローチャートである。
【図１３】図１３は、Ｎ個のアクセストークンを設定する処理の一例を示すフローチャートである。
【図１４】図１４は、コンテキストスイッチの処理におけるアクセストークンの退避・復元の一例を説明するフローチャートである。
【図１５】図１５は、２個のアクセストークンを使用して共有メモリをアクセスする場合の例外トラップ処理の一例を説明するフローチャートである。
【図１６】図１６は、４個のアクセストークンを使用して共有メモリをアクセスする場合の例外トラップ処理の一例を説明するフローチャートである。
【図１７】図１７は、Ｎ個のアクセストークンを使用して共有メモリをアクセスする場合の例外トラップ処理の一例を説明するフローチャートである。
【図１８】図１８は、２個のアクセストークンを使用してメモリ間のデータのコピーをする場合の処理の一例を示すフローチャートである。
【図１９】図１９は、４個のアクセストークンを使用してメモリ間のデータのコピーをする場合の処理の一例を示すフローチャートである。
【図２０】図２０は、実施例２に係る情報処理システム３００の構成例を示す図である。
【図２１】図２１は、従来の１つのアクセストークンを用いてメモリアクセスする場合処理の一例を示すフローチャートである。
【図２２】図２２は、従来の１つのアクセストークンを用いて、異なる共有メモリ間でデータをコピーする場合の処理の一例を示すフローチャートである。
【発明を実施するための形態】
【００１５】
以下、本発明の実施形態について、図１〜図２０を参照して具体的に説明する。
【００１６】
（実施例１）
図１は、実施例１に係る情報処理システム１００の構成例を示す図である。図１に示すように、情報処理システム１００は、複数のノード１と、共有メモリ部２とを含む。各ノード１は、ＣＰＵチップ１１とローカルメモリ１５とを含む。ＣＰＵチップ１１は、演算処理を行うＣＰＵコア１２と、アクセストークン記憶部１３と、送信部１４とを含むハードウェアである。ローカルメモリ１５は、ＣＰＵコア１２が実行する処理に用いられるデータおよびプログラムを格納するハードウェアである。各ノード１のＣＰＵチップ１１を用いて、１つ以上のオペレーティングシステム（ＯＳ）が動作する。各ノード１はクロスバスイッチ等のインターコネクト３を介して接続される。インターコネクト３は、クロスバスイッチに限られず、ＬＡＮ（Local Area Network）や、インフィニバンド等を用いてもよい。
【００１７】
図１において、共有メモリ部２は破線で示されているが、各ノード１に備えられて、各ノード１内の共有メモリ部２を複数のノード１からアクセスできるノード間共有メモリの構成とすることができる。ここで、「ノード間共有メモリ」とは、複数のノードからアクセス（リード／ライト）可能な共有メモリをいう。例えば、ＮＵＭＡ（Non-Uniformed Memory Access）のようなシステム構成とし、各共有メモリ部２を仮想的なメモリマップに含まれる複数の領域の１つ１つにアサインすることで、全体として大きな共有メモリとして扱うことができる。また、本発明の一態様を実施するためのシステム構成として、共有メモリ部２を複数のノードからアクセス可能な共有ストレージ装置のような構成にすることもできる。
【００１８】
共有メモリ部２は、共有メモリ２１と、メモリトークン記憶部２２と、判定部２３と、メモリインタフェース（Ｉ／Ｆ）回路２４とを含む。共有メモリ２１は、複数のセグメントを含み、複数のノード１で共有されるメモリである。ここで、「セグメント」とは、共有メモリを管理する単位であり、セグメントごとに、アクセス許可の制御に用いる識別情報であるメモリトークンを設定することができる。セグメントのサイズとしては、例えば４ＭＢ、３２ＭＢ、２５６ＭＢ、２ＧＢ等、共有メモリの管理を行うための任意のサイズとすることができる。
【００１９】
メモリトークン記憶部２２は、共有メモリに含まれるセグメント毎のアクセス許可の制御に用いるメモリトークンを格納する。図１の例では、メモリトークン記憶部２２は、例えば共有メモリに含まれるセグメント（Ａ）、（Ｂ）のそれぞれに対応するメモリトークン（Ａ）、（Ｂ）を格納する。判定部２３は、共有メモリ２１に含まれるセグメントをアクセスするリクエストについて、リクエストに含まれる情報とメモリトークンとを用いて共有メモリへのアクセスの可否を判定する回路である。メモリインタフェース（Ｉ／Ｆ）回路２４は、判定部２３がリクエストのアクセスを許可する場合に、共有メモリをアクセスするリクエストのアクセス制御を行う回路である。
【００２０】
ＣＰＵチップ１１のアクセストークン記憶部１３は、ＣＰＵコア１２が、共有メモリ２１に含まれる特定のセグメントをアクセスするための特定のアクセス識別情報であるアクセストークンを記憶する記憶部である。アクセストークン記憶部１３は、ＣＰＵコア１２がアクセスを予定している、共有メモリ２１の複数のセグメントに対応する複数のアクセストークンを記憶する。
【００２１】
送信部１４は、ＣＰＵコア１２から発行される共有メモリ２１をアクセスするリクエストに、アクセストークン記憶部１３に格納された複数のアクセストークンを付加して送信する。アクセストークン記憶部１３に格納する各アクセストークンは、ＣＰＵコア１２上で実行するアプリケーションプログラムがアクセスすることを予定している共有メモリのセグメントに対応するアクセストークンである。これらのアクセストークンは、予めアプリケーションプログラム又はオペレーティングシステム（ＯＳ）により、アクセストークン記憶部１３に格納される。
【００２２】
本実施態様では、ＣＰＵコア１２が異なるメモリトークンが設定された複数のセグメントにアクセスを行う際、各リクエストについて、予めアクセストークン記憶部に格納しておいた複数のアクセストークンを付加して送信する。そして、リクエストのアクセス先の共有メモリ部２の判定部２３は、リクエストに含まれる複数のアクセストークンと、リクエストのアクセス先のセグメントに対応するメモリトークンとを比較する。判定部２３は、リクエストのアクセス先に応じてメモリトークン記憶部２２から読み出したメモリトークンが、リクエストに含まれる複数のアクセストークンのいずれか１つと一致すると、そのリクエストのアクセスを許可する。
【００２３】
共有メモリの複数の領域をアクセスする各リクエストに対して、予めアクセストークン記憶部１３に格納しておいた複数のアクセストークンを付加して送信し、判定部２３でメモリトークンと比較することで、図２２に示されるアクセストークンの再設定が不要となる。すなわち、異なるメモリトークンが設定された複数のメモリ領域にアクセスを行う際の、アクセストークンの再設定のオーバーヘッドを低減することができる。
【００２４】
図２は、実施例１における、情報処理システム２００のハードウェア構成例を示す図である。情報処理システム２００は、３つのノード１と、サービスプロセッサ４とがインターコネクト３を介して接続される。各ノード１は、２つのＣＰＵチップ１１と、４つのメモリ１７と、ディスクユニット１８と、通信インターフェイス２０とを有する。
【００２５】
各ＣＰＵチップ１１は、２つのＣＰＵコア１２を有し、各ＣＰＵコア１２は、２つのストランド１６を有する。ノード１に含まれる４つのメモリ１７は、ノード１に含まれる４つのＣＰＵコア１２に対応する。ストランド１６は、ＣＰＵコア１２上で実行されるアプリケーションプログラムのプロセスの単位で実行するハードウェアスレッドである。
【００２６】
メモリ１７は、ＣＰＵコア１２が実行するプログラムや、ＣＰＵコア１２が使用するデータを記憶するＲＡＭ（Random Access Memory）である。メモリ１７は、例えば、ＤＩＭＭ（Dual Inline Memory Module）等の複数のメモリを含み、その一部を他のノードからもアクセス可能な共有メモリ２１として使用し、他の一部を対応するＣＰＵコア１２がローカルにアクセスするローカルメモリ１５として使用することができる。以下、各メモリ１７は、ローカルメモリ１５と共有メモリ２１とを有することを前提として説明する。
【００２７】
ディスクユニット１８は、例えば２つのハードディスクドライブ（ＨＤＤ）１９を有する記憶装置である。ＨＤＤ１９は、磁気ディスク装置である。また、通信インターフェイス２０は、クロスバスイッチ等のインターコネクト３を介して他のノード１やサービスプロセッサ４と通信を行うためのインターフェイス回路である。
【００２８】
サービスプロセッサ４は、各ノード１の制御を行う装置であり、ＣＰＵ４１、メモリ４２、通信インターフェイス４３を有する。ＣＰＵ４１は、サービスプロセッサ４が行う各種処理を、メモリ４２に記憶したプログラムを実行することにより行う。メモリ４２は、ＣＰＵ４１によって実行されるプログラムやＣＰＵ４１が使用するデータを記憶するＲＡＭである。通信インターフェイス４３は、サービスプロセッサ４が、インターコネクト３を介してノード１と通信を行うためのインターフェイス回路である。
【００２９】
なお、図２では図示していないが、アプリケーションプログラムの各プロセスを実行するストランド１６毎に、図１で説明したアクセストークン記憶部１３や送信部１４を有する。また、各メモリ１７に含まれる共有メモリ２１ごとに、図１で説明したメモリトークン記憶部２２、判定部２３、メモリＩ／Ｆ回路２４を有する。なお、アクセストークン記憶部１３は、アプリケーションプログラムの処理が各ＣＰＵコア１２の単位で実行される場合には、ＣＰＵコア１２毎に設けることもできる。ストランド１６毎又はＣＰＵコア１２毎にアクセストークン記憶部１３を設けることで、アプリケーションプログラムのプロセス毎にメモリアクセス制御を行うことができる。
【００３０】
情報処理システム２００では、各ノード１のメモリ１７が共有メモリ２１を含み、各ノード１の共有メモリ２１は他のノードのＣＰＵチップ１１からもアクセスできるノード間共有メモリの構成となっている。情報処理システム２００の各ノード１は、ビルディングブロックといった名称で呼ばれる場合もある。
【００３１】
ノード間共有メモリを有する情報処理システム２００において、ノード間の共有メモリ領域として設定した物理メモリを有するノードを「ホームノード」といい、ホームノードの共有メモリを参照する他のノードを「リモートノード」という。
【００３２】
情報処理システム２００の各ノード１は、他のノード１から自ノード（ホームノード）内の共有メモリへのアクセスを制御するためのメモリトークンを、自ノード内のメモリトークン記憶部２２に記憶する。また、ホームノードは、自ノード内の共有メモリのセグメントをアクセスする他のノードに対して、セグメントのメモリトークンに対応するトークンを通知する。リモートノードは、ホームノードから受信したトークンを保持し、トークンに対応するホームノードのセグメントをアクセスする際に、アクセストークンとして使用する。
【００３３】
情報処理システム２００は、ノード間共有メモリのメモリ構成を有するため、各ノードに含まれるストランド１６は、自ノード内の共有メモリだけでなく、他のノード１内の共有メモリにもアクセスすることができる。ストランド１６は、共有メモリをアクセスする際には、アクセス先の共有メモリのセグメントに対応するアクセストークンを含む複数のアクセストークンを各リクエストに付加して送信することで、共有メモリのアクセスを行う。
【００３４】
ホームノードの共有メモリ２１毎に設けられた判定部２３では、リクエストに付加された複数のアクセストークンのいずれかが、リクエストがアクセスしようとするセグメントのメモリトークンに対応するかどうかに応じて、リクエストのアクセスの許可を制御する。
【００３５】
なお、説明の便宜上、図２では３つのノード１を有するシステム構成となっているが、任意の個数のノードを有するシステムとすることができる。また、ＣＰＵチップ１１に含まれるＣＰＵコア１２の個数や、ＣＰＵコア１２に含まれるストランド１６の個数についても任意の数とすることができる。また、メモリ１７や、ディスクユニット１８に含まれるＨＤＤ１９の数についても任意の個数とすることができる。
【００３６】
図３は、図２におけるＣＰＵチップ１１のブロック図の一例を示す図である。ＣＰＵチップ１１は、２個のＣＰＵコア１２と、メモリトークン記憶部２２と、二次キャッシュメモリ３９とを有する。また、図３には図示されていないが、ＣＰＵチップ１１は、各ＣＰＵコア１２がメモリ１７をアクセスするための判定部２３や、共有メモリ２１のリード／ライトを制御するメモリＩ／Ｆ回路２４も備える。各ＣＰＵコア１２は、一次キャッシュメモリ３６と、ストランド１６とを有する。
【００３７】
メモリトークン記憶部２２は、メモリ１７に含まれる共有メモリ２１に含まれるセグメントに対応するメモリトークンを記憶する。メモリトークン記憶部２２に記憶される複数のメモリトークンは、ＣＰＵコア１２上で実行されるアプリケーションプログラムが使用する予定の複数のセグメントのそれぞれに対応する。
【００３８】
二次キャッシュメモリ３９は、ＣＰＵコア１２内の一次キャッシュメモリ３６と比較して低速で大容量のキャッシュメモリである。一次キャッシュメモリ３６は、二次キャッシュメモリ３９と比較して高速で小容量のキャッシュメモリである。一次キャッシュメモリ３６は、命令キャッシュメモリ３７と、データキャッシュメモリ３８とを有する。命令キャッシュメモリ３７は、メモリ１７又はディスクユニット１８から読み出された命令コードを一時的に記憶する。データキャッシュメモリ３８は、メモリ１７又はディスクユニット１８から読み出されたデータを一時的に記憶する。
【００３９】
ストランド１６は、命令制御部３１と、命令バッファ３２と、演算部３３と、レジスタ部３４と、アクセストークン記憶部３５とを有する。図３に示すように、命令制御部３１及び演算部３３は、複数のストランド１６で共通のハードウェア資源として実装することもできる。
【００４０】
命令制御部３１は、命令バッファ３２から命令を読み出し、読み出した命令の実行を制御する。命令バッファ３２は、命令キャッシュメモリ３７から読み出された命令を記憶する。演算部３３は、四則演算等の演算を実行する。レジスタ部３４は、命令の実行に用いられるデータを記憶する汎用レジスタや、種々のステータスレジスタ等を有する。
【００４１】
アクセストークン記憶部３５は、ストランド１６に対応付けられ、メモリトークンが設定された共有メモリ２１のセグメントをアクセスするためのアクセストークンを複数個記憶する。なお、図３において、各ストランド１６が発行するリクエストについて、アクセストークン記憶部３５に記憶された複数のアクセストークンを付加して送信する送信部は図示を省略している。
【００４２】
図４（Ａ）、（Ｂ）、（Ｃ）は、アクセストークン記憶部１３のいくつかの構成例を示す図である。図４（Ａ）に示すアクセストークン記憶部１３は、６４ビットの１つのアクセストークンレジスタ１３１を有し、３１〜０ビットにアクセストークン１を格納し、６３〜３２ビットにアクセストークン２を格納する例を示した図である。図４（Ａ）では、２個のアクセストークンを１つのアクセストークンレジスタ１３１に格納する例を示しているが、さらに多くのアクセストークンを１つのレジスタに格納してもよい。
【００４３】
図４（Ｂ）に示すアクセストークン記憶部１３は、それぞれ１つのアクセストークンを格納する複数のアクセストークンレジスタ１３２を有する例を示した図である。図４（Ｂ）の例では、予め格納することを予定するアクセストークンの数だけ、アクセストークンレジスタ１３２を設ける。ソフトウェアプログラムで更新可能なアクセストークンを格納するレジスタを複数設けておくことで、ソフトウェアプログラムによって任意のルールでアクセストークンを更新する処理を行うことができる。
【００４４】
図４（Ｃ）に示すアクセストークン記憶部１３は、ＦＩＦＯ（Ｆｉｒｓｔ−Ｉｎ−Ｆｉｒｓｔ−Ｏｕｔ）バッファ１３３を用いて複数のアクセストークンを格納する例を示した図である。ＦＩＦＯバッファ１３３でアクセストークンを格納することにより、アクセストークンの更新の際に、自動的に最も古いアクセストークンを削除するとともに、新しいアクセストークンを追加することができる。
【００４５】
図５は、レジスタ部３４の構成例を示す図である。レジスタ部３４は、複数の汎用レジスタ３４１と、フォルトステータスレジスタ３４２と、フォルトアドレスレジスタ３４３と、トラップＰＣ（ＴＰＣ）レジスタ３４４とを含む。
【００４６】
汎用レジスタ３４１は、ストランド１６においてロード命令やストア命令、各種演算命令を実行する際に使用される汎用レジスタである。フォルトステータスレジスタ３４２は、例外が発生した場合のステータスを記憶するレジスタである。フォルトアドレスレジスタ３４３は、メモリアクセスにおいて例外が発生した場合に、例外が発生したメモリアクセスのアクセス先のアドレスを記憶するレジスタである。ＴＰＣレジスタ３４４は、例外が発生した際のプログラムカウンタ（ＰＣ）を記憶するレジスタである。
【００４７】
図６は、判定部２３の構成例を示す図である。判定部２３は、共有メモリをアクセスするリクエストに含まれる複数のアクセストークンのいずれかが、リクエストのアクセス先に対応するメモリトークンに対応するかどうかに応じて、リクエストのメモリアクセスを許可するかどうかを判定する。
【００４８】
判定部２３は、比較器２３１、２３２と、ＯＲ回路２３３と、インバータ回路２３４とを含む。比較器２３１は、リクエストに含まれるアクセストークン１と、メモリトークン記憶部２２から読み出されたメモリトークンとを比較し、両者が一致すれば、Ｈｉｇｈレベルの信号を出力する回路である。比較器２３２は、リクエストに含まれるアクセストークン２と、メモリトークン記憶部２２から読み出されたメモリトークンとを比較し、両者が一致すれば、Ｈｉｇｈレベルの信号を出力する回路である。
【００４９】
ＯＲ回路２３３は、比較器２３１と比較器２３２のいずれかの出力信号がＨｉｇｈレベルであれば、Ｈｉｇｈレベルを出力するＯＲ回路である。ＯＲ回路２３３の出力は、アクセス許可信号としてメモリＩ／Ｆ回路２４に出力される。メモリＩ／Ｆ回路２４は、アクセス許可信号がＨｉｇｈレベルであれば、リクエストの共有メモリへのアクセスを実行する。
【００５０】
インバータ回路２３４は、例えば、ＯＲ回路２３３から出力されたアクセス許可信号を反転させてトークンエラー信号として出力する。このトークンエラー信号は、例えば、リクエストに対するエラー応答や、リクエストを発行したＣＰＵコアへの例外を発生させるための信号として用いられる。
【００５１】
図７は、実施例１における、情報処理システムのハードウェアの論理構成及びソフトウェアの機能構成を示す図である。ここで、ハードウェアの論理構成は、ＣＰＵチップ１１上で実行されるＯＳやアプリケーションが使用する論理的なハードウェア構成をいうものとする。図７では、１つのノード１を１つの論理ドメインとした場合の例を示す。また、１つの論理ドメインでは例えば１つのＯＳが実行される。
【００５２】
図７において、ハードウェアの論理構成は、上部の波線で囲まれた部分に示される。ノード１は、ハードウェアの論理資源として４つの仮想ＣＰＵ（ＶＣＰＵ）５１と、ローカルメモリ５２と、共有メモリ５３と、ディスク装置５４とを有する。ＶＣＰＵ５１は、論理的なＣＰＵであり、図２に示される８つのストランド１６のいずれかに対応する。
【００５３】
各ＶＣＰＵ５１は、論理アドレス（ＶＡ）を用いてメモリアクセスを行うが、不図示のアドレス変換機構によって論理アドレス（ＶＡ）は実アドレス（ＲＡ）又は物理アドレス（ＰＡ）に変換されて、共有メモリのアクセスが行われる。ここで、「物理アドレス（ＰＡ）」とは、メモリの物理位置によって振り分けられるアドレスをいい、「実アドレス（ＲＡ）」とは、仮想化機能を導入したシステムで論理ドメイン毎に振り分けられるアドレスをいう。
【００５４】
ローカルメモリ５２は、各ノード内のＣＰＵコア１２からのみアクセスされるメモリであり、共有メモリ５３は、他のノード１からもアクセス可能なメモリである。ローカルメモリ５２と共有メモリ５３は、それぞれ図２中に示したメモリ１７に含まれるローカルメモリ１５と共有メモリ２１に対応する。ディスク装置５４は、図２中に示したディスクユニット１８に対応する。
【００５５】
図７において、ソフトウェアの機能構成としては、ハイパーバイザ６０と、オペレーティングシステム（ＯＳ）６２が含まれる。
【００５６】
ハイパーバイザ６０は、情報処理システム２００の物理資源を管理してＯＳ６２に論理資源を提供する基本ソフトウェアであり、その機能の一つとして例外処理部６１を有する。
【００５７】
例外処理部６１は、情報処理システム２００の物理資源を用いた処理等において発生した例外を、処理の実行を行ったノード１のＯＳ６２に通知する。その際、例外処理部６１は、例外が発生した処理に関連する情報も合わせて通知を行う。例えば、共有メモリをアクセスする処理においてトークン不一致の例外が発生した場合には、例外処理部６１は、その例外の種類がトークン不一致の例外であることと共に、例外が発生したアドレス等の情報も通知する。
【００５８】
ＯＳ６２は、論理資源を用いてアプリケーションプログラムの実行を制御する。ＯＳ６２は、共有メモリ管理部７０を含む。共有メモリ管理部７０は、共有メモリ５３を管理し、トークン通知ＡＰＩ７１と、アクセストークン設定部７２と、管理テーブル記録部７３と、コンテキストスイッチ処理部７４と、例外トラップハンドラ７５と、トークン比較部７６と、トークンエラー通知部７７と、アクセストークン再設定部７８と、アクセス再実行部７９と、管理テーブル８０とを有する。
【００５９】
ハイパーバイザ６０の各機能およびＯＳ６２や共有メモリ管理部７０に含まれるトークン通知ＡＰＩ７１と、アクセストークン設定部７２と、管理テーブル記録部７３と、コンテキストスイッチ処理部７４と、例外トラップハンドラ７５と、トークン比較部７６と、トークンエラー通知部７７と、アクセストークン再設定部７８と、アクセス再実行部７９の各機能は、情報処理システム２００の各ノードが有するＣＰＵチップ１１やメモリ１７等のハードウェア資源を用いて実行される。
【００６０】
トークン通知ＡＰＩ７１は、アプリケーションプログラムが、自プログラムが使用することを予定している共有メモリのセグメントに対応するトークン（以降、単に「トークン」という）をＯＳ６２に通知するＡＰＩ（Application Programming interface）手段である。ＶＣＰＵ５１により実行されるアプリケーションプログラムは、自プログラムがアクセスすることを予定している共有メモリのセグメントに対応するトークンを、トークン通知ＡＰＩ７１を用いて予めＯＳ６２に通知する。アプリケーションプログラムがアクセスしようとしている共有メモリの各セグメントに対応するアクセストークンをＯＳ６２に通知するタイミングは、図１０を用いて後述する。
【００６１】
アクセストークン設定部７２は、アプリケーションプログラムからトークン通知ＡＰＩ７１を用いて通知されたアクセストークンを、アクセストークン記憶部３５に設定する。アクセストークン設定部７２は、アクセストークンの設定を行う際に、すでにアクセストークン記憶部３５に複数のアクセストークンが設定されている場合、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部３５の設定を行う。アクセストークン設定部７２によるアクセストークンの設定処理は、図１１〜図１３を用いて後述する。
【００６２】
管理テーブル記録部７３は、アプリケーションプログラムからトークン通知ＡＰＩ７１を用いて通知されたアクセストークンを、管理テーブル８０に格納する。ここで、管理テーブル８０は、ノード１毎に設けられ、他のノード１が有する共有メモリ５３を含めて情報処理システム２００が有する全ての共有メモリ５３について、セグメント毎に共有メモリ５３の情報を記憶するテーブルである。管理テーブル８０は、例えばローカルメモリ５２内の特定の領域に格納される。
【００６３】
アプリケーションプログラムが、アクセストークン記憶部３５に設定できるアクセストークンの数よりも多いアクセストークンの設定を要求する場合がある。このような場合に備えて、管理テーブル記録部７３は、ノード１毎に設けられる管理テーブル８０に、トークン通知ＡＰＩ７１で通知されたアクセストークンを全て記録していく。
【００６４】
管理テーブル８０の例は、図８を用いて後述する。また、管理テーブル記録部７３によるアクセストークンの管理テーブルへの格納処理は図１１〜図１３を用いて後述する
コンテキストスイッチ処理部７４は、ＣＰＵコア１２のストランド１６上で実行されるアプリケーションプログラムのプロセスを変更するコンテキストスイッチにおけるレジスタ等に記憶された情報の退避及び復元の処理を行う。具体的には、コンテキストスイッチ処理部７４は、プロセスのスレッド毎に予め設けられた退避領域を使用して、アクセストークン記憶部３５やレジスタ部３４に記憶した情報の退避及び復元を行う。コンテキストスイッチ処理部７４が、アクセストークン記憶部３５に記憶されたアクセストークンの情報も含めてコンテキストスイッチの処理を行うことにより、コンテキストスイッチが発生しても、プロセスのスレッド毎に設定した最も新しいアクセストークンの設定値を引き継ぐことができる。コンテキストスイッチ処理部７４による処理の詳細については、図１４を用いて後述する。
【００６５】
例外トラップハンドラ７５は、ストランド１６上で実行されるアプリケーションプログラムの処理において例外が発生した場合の例外処理を行う。例外トラップハンドラ７５は、発生した例外の内容に応じて、各例外に対する例外処理を行う処理部に処理を渡して必要な例外処理を実行させる。
【００６６】
例えば、アプリケーションプログラムが、共有メモリ５３に対してアクセス（ロード又はストア）しようとした場合に、そのアクセスを行うリクエストに含まれる複数のアクセストークンとメモリトークンが対応しなければ、トークン不一致の例外トラップが発生する。
【００６７】
より具体的には、アクセス先の共有メモリ５３のアクセスの判定を行う判定部２３は、リクエストのアクセス先のセグメントに対応するメモリトークンが、リクエストに含まれる複数のアクセストークンのいずれとも一致しない場合、そのリクエストに対してトークン不一致によるエラー応答を行う。
【００６８】
リクエストの発行元のノード１の通信インターフェイス２０等のハードウェア資源は、リクエストに対するエラー応答を受信すると、トークン不一致による例外を発生させる。トークン不一致によるハードウェア資源からの例外が発生すると、ハイパーバイザ６０の例外処理部６１は、トークン不一致の例外トラップをＯＳ６２に通知する。
【００６９】
ＯＳ６２の例外トラップハンドラ７５は、ハイパーバイザ６０の例外処理部６１から例外トラップを受信すると、まず、フォルトステータスレジスタ３４２をリードして、トラップ要因がトークン不一致によるものかどうかを判定する。トラップ要因がトークン不一致によるものであれば、例外トラップハンドラ７５は、後述のトークン不一致の例外処理を行うトークン比較部７６、アクセストークン再設定部７８、アクセス再実行部７９等に例外処理を実行させる。
【００７０】
なお、トークン不一致の例外トラップが発生した場合、その例外処理を行うストランド１６のレジスタ部３４に含まれるレジスタに例外トラップに関連する各種情報が記録される。トークン不一致の例外トラップが発生した場合にレジスタ部３４に記録される情報としては、例えば、トークン不一致の例外トラップ発生に関する要因を示す情報がフォルトステータスレジスタ３４２に記録される。また、トークン不一致の例外トラップを発生させたリクエストがアクセス（ロード又はストア）しようとしていたアドレスであるフォルトアドレスの情報がフォルトアドレスレジスタ３４３に記録される。さらに、トークン不一致の例外トラップ発生の契機となったリクエストを実行しようとした命令のプログラムカウンタ（ＰＣ）の値が、ＴＣＰレジスタ３４４に記録される。
【００７１】
後述のトークン比較部７６、アクセストークン再設定部７８等は、レジスタ部３４に記録された情報を参照して、例外トラップが発生した際の要因やアクセス先のアドレス、例外トラップを発生させたリクエストを実行した命令のＰＣ値等の情報を取得する。これらの処理の詳細については図１５〜１７を用いて後述する。
【００７２】
トークン比較部７６は、トークン通知ＡＰＩ７１でアプリケーションプログラムから指定されたトークンと、アクセストークン記憶部３５に記憶した複数のアクセストークンとの比較を行う。例外トラップハンドラ７５から呼び出されたトークン比較部７６は、以下の処理を行う。
【００７３】
トークン比較部７６は、まず、フォルトアドレスレジスタ３４３をリードして、トークン不一致の例外トラップが発生したフォルトアドレスの情報を取得する。トークン比較部７６は、取得したフォルトアドレスの情報と管理テーブル８０に格納された情報から、アプリケーションがアクセスしようとした共有メモリのセグメントを特定し、特定したセグメントのトークンの値を管理テーブル８０から取得する。管理テーブル８０から取得したトークンの値は、トークン通知ＡＰＩ７１でアプリケーションプログラムから指定されたトークンの値であり、共有メモリのアクセスをする際に、アクセストークン記憶部３５に記憶しておく必要があるトークンである。
【００７４】
先にも述べたとおり、アクセストークン記憶部３５に記憶したアクセストークンの数よりも、アプリケーションプログラムからトークン通知ＡＰＩ７１を介して通知されるトークンの数の方が多い場合がある。その場合、共有メモリをアクセスするリクエストに付加して送信すべきアクセストークンがアクセストークン記憶部３５に記憶されていない場合がある。
【００７５】
従って、トークン比較部７６は、例外を発生させたリクエストがアクセスしようとしていた共有メモリのセグメントに対応する、管理テーブル８０に格納されたトークンと、アクセストークン記憶部３５に記憶されている複数のアクセストークンとを比較する。そして、比較の結果に応じて、後述のトークンエラー通知部７７又はアクセストークン再設定部７８の処理を実行させる。トークン比較部７６の処理の詳細については図１５〜１７を用いて後述する。
【００７６】
トークンエラー通知部７７は、アプリケーションプログラムに対して、トークンの設定エラーがあることを示すシグナルを通知するＡＰＩである。トークンエラー通知部７７は、管理テーブル８０から読み出された特定のセグメントに対するトークンが「０」である場合、すなわち、そのセグメントに対するトークンが未設定の場合、アプリケーションプログラムにトークン未設定のシグナルを通知する。
【００７７】
トークンエラー通知部７７は、トークン比較部７６の比較の結果、管理テーブル８０から取得したトークンがアクセストークン記憶部３５に記憶した複数のアクセストークンのいずれかに一致した場合、アプリケーションプログラムにトークン不一致のシグナルを通知する。
【００７８】
アクセストークン記憶部３５に記憶した複数のアクセストークンのいずれかと、アプリケーションプログラムがトークン通知ＡＰＩ７１で通知したトークンとが一致した状態でトークン不一致の例外トラップを受信した場合、トークンの設定エラーがあることになる。すなわち、トークン通知ＡＰＩ７１で通知されたトークンがアクセストークン記憶部３５に正しく設定されているにもかかわらず、トークン不一致の例外トラップが発生しているので、トークン通知ＡＰＩ７１で通知されたトークンに問題があることになる。
【００７９】
この場合、ホームノードのメモリトークンと、ホームノード又はリモートノードでアプリケーションプログラムが設定したトークンとが対応していないので、トークンエラー通知部７７は、アプリケーションプログラムにトークン不一致のシグナルを通知する。トークン不一致のシグナルには、例えば、トークン不一致の例外トラップが発生したフォルトアドレスや、トラップＰＣの情報を含めることができる。
【００８０】
アクセストークン再設定部７８は、トークン比較部７６の比較の結果、管理テーブル８０から取得したトークンがアクセストークン記憶部３５に記憶した複数のアクセストークンのいずれにも一致しない場合、アクセストークン記憶部３５の再設定を行う。再設定に際して、アクセストークン再設定部７８は、トークン不一致の例外トラップを発生させたリクエストがアクセスしようとしていた共有メモリのセグメントに対応するトークンを管理テーブル８０から読み出して、アクセストークン記憶部３５に再設定する。
【００８１】
アクセストークン記憶部３５の再設定を行う際、アクセストークン再設定部７８は、すでにアクセストークン記憶部３５に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部３５の設定を行う。アクセストークン再設定部７８によるアクセストークンの再設定処理は、図１５〜１７を用いて後述する。
【００８２】
アクセス再実行部７９は、アクセストークン再設定部７８によるアクセストークンの再設定を行った後、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する。再設定されたアクセストークンは、トークンの設定ミスがない限りアクセス先のセグメントに対応するメモリトークンと一致するので、再実行されたメモリアクセスは正常にアクセスされることになる。アクセス再実行部７９の処理についても、図１５〜１７を用いて後述する。
【００８３】
図８は、ノード毎に作成する共有メモリのセグメントの管理テーブル８０の一例を示す図である。図８は、ノード番号が「０」であるノード０の管理テーブル８０−０の例と、ノード番号が「１」であるノード１の管理テーブル８０−１の例と、ノード番号が「２」であるノード２の管理テーブル８０−２の例を示す。ここで、ノード０とノード１はホームノードであり、ノード２はリモートノードであるものとする。
【００８４】
図８において、セグメント番号が「０」〜「４」のセグメントは、ノード０がホームノードとして物理メモリを有するセグメントであり、セグメント番号が「１６」〜「２０」のセグメントは、ノード１がホームノードとして物理メモリを有するセグメントである。この場合、図８に示す管理テーブル８０−０は、ノード０の共有メモリ５３のセグメントの管理テーブルであり、管理テーブル８０−１は、ノード１の共有メモリ５３のセグメントの管理テーブルである。また、管理テーブル８０−２は、リモートノードであるノード２が有する、セグメント「０」〜「４」、「１６」〜「２０」の管理テーブルである。
【００８５】
図８に示すように、管理テーブル８０は、セグメント番号と、アドレスと、セグメントサイズと、使用許可ノード番号と、使用中アプリのＰＩＤと、トークンとを記憶する。
【００８６】
セグメント番号は、共有メモリ５３に含まれるセグメントを識別する識別番号である。アドレスは、セグメントの物理アドレス（ＰＡ）の先頭番地を示す。なお、情報処理システムにおいて実アドレス（ＲＡ）を使用する場合、ＲＡをアドレスとしてもよい。
【００８７】
セグメントサイズは、セグメントのサイズである。使用許可ノード番号は、ホームノードの管理テーブル８０でのみ用いられ、セグメントの使用が許可されたノード１の番号である。使用中アプリのＰＩＤは、自ノードにおいてセグメントを使用するアプリケーションプログラムのプロセスＩＤである。
【００８８】
トークンは、ホームノードのセグメントの場合にはメモリトークンであり、リモートノードのセグメントの場合にはアクセストークンである。すなわち、図８における管理テーブル８０−０、８０−１のセグメント「０」〜「４」、「１６」〜「２０」のトークンはメモリトークンであり、管理テーブル８０−２の対応するセグメントのトークンはアクセストークンである。
【００８９】
例えば、ノード０の管理テーブル８０−０では、識別番号が「０」であるセグメントは、ＰＡが１６進数で「０００００００００」であり、サイズが「２５６ＭＢ」であり、使用が許可されたノードの番号は「０」及び「２」である。また、セグメント番号が「０」であるセグメントは、ホームノードであるノード０においてプロセスＩＤが「１２３」、「４５６」などのプロセスで使用されており、メモリトークンが１６進数で「１２３」である。
【００９０】
一方、ノード２の管理テーブル８０−２では、セグメント番号が「０」であるセグメントは、アドレスとセグメントサイズは管理テーブル８０−０と同じ情報が記憶されている。しかし、ノード２はホームノードではないため、セグメント番号が「０」の使用許可ノード番号はなく、リモートノードであるノード２においてプロセスＩＤが「３２１」、「６５４」などのプロセスでセグメント「０」が使用されている。また、ノード２はリモートノードであることから、トークンとしては、アクセストークンが１６進数で「１２３」として記憶されている。
【００９１】
なお、図８においては、説明上必要なセグメント番号の例しか示していないが、各ノードにおける管理テーブル８０のそれぞれに、すべてのノードの共有メモリのセグメント番号に対応する情報を格納するようにしても良い。
【００９２】
次に、図９、図１０を参照しながら、情報処理システム２００による情報処理方法の概要について説明する。
【００９３】
図９は、実施例１に係る複数のアクセストークンを用いた共有メモリアクセス時の処理の概要を示すフローチャートである。まず、アプリケーションプログラムが、トークン通知ＡＰＩ７１を使用して、アプリケーションプログラムが使用を予定している共有メモリの各セグメントのトークンをＯＳ６２に通知する（Ｓ１０１）。
【００９４】
ＯＳ６２は、トークン通知ＡＰＩ７１によって通知されたトークンを、管理テーブル８０に記録する（Ｓ１０２）。また、ＯＳ６２は、トークン通知ＡＰＩ７１によって通知されたトークンを、アクセストークン記憶部３５に複数設定する（Ｓ１０３）。
【００９５】
その後、アプリケーションプログラムのプロセスが、共有メモリを使用しながら、処理を行う。その際、プロセスの変更を行うコンテキストスイッチが発生した場合（Ｓ１０４ＹＥＳ）、アクセストークン記憶部３５のレジスタを含むプロセスの処理で必要となるレジスタの値を退避し、切り替え先のプロセスのレジスタの情報を復元する（Ｓ１０５）。コンテキストスイッチが発生しない限り（Ｓ１０４  ＮＯ）、アプリケーションプログラムが、共有メモリにアクセスしながら処理を行う（Ｓ１０６）。アプリケーションプログラムの共有メモリを利用した処理は、例外トラップが発生しない限り継続して行われる（Ｓ１０７  ＮＯ）。
【００９６】
アプリケーションプログラムによる共有メモリのアクセスで例外トラップが発生した場合（Ｓ１０７  ＹＥＳ）、ＯＳ６２は、例外トラップを発生させた例外の要因の情報を取得する（Ｓ１０８）。例外トラップを発生させた例外の要因がトークンの不一致によるものであれば、ステップＳ１１０の処理に進み、要因がトークンの不一致でなければ、他の例外処理が行われる（Ｓ１０９）。
【００９７】
ステップＳ１１０では、ＯＳ６２が、トークン不一致の例外トラップを発生させた共有メモリアクセスを行うリクエストのアクセス先のアドレスに対応するセグメントを特定する。そして、ＯＳ６２は、特定したセグメントに対して設定されたトークンを、管理テーブル８０から取得する。なお、管理テーブル８０には、トークン通知ＡＰＩ７１により通知された全てのトークンの値が格納されている。
【００９８】
ＯＳ６２は、管理テーブル８０から取得したトークンの値と、アクセストークン記憶部３５に記憶された複数のアクセストークンのそれぞれの値とを比較する（Ｓ１１０）。管理テーブル８０から取得したトークンの値が、アクセストークン記憶部３５に記憶された複数のアクセストークンの一つとでも一致する場合（Ｓ１１１  ＹＥＳ）には、アプリケーションプログラムによるトークンの設定に問題があることになる。すなわち、アクセストークンが正しく設定されている状態で、トークン不一致による例外トラップが発生すれば、アクセス先のセグメントに設定されているメモリトークンと、アプリケーションプログラムが設定したトークンとが対応していないことになる。この場合、ＯＳ６２は、アプリケーションプログラムにトークン通知ＡＰＩ７１を用いて通知されたトークンがメモリトークンに一致していないことを通知する（Ｓ１１２）。
【００９９】
管理テーブル８０から取得したトークンと、アクセストークン記憶部３５に記憶された複数のアクセストークンとが一致しない場合（Ｓ１１１  ＮＯ）、ＯＳ６２は、管理テーブル８０から取得したトークンをアクセストークン記憶部３５に設定する（Ｓ１１３）。アクセストークン記憶部３５の再設定を行う際、ＯＳ６２は、最も古いアクセストークンを削除するとともに、管理テーブル８０から取得したトークンを設定する（Ｓ１１３）。
【０１００】
そして、ＯＳ６２は、トークン不一致の例外トラップが発生した共有メモリのアクセスを再実行する（Ｓ１１４）。この場合、アクセス先の共有メモリのセグメントに対応するトークンがアクセストークンとしてリクエストに付加されて送信されるので、共有メモリをアクセスするリクエストは正常に実行される。
【０１０１】
本実施形態では、リクエストに２個以上のアクセストークンを付加して送信し、複数のアクセストークンとメモリトークンとを比較してアクセスを許可することで効率的にアクセス制御を行うことが可能となる。例えば、図２２のようにセグメントＡからセグメントＢへのデータ転送を行う場合でも、図９のトークン不一致の例外トラップ処理（Ｓ１１０〜Ｓ１１４）を行えば、最大２回のアクセストークンの再設定をするだけで、それ以降は正常にメモリをアクセスできる。
【０１０２】
図１０は、ノード間共有メモリのメモリ構成を有する情報処理システム２００において、複数のノードにおいてアプリケーションプログラムがアクセストークンを用いて共有メモリのアクセスを行う場合の処理の一例を示すフローチャートである。図１０の例では、ホームノードにおいては、共有メモリを使用するアプリケーションプログラムＨを起動し、リモートノードＮにおいては、共有メモリを使用するアプリケーションプログラムＲを起動することとする。
【０１０３】
まず、ホームノードで起動されたアプリケーションプログラムＨ（以下、「プログラムＨ」と記載）は、プログラムＨ自身が使用する共有メモリのセグメントＡを獲得する（Ｓ１２１）。そして、プログラムＨがセグメントＡを獲得すると、ＯＳ６２は、管理テーブル８０にセグメントＡを使用するプログラムＨのプロセスＩＤ（ＰＩＤ）を追加する（Ｓ１２２）。
【０１０４】
プログラムＨが、リモートノードＮで実行されるアプリケーションプログラムＲ（以下、「プログラムＲ」と記載）にもセグメントＡの使用を許可する場合、リモートノードＮにセグメントＡの使用を許可し、リモートノードＮに通知する（Ｓ１２３）。
【０１０５】
ホームノードのセグメントＡの使用の許可の通知を受けたリモートノードＮは、プログラムＲに共有メモリのセグメントＡを割り当てる（Ｓ１４１）。そして、リモートノードＮのＯＳ６２は、リモートノードＮの管理テーブル８０のセグメントＡの情報に、セグメントＡを使用するプログラムＲのＰＩＤを追加する（Ｓ１４２）。
【０１０６】
プログラムＨがプログラムＲによるセグメントＡの使用を許可したことを受けて、ホームノードのＯＳ６２は、管理テーブル８０にセグメントＡを使用するリモートノードＮのノードＩＤを追加する（Ｓ１２４）。また、ホームノードのＯＳ６２は、セグメントＡのメモリトークンをメモリトークン記憶部２２に設定する（Ｓ１２５）。その後、ホームノードのプログラムＨは、リモートノードＮで動作するプログラムＲに対して、セグメントＡに対して設定されたメモリトークンに対応するトークンを通知する（Ｓ１２６）。
【０１０７】
リモートノードＮのプログラムＲは、プログラムＨからのトークンの通知を受信して、セグメントＡ用のトークンを認識する（Ｓ１４３）。そして、プログラムＲは、セグメントＡ用のトークンをリモートノードＮのＯＳ６２に通知する（Ｓ１４４）。リモートノードＮのＯＳ６２は、プログラムＲから通知されたセグメントＡのトークンを、リモートノードＮの管理テーブル８０に追加し（Ｓ１４５）、セグメントＡのトークンをリモートノードＮのアクセストークン記憶部３５に設定する（Ｓ１４６）。
【０１０８】
一方、ホームノードのプログラムＨは、セグメントＡのメモリトークンに対応するトークンをホームノードのＯＳ６２に通知する（Ｓ１２７）。ホームノードのＯＳ６２は、プログラムＨから通知されたセグメントＡのトークンを、ホームノードの管理テーブル８０に追加し（Ｓ１２８）、セグメントＡのトークンをホームノードのアクセストークン記憶部３５に設定する（Ｓ１２９）。
【０１０９】
その後、ホームノードのプログラムＨは、プログラムＨが行う処理においてセグメントＡのデータを参照又は更新して処理を行う（Ｓ１３０）。また、リモートノードＮにおいても、プログラムＲは、プログラムＲが行う処理においてセグメントＡのデータを参照又は更新して処理を行う（Ｓ１４７）。
【０１１０】
なお、図１０の例では、ホームノードのプログラムＨとリモートノードＮのプログラムＲのそれぞれが共有メモリのセグメントＡを使用する場合を説明しているが、一般に、プログラムＨとプログラムＲとが複数のセグメントを使用する場合がある。そして、プログラムＨやプログラムＲが使用するセグメントの数が、それぞれのノードのアクセストークン記憶部３５に設定できるアクセストークンの数よりも多い場合、プログラムＨ、Ｒのアクセス先によってはトークン不一致の例外トラップが発生する。つまり、ステップＳ１２９、Ｓ１４６で設定したアクセストークンと、プログラムＨ、Ｒがアクセスするセグメントに対応するメモリトークンとが一致しない場合、トークン不一致の例外トラップが発生する。その場合、トークン不一致の例外トラップが発生したノードのＯＳ６２が、後述の例外トラップの例外処理を実行して、アクセストークンの更新を行う（Ｓ１３０、Ｓ１４７）。
【０１１１】
ホームノードのプログラムＨ及びリモートノードＮのプログラムＲが、セグメントＡを使用した処理を完了して、セグメントＡを使用しなくなった場合、各ノードのプログラムＨ、Ｒは、各ノードのＯＳ６２にセグメントＡのアクセストークンの解除を指示する（Ｓ１３１、Ｓ１４８）。そして、リモートノードＮのプログラムＲは、セグメントＡの使用終了をホームノードに通知する（Ｓ１４９）。
【０１１２】
ホームノードは、リモートノードＮからの通知を受けて、リモートノードＮによるセグメントＡの使用終了を認識する（Ｓ１３２）。ホームノードのＯＳ６２は、管理テーブル８０からセグメントＡの使用を終了したリモートノードＮのノードＩＤを削除する（Ｓ１３３）。また、ホームノードのＯＳ６２は、ホームノードのメモリトークン記憶部２２に記録されたセグメントＡのメモリトークンの設定を解除する（Ｓ１３４）。
【０１１３】
その後、ホームノードのＯＳ６２は、ホームノードの管理テーブル８０からセグメントＡのトークンとプログラムＨのＰＩＤを削除し（Ｓ１３５）、プログラムＨを終了する。また、リモートノードＮのＯＳ６２は、リモートノードの管理テーブル８０からセグメントＡのトークンとプログラムＲのＰＩＤを削除し（Ｓ１５０）、プログラムＲを終了する。
【０１１４】
先にも説明したとおり、アプリケーションプログラムが使用を予定している共有メモリのセグメントの数が、アクセストークン記憶部３５に設定できるアクセストークンの数よりも多い場合が十分あり得る。そのような場合、アプリケーションプログラムが共有メモリをアクセスする度にトークンの設定を行うことは、プログラムを作成する上で効率的であるとは言えない。そのため、アプリケーションプログラムが最初に使用する複数のトークンをＯＳ６２に通知した後は、アプリケーションプログラムがトークンを意識せずに共有メモリをアクセスすることが望ましい。
【０１１５】
本実施形態では、アプリケーションプログラムが最初にトークンをＯＳ６２に通知した後は、ＯＳ６２の共有メモリ管理部７０が自動的にアクセストークンの再設定等の処理を行うことで、アプリケーションプログラムがトークンを意識せずに共有メモリをアクセスできる。
【０１１６】
図１１は、アクセストークン設定部７２及び管理テーブル記録部７３によって２個のアクセストークンを設定する処理の一例を示すフローチャートである。まず、アプリケーションプログラムは、自プログラムがアクセスすることを予定している共有メモリのセグメント（Ａ）に対応するトークン（Ｔ）を、トークン通知ＡＰＩ７１を用いてＯＳ６２に通知する（Ｓ１５１）。ＯＳ６２の管理テーブル記録部７３は、トークン通知ＡＰＩ７１から通知されたセグメント（Ａ）のトークン（Ｔ）を、管理テーブル８０のセグメント（Ａ）のトークンの情報として記録する（Ｓ１５２）。
【０１１７】
また、ＯＳ６２のアクセストークン設定部７２は、トークン通知ＡＰＩ７１から通知されたセグメント（Ａ）のトークン（Ｔ）を、アクセストークン記憶部３５に設定する。その際、すでにアクセストークン記憶部３５に複数のアクセストークンが設定されている場合、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部３５の設定を行う。
【０１１８】
具体的には、アクセストークン設定部７２は、アクセストークン記憶部３５をリードして、アクセストークン１の値（Ａ１）を得る（Ｓ１５３）。そして、アクセストークン記憶部３５のアクセストークン２に、ステップＳ１５３で取得したアクセストークン１の値（Ａ１）を設定する（Ｓ１５４）。その後、ステップＳ１５１でトークン通知ＡＰＩ７１から通知されたセグメント（Ａ）のトークン（Ｔ）をアクセストークン記憶部３５のアクセストークン１に設定する（Ｓ１５５）。
【０１１９】
このようなステップＳ１５３〜Ｓ１５５の手順によりアクセストークン記憶部３５の設定を行うことにより、トークンの設定を行った時間がより新しいトークンの設定値がアクセストークン記憶部３５に残るように制御することができる。
【０１２０】
なお、アクセストークン記憶部３５に対して最初に設定を行う場合のように、アクセストークン１とアクセストークン２を一度に設定できる場合には、Ｓ１５３、Ｓ１５４の処理を省略して、アクセストークン１とアクセストークン２とを一度に設定してもよい。
【０１２１】
図１２は、アクセストークン設定部７２及び管理テーブル記録部７３によって４個のアクセストークンを設定する処理の一例を示すフローチャートである。図１２のＳ１６１、Ｓ１６２は、それぞれ図１１のＳ１５１、Ｓ１５２に対応するため、説明を省略する。
【０１２２】
アクセストークン記憶部３５に４つのアクセストークンを設定する場合、まず、アクセストークン記憶部３５をリードしてアクセストークン３、２、１の値（Ａ３、Ａ２、Ａ１）を得る（Ｓ１６３）。次に、アクセストークン４にアクセストークン３の値（Ａ３）を設定し（Ｓ１６４）、アクセストークン３にアクセストークン２の値（Ａ２）を設定し（Ｓ１６５）、アクセストークン２にアクセストークン１の値（Ａ１）を設定する（Ｓ１６６）。
【０１２３】
その後、Ｓ１６１でトークン通知ＡＰＩ７１から通知されたセグメント（Ａ）のトークン（Ｔ）をアクセストークン記憶部３５のアクセストークン１に設定する（Ｓ１６７）。なお、アクセストークン１〜アクセストークン４を一度に設定できる場合には、Ｓ１６３〜Ｓ１６６の処理を省略して、アクセストークン１〜アクセストークン４を一度に設定してもよい。
【０１２４】
図１３は、アクセストークン設定部７２及び管理テーブル記録部７３によってＮ個のアクセストークンを設定する処理の一例を示すフローチャートである。図１３のＳ１７１、Ｓ１７２は、それぞれ図１１のＳ１５１、Ｓ１５２に対応するため、説明を省略する。
【０１２５】
アクセストークン記憶部３５にＮ個のアクセストークンを設定する場合、まず、アクセストークン記憶部３５をリードしてＮ個のアクセストークンの値（Ａ（Ｎ）、Ａ（Ｎ−１）、・・・、Ａ２、Ａ１）を得る（Ｓ１７３）。次に、アクセストークン（Ｎ）にアクセストークン（Ｎ−１）の値（Ａ（Ｎ−１））を設定し（Ｓ１７４）、アクセストークン（Ｎ−１）にアクセストークン（Ｎ−２）の値（Ａ（Ｎ−２））を設定する（Ｓ１７５）。同様の処理を繰り返し、アクセストークン２にアクセストークン１の値（Ａ１）を設定する（Ｓ１７６）。
【０１２６】
その後、Ｓ１７１でトークン通知ＡＰＩ７１から通知されたセグメント（Ａ）のトークン（Ｔ）をアクセストークン記憶部３５のアクセストークン１に設定する（Ｓ１７７）。なお、アクセストークン１〜アクセストークンＮを一度に設定できる場合には、Ｓ１７３〜Ｓ１７６の処理を省略して、アクセストークン１〜アクセストークンＮを一度に設定してもよい。
【０１２７】
図１４は、コンテキストスイッチの処理におけるアクセストークンの退避及び復元を行う処理の一例を示すフローチャートである。
【０１２８】
コンテキストスイッチ処理部７４は、ＯＳ６２からの指示を受けて、ＣＰＵコア１２のストランド１６上で実行されるアプリケーションプログラムのプロセスを変更するコンテキストスイッチにおけるレジスタ等に記憶された情報の退避及び復元の処理を行う。ここでは、ストランド１６上で実行されているプロセスのスレッドＡをスレッドＢに変更するコンテキストスイッチを行う場合を例に説明する。
【０１２９】
コンテキストスイッチ処理部７４は、ＯＳ６２からスレッドＡをスレッドＢに変更するコンテキストスイッチの指示を受けると、まずスレッドＡの実行を停止させる（Ｓ１８１）。次に、コンテキストスイッチ処理部７４は、アクセストークン記憶部３５をリードしてアクセストークン１、アクセストークン２、・・・、アクセストークンＮの値を得る（Ｓ１８２）。そして、取得したＮ個のアクセストークンを、ローカルメモリ５２等に設けられるスレッドＡの退避領域に保存する（Ｓ１８３）。その際、レジスタ部３４に含まれるレジスタのうち、スレッドＡの処理に関する情報を保持しているレジスタの値もスレッドＡの退避領域に保存する。
【０１３０】
スレッドＡに関するレジスタの情報の退避を行った後、コンテキストスイッチ処理部７４は、スレッドＢの退避領域から、保存しておいたスレッドＢのＮ個のアクセストークンを読み出し（Ｓ１８４）、読み出したＮ個のアクセストークンを、アクセストークン記憶部３５に設定する（Ｓ１８５）。その際、スレッドＢの実行に必要な他のレジスタの値についてもスレッドＢの退避領域から読み出して設定を行う。
【０１３１】
スレッドＢに関するレジスタの情報の復元を行ったあと、コンテキストスイッチ処理部７４は、スレッドＢを起動し（Ｓ１８６）、コンテキストスイッチの処理を完了する。
【０１３２】
図１５は、２個のアクセストークンを用いて共有メモリをアクセスしてトークン不一致の例外トラップが発生した場合の処理の一例を示すフローチャートである。
【０１３３】
アクセストークンを用いて共有メモリをアクセスする処理において、例外トラップが発生しなければアクセスは実行される（Ｓ２０１  ＮＯ）。共有メモリをアクセスする際に、アクセスを行うリクエストに含まれる複数のアクセストークンとメモリトークンが一致しなければ、トークン不一致の例外トラップが発生する。トークン不一致の例外トラップが発生すると（Ｓ２０１  ＹＥＳ）、例外トラップを受信した例外トラップハンドラ７５は、フォルトステータスレジスタ３４２をリードして、トラップ要因の情報を得る（Ｓ２０２）。
【０１３４】
フォルトステータスレジスタ３４２から取得したトラップ要因がトークン不一致によるものであれば（Ｓ２０３  ＹＥＳ）、処理はステップＳ２０５へ進み、例外トラップハンドラ７５は、トークン比較部７６によるトークンの比較処理を実行させる。フォルトステータスレジスタ３４２から取得したトラップ要因がトークン不一致によるものでなければ（Ｓ２０３  ＮＯ）、例外トラップハンドラ７５は、他の例外処理を実行する（Ｓ２０４）。
【０１３５】
ステップＳ２０５において、トークン比較部７６は、フォルトアドレスレジスタ３４３をリードして、トークン不一致の例外トラップが発生したフォルトアドレスの情報を取得する。トークン比較部７６は、取得したフォルトアドレスの情報と管理テーブル８０に格納された情報から、アプリケーションがアクセスしようとした共有メモリのセグメントを特定し、特定したセグメントのトークンの値（Ｔ）を管理テーブル８０から取得する（Ｓ２０６）。
【０１３６】
管理テーブル８０から取得したトークンの値（Ｔ）が「０」の場合（Ｓ２０７  ＹＥＳ）、トークン比較部７６は、トークンエラー通知部７７に、トークン未設定のシグナルをアプリケーションプログラムに対して通知させる（Ｓ２０８）。管理テーブル８０から取得したトークンの値（Ｔ）が「０」でない場合、処理はステップＳ２０９に進み、トークン比較部７６はトークンの比較処理を行う。なお、本実施例において、トークンの値（Ｔ）が「０」の場合をトークンが未設定の状態であるとしているが、トークン未設定の定義は任意に行うことができ、例えば１６進数で「ＦＦＦ」をトークン未設定と定義してもよい。
【０１３７】
ステップＳ２０９では、トークン比較部７６は、まず、アクセストークン記憶部をリードして、アクセストークン１の値（Ａ１）及びアクセストークン２の値（Ａ２）を取得する。
【０１３８】
管理テーブル８０から取得したトークンの値（Ｔ）が、アクセストークン１の値（Ａ１）と一致する場合（Ｓ２１０  ＹＥＳ）、処理はＳ２１１に進む。この場合、ＴとＡ１が一致しているにもかかわらずメモリトークンとのトークン不一致の例外トラップが発生しているので、トークンの設定に問題があることになる。そのため、トークン比較部７６は、トークンエラー通知部７７に、アプリケーションプログラムに対してトークン不一致のシグナルを送信させる（Ｓ２１１）。
【０１３９】
トークン（Ｔ）とアクセストークン（Ａ１）が一致していない場合（Ｓ２１０  ＮＯ）、次にトークン（Ｔ）とアクセストークン（Ａ２）の比較を行う（Ｓ２１２）。トークン（Ｔ）とアクセストークン（Ａ２）とが一致する場合（Ｓ２１２  ＹＥＳ）、ステップＳ２１１と同様に、トークン比較部７６は、トークンエラー通知部７７にトークン不一致のシグナルを送信させる（Ｓ２１３）。
【０１４０】
トークン（Ｔ）とアクセストークン（Ａ２）が一致せず、すべてのアクセストークンについてトークン（Ｔ）と一致していないことを確認すると（Ｓ２１２  ＮＯ）、処理はステップＳ２１４に進む。
【０１４１】
ステップＳ２１４では、アクセストークン再設定部７８がアクセストークンの再設定を行う。アクセストークン記憶部３５の再設定を行う際、アクセストークン再設定部７８は、すでにアクセストークン記憶部３５に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部３５の設定を行う。
【０１４２】
具体的には、アクセストークン再設定部７８は、アクセストークン記憶部３５のアクセストークン２に対して、アクセストークン１の設定値（Ａ１）を設定する（Ｓ２１４）。次に、アクセストークン１に対して、管理テーブル８０から取得したトークン（Ｔ）の値を設定する（Ｓ２１５）。
【０１４３】
アクセストークン再設定部７８によるアクセストークンの再設定を行った後、アクセス再実行部７９が、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する（Ｓ２１６）。再設定されたアクセストークンは、トークンの設定ミスがない限りアクセス先のセグメントに対応するメモリトークンと一致するので、再実行されたメモリアクセスは正常にアクセスされることになる。その後、処理はステップＳ２０１に戻り、後続の処理を実行する。
【０１４４】
図１６は、４個のアクセストークンを用いて共有メモリをアクセスしてトークン不一致の例外トラップが発生した場合の処理の一例を示すフローチャートである。ステップＳ２２１〜ステップＳ２２８の処理は、図１５のステップＳ２０１〜ステップＳ２０８の処理と同じであるので説明を省略する。
【０１４５】
図１６では、４個のアクセストークンを用いる場合を示しているので、ステップＳ２２９では、トークン比較部７６は、アクセストークン記憶部をリードして、４個のアクセストークンの値（Ａ１、Ａ２、Ａ３、Ａ４）を取得する。そして、管理テーブル８０から取得したトークン（Ｔ）と４個のアクセストークン（Ａ１、Ａ２、Ａ３、Ａ４）のそれぞれを比較して、一致するかどうかを判定する（Ｓ２３０、Ｓ２３２、Ｓ２３４、Ｓ２３６）。トークン（Ｔ）と４個のアクセストークン（Ａ１、Ａ２、Ａ３、Ａ４）のいずれかが一致すれば、トークン（Ｔ）とアクセストークンが一致しているにもかかわらずメモリトークンとの不一致による例外が発生しているので、トークンの設定に問題があることになる。そのため、トークン比較部７６は、トークンエラー通知部７７に、アプリケーションプログラムに対してトークン不一致のシグナルを送信させる（Ｓ２３１、Ｓ２３３、Ｓ２３５、Ｓ２３７）。
【０１４６】
ステップＳ２３８では、アクセストークン再設定部７８がアクセストークンの再設定を行う。アクセストークン記憶部３５の再設定を行う際、アクセストークン再設定部７８は、すでにアクセストークン記憶部３５に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部３５の設定を行う。
【０１４７】
図１６の場合、４個のアクセストークンを使用しているので、アクセストークン４にアクセストークン３の値（Ａ３）を設定し（Ｓ２３８）、アクセストークン３にアクセストークン２の値（Ａ２）を設定する（Ｓ２３９）。そして、アクセストークン２にアクセストークン１の値（Ａ１）を設定し（Ｓ２４０）、アクセストークン１に対して、管理テーブル８０から取得したトークン（Ｔ）の値を設定する（Ｓ２４１）。
【０１４８】
アクセストークン再設定部７８によるアクセストークンの再設定を行った後、アクセス再実行部７９が、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する（Ｓ２４２）。
【０１４９】
図１７は、Ｎ個のアクセストークンを用いて共有メモリをアクセスしてトークン不一致の例外トラップが発生した場合の処理の一例を示すフローチャートである。ステップＳ２５１〜ステップＳ２５８の処理は、図１５のステップ２０１〜ステップＳ２０８の処理と同じであるので説明を省略する。
【０１５０】
図１７では、Ｎ個のアクセストークンを用いる場合を示しているので、ステップＳ２５９では、トークン比較部７６は、アクセストークン記憶部をリードして、Ｎ個のアクセストークンの値（Ａ１、Ａ２、・・・、Ａ（Ｎ））を取得する。そして、管理テーブル８０から取得したトークン（Ｔ）とＮ個のアクセストークン（Ａ１、Ａ２、・・・、Ａ（Ｎ））のそれぞれを比較して、一致するかどうかを判定する（Ｓ２６０、Ｓ２６２、Ｓ２３４）。トークン（Ｔ）とＮ個のアクセストークン（Ａ１、Ａ２、・・・、Ａ（Ｎ））のいずれかが一致すれば、トークン（Ｔ）とアクセストークンが一致しているにもかかわらずメモリトークンとの不一致による例外が発生しているので、トークンの設定に問題があることになる。そのため、トークン比較部７６は、トークンエラー通知部７７に、アプリケーションプログラムに対してトークン不一致のシグナルを送信させる（Ｓ２６１、Ｓ２６３、Ｓ２６５）。
【０１５１】
ステップＳ２６６では、アクセストークン再設定部７８がアクセストークンの再設定を行う。アクセストークン記憶部３５の再設定を行う際、アクセストークン再設定部７８は、すでにアクセストークン記憶部３５に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部３５の設定を行う。
【０１５２】
図１７の場合、Ｎ個のアクセストークンを使用しているので、アクセストークン（Ｎ）にアクセストークン（Ｎ−１）の値（Ａ（Ｎ−１））を設定し（Ｓ２６６）、アクセストークン（Ｎ−１）以下のアクセストークンについても同様に設定していく。そして、アクセストークン２にアクセストークン１の値（Ａ１）を設定し（Ｓ２６７）、アクセストークン１に対して、管理テーブル８０から取得したトークン（Ｔ）の値を設定する（Ｓ２６８）。
【０１５３】
アクセストークン再設定部７８によるアクセストークンの再設定を行った後、アクセス再実行部７９が、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する（Ｓ２６９）。
【０１５４】
図１８は、２個のアクセストークンを使用して共有メモリ間のデータのコピーをする場合の処理の一例を示すフローチャートである。元々アプリケーションプログラムが２個のセグメントしか使用しない場合、あるいは、データのコピーを行う際の転送元のセグメントＡと転送先のセグメントＢのトークン（ａ、ｂ）を把握している場合、予め適切なアクセストークンを設定できる。
【０１５５】
この例の場合、アクセストークン設定部７２は、例えばアクセストークン記憶部３５のアクセストークン１に「ａ」を設定し（Ｓ２７１）、アクセストークン２に「ｂ」を設定する（Ｓ２７２）。そして、Ｎ回分、セグメントＡの領域からデータを汎用レジスタ３４１に含まれるレジスタＸにデータをロードし（Ｓ２７３）、次に、レジスタＸのデータをセグメントＢの領域へストアする（Ｓ２７４）。
【０１５６】
ステップＳ２７３とステップＳ２７４のロードとストアのそれぞれの処理において、セグメントＡ、Ｂをアクセスする各リクエストは、アクセストークン記憶部３５に記憶された２つのアクセストークン（ａ、ｂ）を付加して送信される。各リクエストに付加される２つのアクセストークンの値「ａ」、「ｂ」は、セグメントＡのメモリトークン（ａ）、セグメントＢのメモリトークン（ｂ）と一致するので、トークン不一致の例外を発生させることなく正常にアクセスすることができる。
【０１５７】
本実施形態では、共有メモリの複数のセグメントをアクセスする各リクエストに対して、予めアクセストークン記憶部３５に格納しておいた複数のアクセストークンを付加して送信する。そして、判定部２３でメモリトークンと、リクエストに付加された複数のアクセストークンのそれぞれとを比較するようにすることで、図２２に示されるような、アプリケーションプログラムがメモリアクセスする度にトークンを設定しなおす処理を省略できる。従って、異なるメモリトークンが設定された複数のメモリ領域にアクセスを行う際の、アクセストークンの再設定のオーバーヘッドを低減することができ、共有メモリのアクセス性能を向上することができる。
【０１５８】
図１９は、２個のアクセストークンを使用して共有メモリ間のデータ（Ｎ×８バイト）のコピーをする場合であって、アプリケーションプログラムが４つの共有メモリのセグメントを使用することを予定している場合の処理の一例を示すフローチャートである。図１９の例では、説明のために、データの転送元のセグメントＡのトークン「ａ」と、データ転送先のセグメントＢのトークン「ｂ」の各トークンと異なるトークン「ｃ」及び「ｄ」を、アクセストークン記憶部３５に設定してからデータのコピー処理をするものとする。
【０１５９】
まず、アクセストークン設定部７２が、アクセストークン記憶部３５のアクセストークン１にトークン「ｃ」を設定し（Ｓ２８１）、アクセストークン２にトークン「ｄ」を設定する（Ｓ２８２）。この状態でアプリケーションプログラムがセグメントＡの領域のデータを８バイトロードすると、リクエストに付加されるアクセストークンは「ｃ」と「ｄ」であり、セグメントＡのトークン「ａ」とは一致しないので、例外トラップが発生する（Ｓ２８３）。
【０１６０】
トークン不一致による例外トラップが発生すると、図１５に示すような例外トラップ処理が行われ、図１９のステップＳ２８４，Ｓ２８５において、アクセストークン１にセグメントＡのトークン「ａ」が、アクセストークン２にトークン「ｃ」が設定される。その後、セグメントＡの領域のデータをレジスタＸに８バイトロードする命令を再実行すると、リクエストにはアクセストークン「ａ」が含まれているので、トークン不一致のエラーは発生せず、セグメントＡから正常にデータをロードできる（Ｓ２８６）。
【０１６１】
ステップＳ２８６でセグメントＡのデータを８バイトロードしてレジスタＸに格納した後、アプリケーションプログラムが、レジスタＸのデータをセグメントＢに８バイトストアする（Ｓ２８７）。ここで、セグメントＢへのストアを行うリクエストにはアクセストークン「ｃ」と「ａ」が含まれているが、セグメントＢのトークン「ｂ」は含まれていない。そのため、セグメントＢへのストアに対してはトークン不一致の例外トラップが発生する（Ｓ２８７）。
【０１６２】
セグメントＢへのストアで例外トラップが発生した場合にも、図１５に示すような例外トラップ処理が行われ、図１９のステップＳ２８８、Ｓ２８９において、アクセストークンの再設定処理が行われる。この場合、アクセストークン２には、アクセストークン１の値「ａ」が設定され（Ｓ２８８）、アクセストークン１には、セグメントＢに対応するトークン「ｂ」が設定されることになる（Ｓ２８９）。その後、セグメントＢへの８バイトストアを再実行すると、リクエストにはアクセストークン「ｂ」が含まれているので、トークン不一致のエラーは発生せず、セグメントＢに正常にデータをストアできる（Ｓ２９０）。
【０１６３】
その後のアクセスにおいては、アクセストークン記憶部３５にはアクセストークンとして「ａ」と「ｂ」とが記憶されているので、セグメントＡとセグメントＢの各領域をアクセスするリクエストにはアクセストークン「ａ」と「ｂ」とが付加されて送信される。そのため、アプリケーションプログラムが継続してセグメントＡとセグメントＢとを交互にアクセスしてもトークン不一致による例外トラップは発生せず、正常に共有メモリ間のデータ転送を行うことができる。つまり、ステップＳ２９１のロード処理とステップＳ２９２のストア処理とをＮ−１回繰り返すことでＮ×８バイトのセグメントＡ、Ｂ間のデータ転送を行うことができる。
【０１６４】
図１９の例では、最初にステップＳ２８３〜ステップＳ２９０のオーバーヘッドが生じるが、その後の処理においてはトークン不一致の例外トラップは発生しない。そのため、セグメント間で転送するデータの量が大きい場合には、図１９におけるオーバーヘッドは無視できる程度となる。
【０１６５】
図１９の例でも示されるように、本実施形態では、共有メモリの複数のセグメントをアクセスする各リクエストに対して、予めアクセストークン記憶部３５に格納しておいた複数のアクセストークンを付加して送信する。そして、判定部２３において、リクエストごとにメモリトークンがリクエストに含まれる複数のアクセストークンのいずれかと対応するかに応じてアクセスを判定する。従って、複数のセグメント間でデータのコピーをするような場合でも、データの転送元と転送先のアクセスの度にアクセストークンを設定しなおす必要がなく、アクセストークンの再設定のオーバーヘッドを低減することができる。結果として、共有メモリのアクセス性能を向上することができる。
【０１６６】
また、本実施態様では、トークン不一致による例外トラップが発生した場合には、図１５に示すような例外トラップ処理をＯＳ６２の共有メモリ管理部７０が行う。そのため、アプリケーションプログラムが使用を予定しているトークンの数がアクセストークン記憶部３５に記憶したアクセストークンの数よりも多い場合でも、アプリケーションプログラムがトークンの再設定処理を意識する必要がない。従って、共有メモリの異なるセグメント間のデータ転送を行うような場合であっても、アプリケーションプログラムによるアクセストークンの再設定処理を行う必要がなく、共有メモリのアクセスを効率的に行うことができる。
【０１６７】
（実施例２）
図２０は、実施例２に係る情報処理システム３００の構成例を示す図である。図２０に示すように、情報処理システム３００は、複数のノード５と共有メモリ部６とを有する。図１の場合と同様、波線で示されている共有メモリ部６は、複数のノードからアクセス可能な共有ストレージ装置とすることもできるし、各ノード５に備えられるようにして、複数のノード５で共有することもできる。以下の説明では、便宜上、共有メモリ部６が各ノード５に設けられ、図２、図３で示されるようなノード間共有メモリの情報システムにおいて使用されていることを前提に説明する。
【０１６８】
各ノード５に設けられるＣＰＵ８１は、ＣＰＵコア１２と、アクセストークン記憶部１３と、送信部１４と、判定部８２と、複製メモリトークン記憶部８３と、リクエスト発行制御部８４とを有する。ＣＰＵコア１２、アクセストークン記憶部１３、送信部１４については、図１に示されるものと同じであるため、説明を省略する。
【０１６９】
実施例２に係る情報処理システム３００では、図２０に示されるように、実施例１とは異なり、各リモートノード側のＣＰＵ８１に判定部８２と複製メモリトークン記憶部８３とを有する点に特徴がある。判定部２３と複製メモリトークン記憶部２６とは、ＣＰＵコア１２毎に設けられる。各ＣＰＵコア１２が、図２、図３に示される複数のストランド１６を有する場合には、判定部２３と複製メモリトークン記憶部２６とをストランド１６毎に設けることができる。
【０１７０】
複製メモリトークン記憶部８３は、対応するＣＰＵコア１２がアクセスすることを予定している共有メモリのセグメントのメモリトークンを複製した複製メモリトークンを記憶する。送信部１４は、図１の場合と同様、ＣＰＵコア１２から出力されるリクエストに、アクセストークン１３に記憶されている複数のアクセストークンを付加して出力する。
【０１７１】
判定部８２は、送信部１４が出力するリクエストに含まれる複数のアクセストークンと、複製メモリトークン記憶部８３から読み出した複製メモリトークンとを参照してリクエストのアクセス可否を判定する回路である。判定部８２は、図６に示す判定部２３の回路と同様の構成を有するが、入力されるメモリトークンが、リクエストのアクセス先のセグメントに対応する複製メモリトークンである点が判定部２３と異なる。すなわち、判定部８２は、複製メモリトークンがリクエストに含まれる複数のアクセストークンのいずれかと一致することに応じてリクエストのアクセスを許可する。
【０１７２】
リクエスト発行制御部２７は、判定部８２がリクエストのアクセスを許可する場合に、送信部１４から出力されたリクエストを発行する回路である。具体的には、リクエスト発行制御部２７は、判定部８２から出力されるアクセス許可信号やトークンエラー信号（図６参照）を用いて、リクエストの発行を制御する。
【０１７３】
判定部８２がリクエストのアクセスを許可しない場合、リクエスト発行制御部２７は、リクエストに対するエラー応答を行うことで、ＣＰＵ１２に対してトークン不一致の例外が発生したことを通知することができる。また、判定部８２がリクエストのアクセスを許可しないことを受けて、リクエスト発行制御部２７からトークン不一致の例外を発生してＣＰＵコア１２に知らせるように実装することもできる。
【０１７４】
複製メモリトークン記憶部８３への複製メモリトークンの格納は、例えば、ＣＰＵコア１２上で動作するＯＳ６２が、ＯＳ６２上で動作するアプリケーションプログラムから通知されたトークンを管理テーブル８０へ格納するのと合わせて、複製メモリトークン記憶部８３へ格納するようにしてもよい。あるいは、ホームノードのＣＰＵ１２が、メモリトークン記憶部２２へ使用するセグメントのメモリトークンを格納するのに合わせて、ホームノードのＣＰＵ１２が、同じセグメントを使用するリモートノードの複製メモリトークン記憶部８３へ格納するようにしてもよい。
【０１７５】
共有メモリ部６は、共有メモリ２１と、メモリトークン記憶部２２と、メモリＩ／Ｆ回路８５とを有する。共有メモリ２１及びメモリトークン記憶部２２については、図１に示すものと同じであるため、説明を省略する。メモリＩ／Ｆ回路８５は、共有メモリをアクセスするリクエストのアクセス制御を行う回路であるが、実施例１の場合と異なり、判定部２３の判定結果を参照せずにメモリアクセスの制御を行う。メモリトークン記憶部２２へのメモリトークンの設定は、例えば図１０に示す場合と同様に、ホームノードのＣＰＵコア１２上で動作するＯＳ６２が、ＯＳ６２上で動作するアプリケーションプログラムからの通知を受けて設定を行う。
【０１７６】
なお、実施例２に係る情報処理装置３００上で動作するＯＳ６２やＯＳ６２上で動作するアプリケーションプログラムの動作については、実施例１における図７や図１０で説明される内容と同様の動作が行われる。
【０１７７】
実施例２では、判定部８２と複製メモリトークン記憶部８３とをリモートノード側のＣＰＵ８１内のＣＰＵコア１２毎、又はストランド１６毎に設けることによって、より早い段階でリクエストのアクセス可否を判定できるようになる。すなわち、図１や図２の例では、例えばリモートノードのＣＰＵコア１２から送信されたリクエストがインターコネクト３を介してホームノードの共有メモリ部の判定部２３に届いて初めてリクエストのアクセス可否が分かるのに対し、より早い段階で判定できるようになる。
【０１７８】
（他の実施例）
以上、本発明の好ましい実施例について詳述したが、本発明は特定の実施例に限定されるものではなく、種々の変形や変更が可能である。例えば、本実施形態における実施例２では、判定部８２と複製メモリトークン８３とをリモートノード側のＣＰＵコア１２毎に設ける例について説明したが、さらに以下のような変形例とすることもできる。
【０１７９】
第１の変形例として、例えば、ＣＰＵ８１が複数のＣＰＵコア１２を有する場合や、ＣＰＵコア１２が複数のストランド１６を有する場合において、複数のＣＰＵコア１２又は複数のストランド１６に対応する共通の複製メモリトークン記憶部８３を設けてもよい。この場合、ＣＰＵコア１２毎に設けられる判定部８２は、例えばＣＰＵ８１内で共通の複製メモリトークン記憶部８３からアクセス先のセグメントに対応する複製メモリトークンを読み出してアクセス可否の判定に用いる。複製メモリトークンをＲＡＭなどの記憶回路にまとめて格納しておくことで、効率的に複製メモリトークンを記憶できる。
【０１８０】
また、第２の変換例として、ＣＰＵコア１２毎に設けられる不図示のアドレス変換回路が用いるアドレス変換テーブルの一部を複製メモリトークン記憶部８３として利用することもできる。その際、ＣＰＵコア１２から出力される仮想アドレス（ＶＡ）を実アドレス（ＲＡ）又は物理アドレス（ＰＡ）に変換する回路に判定部８２の回路も含めて、アドレス変換とアクセス可否判定を一度に行うような実装としてもよい。アドレス変換テーブルに複製メモリトークン記憶部８３を含めることで、効率的に複製メモリトークンを記憶することができる。また、判定部８２をアドレス変換回路の一部に実装することで、アドレス変換と合わせてアクセス可否を効率的に判定することができる。
【０１８１】
第３の変形例として、判定部８２と複製メモリトークン８３とをＣＰＵコア１２と、一次キャッシュメモリ３６又は二次キャッシュメモリ３９との間に配置することも可能である。そのようにすることで、一次キャッシュメモリ３６又は二次キャッシュメモリ３９にキャッシュされたセグメントのデータも含めて、判定部８２がアクセス可否の判定を行うことが可能となる。
【０１８２】
なお、前述した情報処理システムおよび情報処理方法をコンピュータに実行させるコンピュータプログラム、およびそのプログラムを記録した、非一時的なコンピュータ読み取り可能な記録媒体は、本発明の範囲に含まれる。ここで、非一時的なコンピュータ読み取り可能な記録媒体は、例えばＳＤメモリカードなどのメモリカードである。なお、前記コンピュータプログラムは、前記記録媒体に記録されたものに限られず、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク等を経由して伝送されるものであってもよい。
【符号の説明】
【０１８３】
１、５：ノード
２、６：共有メモリ部
３    ：インターコネクト
４    ：サービスプロセッサ
１１    ：ＣＰＵチップ
１２    ：ＣＰＵコア
１３    ：アクセストークン記憶部
１４    ：送信部
１５    ：ローカルメモリ
１６    ：ストランド
１７    ：メモリ
１８    ：ディスクユニット
１９    ：ＨＤＤ
２０    ：通信インターフェイス
２１    ：共有メモリ
２２    ：メモリトークン記憶部
２３    ：判定部
２４    ：メモリＩ／Ｆ回路
２６    ：複製メモリトークン記憶部
２７    ：リクエスト発行制御部
３１    ：命令制御部
３２    ：命令バッファ
３３    ：演算部
３４    ：レジスタ部
３５    ：アクセストークン記憶部
３６    ：一次キャッシュメモリ
３７    ：命令キャッシュメモリ
３８    ：データキャッシュメモリ
３９    ：二次キャッシュメモリ
４１    ：ＣＰＵ
４２    ：メモリ
４３    ：通信インターフェイス
５１    ：ＶＣＰＵ
５２    ：ローカルメモリ
５３    ：共有メモリ
５４    ：ディスク装置
６０    ：ハイパーバイザ
６１    ：例外処理部
６２    ：オペレーティングシステム（ＯＳ）
７０    ：共有メモリ管理部
７１    ：トークン通知ＡＰＩ
７２    ：アクセストークン設定部
７３    ：管理テーブル記録部
７４    ：コンテキストスイッチ処理部
７５    ：例外トラップハンドラ
７６    ：トークン比較部
７７    ：トークンエラー通知部
７８    ：アクセストークン再設定部
７９    ：アクセス再実行部
８０    ：管理テーブル
８１    ：ＣＰＵ
８２    ：判定部
８３    ：複製メモリトークン記憶部
８４    ：リクエスト発行制御部
８５    ：メモリＩ／Ｆ回路
１００、２００、３００：情報処理システム
【図１】
0006406027.tif 000002
【図２】
0006406027.tif 000003
【図３】
0006406027.tif 000004
【図４】
0006406027.tif 000005
【図５】
0006406027.tif 000006
【図６】
0006406027.tif 000007
【図７】
0006406027.tif 000008
【図８】
0006406027.tif 000009
【図９】
0006406027.tif 000010
【図１０】
0006406027.tif 000011
【図１１】
0006406027.tif 000012
【図１２】
0006406027.tif 000013
【図１３】
0006406027.tif 000014
【図１４】
0006406027.tif 000015
【図１５】
0006406027.tif 000016
【図１６】
0006406027.tif 000017
【図１７】
0006406027.tif 000018
【図１８】
0006406027.tif 000019
【図１９】
0006406027.tif 000020
【図２０】
0006406027.tif 000021
【図２１】
0006406027.tif 000022
【図２２】
0006406027.tif 000023