以下の実施例1では、図1を用いて、複数のノードを有する情報処理システムの一例について説明する。図1は、実施例1に係る情報処理システムの一例を説明するための図である。図1に示す例では、情報処理システム1は、XB(クロスバスイッチ)2と複数のビルディングブロック10〜10eとを有する。XB2は、各ビルディングブロック10〜10eを相互に接続するクロスバスイッチである。また、XB2は、後述する各ビルディングブロック10〜10eが有する各サービスプロセッサのマスターとなる不図示のサービスプロセッサを有する。なお、少数のノードが接続される小規模構成の場合、XB2を介さずに、ビルディングブロック同士を直接接続しても良い。
また、ビルディングブロック10は、複数のCPU(Central Processing Unit)21〜21cと複数のメモリ22〜22cとを有する。また、他のビルディングブロック10a〜10eも、ビルディングブロック10と同様の構成を有するものとし、以下の説明を省略する。なお、図1に示す例では、CPU21b、21cおよびメモリ22b、22cについては、記載が省略されている。また、各ビルディングブロック内には、不図示のI/O(Input Output)装置が設けられている。ここで、本実施例では、CPU間のキャッシュコヒーレンス制御をディレクトリ方式で実現し、データをメモリ上に持つ後述のホームCPUが該当ディレクトリを管理している。
各ビルディングブロック10〜10eは、それぞれ独立してOSを動作させる。すなわち、各CPU21〜21cは、それぞれ独立してOSを実行する。各ビルディングブロック10〜10eが実行するOSは、ビルディングブロック毎に異なるパーティションで動作する。ここで、パーティションとは、同一のOSが動作し、動作しているOSから見て1つのシステムとして動作するビルディングブロックの群を示す。
例えば、ビルディングブロック10、10aがパーティション#Aとして動作し、ビルディングブロック10b〜10dがパーティション#Bとして動作する。このような場合には、ビルディングブロック10が動作させるOSは、ビルディングブロック10、10aが1つのシステムとして動作していると識別し、ビルディングブロック10bが動作させるOSは、ビルディングブロック10b〜10dが1つのシステムとして動作していると識別する。
次に、図2を用いて、ビルディングブロックの構成例について説明する。図2は、実施例1に係るビルディングブロックの機能構成を説明するための図である。図2に示す例では、ビルディングブロック10は、ノード20、サービスプロセッサ24、XB接続部27、27a、PCIe(Peripheral Component Interconnect Express)接続部28を有する。
ノード20は、複数のCPU21〜21cと、複数のメモリ22〜22cと、通信部23とを有する。
サービスプロセッサ24は、制御部25と、通信部26とを有する。また、図2に示す例では、各CPU21〜21cは、相互に接続されるとともに、通信部23と接続されている。また、各メモリ22〜22cは、各CPU21〜21cと接続されている。サービスプロセッサ24は、不図示のLAN(Local Area Network)などのネットワーク回線を介してサーバの管理者端末に接続され、管理者端末からの指示を受けてノードまたはビルディングブロック10内の各種設定変更などの制御を行う。
また、各CPU21〜21cは、XB接続部27またはXB接続部27aと接続されている。なお、XB接続部27、27aは、同一のXB接続部であってもよい。また、各CPU21〜21cは、PCIe接続部28と接続されている。また、通信部23は、サービスプロセッサ24が有する通信部26と接続されている。なお、制御部25、通信部26、通信部23、各CPU21〜21cは、例えば、I2C(Inter-Integrated Circuit)で接続されている。
CPU21〜21cは、アプリケーションを実行する演算処理装置である。また、各CPU21〜21cには、それぞれメモリ22〜22cが接続されている。また、各CPU21〜21cは、実行中のアプリケーションが共有メモリの割当てを要求した場合には、相互に通信を行い、アプリケーションが使用する共有メモリの割当てを行う。また、各CPU21〜21cは、各メモリ22〜22cや、他のビルディングブロック10a〜10eが有するメモリの一部を共有メモリとして利用する。
図3は、共有メモリ実体が割り当てられたノードに、他のノードがアタッチする場合のメモリマップの一例を示す図である。図3の例では、メモリ実体を所有するノード(これをホームノードと称する)に、共有メモリが割り当てられると、ホームノードはこれを一定の領域サイズに分割する。この分割単位をセグメント(segment)と称するが、セグメントに分割する事は必須ではない。他のノードが、当該ホームノードが所有する共有メモリの割り当てを要求する場合、アタッチする事で、当該ホームノードの共有メモリを使用することができる。このリモートノードが使用するメモリ領域を共有メモリイメージ領域と称する。この共有メモリイメージ領域は、単独のリモートノードがアタッチしても良いし、複数のリモートノードがアタッチしても良い。
図2に戻り、各CPU21〜21cは、メモリの物理アドレスと、メモリと接続されたCPUの識別子であるCPUID(identification)とを対応付けたノードマップを有する。なお、このCPUIDはシステム1で一意に決定され、重複しない。
各CPU21〜21cは、ノードマップを用いて、他のCPUと通信を行う。例えば、CPU21は、アクセス対象となる物理アドレスと対応付けられたCPUIDが、CPU21〜21cとは異なるCPUを示す場合には、XB接続部27、またはXB接続部27a、およびXB2を介して他のノードにメモリアクセスのリクエストを送信する。また、CPU21は、自身と接続されたメモリに対するリクエストを他のノードから受信した場合には、リクエストの対象となるデータを自身と接続されたメモリ22から読出し、リクエスト元へ送信する。他のCPU21a〜21cも同様の処理を行う。
また、各CPU21〜21cは、TLB(Translation Lookaside Buffer)を用いたアドレス変換を行うとともに、TLBミスが発生した際に、トラップ処理を実行するなど、従来のCPUと同様の処理を実行する機能も有する。
メモリ22〜22cは、情報処理システム1が有する全てのCPUが共用するメモリである。また、情報処理システム1においては、全てのビルディングブロック10〜10eが有するメモリに対して、各ビルディングブロック10〜10eのサービスプロセッサが、同一の物理アドレス空間にマッピングされる物理アドレスを振分ける。すなわち、情報処理システム1が有するすべてのメモリのうち、少なくとも共有メモリとして使用されるメモリには、重複しない値の物理アドレスが割当てられる。
また、メモリ22〜22cは、記憶領域の一部を、情報処理システム1が有する全てのCPUが共用する共有領域とし、他の部分を、自身にアクセスするCPU21〜21cがカーネルデータやユーザデータを格納するローカル領域、他ノードとの共有メモリを介したやり取りとは無関係なI/O装置が利用するI/O領域とする。
制御部25は、ビルディングブロック10の制御を行う。例えば、制御部25は、ビルディングブロック10の電源管理や、ビルディングブロック10内の異常の監視や制御等を実行する。また、制御部25は、他のビルディングブロック10a〜10eが有するサービスプロセッサと、不図示のネットワークによって接続されており、各ビルディングブロック10a〜10e間で連係した制御を実行する。また、制御部25は、各CPU21〜21cが実行するOSと通信を行うことができる。
また、制御部25は、通信部26と通信部23を介して、各CPU21〜21cにアクセスする。そして、制御部25は、各ビルディングブロック10〜10eが有するノードマップの更新や制御等を実行する。
なお、サービスプロセッサ24が有する通信部26は、制御部25から送信された制御信号を受信し、受信した制御信号をノード20が有する通信部23に送信する。また、通信部23は、通信部26から送信された制御信号を受信し、受信した制御信号を各CPU21〜21cに送信する。また、XB接続部27、27aは、各CPU21〜21cをXB2と接続し、各ビルディングブロック10〜10eが有するCPU間の通信を中継する。また、PCIe接続部28は、各CPU21〜21cによるI/O装置へのアクセスを中継する。
次に、図4を用いて、各CPU21〜21cが有する機能構成について説明する。図4は、実施例1に係るCPUの機能構成を説明するための図である。なお、CPU21a〜21cは、CPU21と同様の機能を有するため、説明を省略する。また、図4に示す例では、サービスプロセッサ24とCPU21とを接続する接続部23、26については、記載を省略した。
図4に示す例では、CPU21は、演算処理部30、ルータ40、メモリアクセス部41、PCIe制御部42を有する。また、演算処理部30は、演算部31、L1(Level 1)キャッシュ32、L2(Level 2)キャッシュ33、ノードマップ34、アドレス変換部35、キャッシュディレクトリ管理部36、パケット制御部37を有する。なお、ルータ40、メモリアクセス部41、PCIe制御部42などの各部を同一のCPU21の内部に含めなくても良い。
また、パケット制御部37は、パケット生成部37a、パケット受信部37bを有する。また、PCIe制御部42は、リクエスト生成部42a、PCIeバス制御部42bを有する。
まず、演算処理部30が有するノードマップ34について説明する。ノードマップ34は、メモリの記憶領域を示す物理アドレスの範囲と、メモリと接続されたCPUのCPUIDとが対応付けて登録されるテーブルである。以下、ノードマップ34に登録される情報の例を、図面を用いて説明する。
図5は、実施例1に係るノードマップのデータ構成の一例を説明するための図である。図5に示す例では、ノードマップ34は、「アドレス」、「バリッド」、「ノードID」、「CPUID」の各項目の登録内容を対応付けたエントリを有する。ここで、各エントリの「アドレス」の項目には、連続する複数の物理アドレスを含むアドレス域を示す情報が格納される。
例えば、情報処理システム1は、全てのメモリに対して振り分けた物理アドレス空間を均等な大きさのアドレス域に分割し、各アドレス域に#0、#1、#2等の識別子を付与する。そして、情報処理システム1は、各アドレス域を示す識別子を、ノードマップ34が有する各エントリの「アドレス」に登録する。図5の例は、1番目のエントリの「アドレス」の項目に、#0の識別子が登録された場合を示す。また、図5の例は、2番目のエントリの「アドレス」の項目に、#1の識別子が登録された場合を示す。また、図5の例は、3番目のエントリの「アドレス」の項目に、#2の識別子が登録された場合を示す。
また、各エントリの「バリッド」の項目には、物理アドレスが示す記憶領域に各CPUがアクセスすることができるか否かを示すバリッドビットが登録される。例えば、物理アドレスが示す記憶領域が、各CPUで共有される共有領域である場合には、アクセスを行う事ができる旨のバリッドビット(例えば「1」)が登録される。図5の例は、1番目のエントリの「バリッド」の項目に、バリッドビット「1」が登録された場合を示す。また、図5の例は、2番目のエントリの「バリッド」の項目に、バリッドビット「1」が登録された場合を示す。また、図5の例は、3番目のエントリの「バリッド」の項目に、各CPUが、物理アドレスが示す記憶領域にアクセスすることができないことを示すバリッドビット「0」が登録された場合を示す。
また、各エントリの「ノードID」の項目には、物理アドレスが振り分けられたメモリが存在するノードを示す識別子が登録される。図5の例は、1番目のエントリの「ノードID」の項目に、ノードを示す識別子「1」が登録された場合を示す。また、図5の例は、2番目のエントリの「ノードID」の項目に、ノードを示す識別子「1」が登録された場合を示す。
また、各エントリの「CPUID」の項目には、物理アドレスが振り分けられたメモリと接続されたCPUを示す識別子が登録される。すなわち、ノードマップ34は、アクセス対象となる物理アドレスが、どのCPUと接続されたメモリの物理アドレスであるかを示す。図5の例は、1番目のエントリの「CPUID」の項目に、CPUを示す識別子「4」が登録された場合を示す。また、図5の例は、2番目のエントリの「CPUID」の項目に、CPUを示す識別子「5」が登録された場合を示す。
なお、ノードマップ34には、アクセス対象となる物理アドレスがどのCPUと接続された物理アドレスであるかを示すことができれば、本実施例以外の任意の形式で情報が登録されてもよい。
図4に戻って、演算部31は、演算処理を実行し、OS(Operating System)やアプリケーションを実行する演算装置のコアである。また、演算部31は、データのリード(読み込み)や、ライト(書き込み)を行う場合には、リード対象またはライト対象となるデータが格納された記憶領域の論理アドレス(Virtual Address;VA)をアドレス変換部35に出力する。
L1キャッシュ32は、演算部31で頻繁に利用されるデータを一時的に記憶するキャッシュメモリである。L2キャッシュ33は、L1キャッシュ32と同様に、頻繁に利用されるデータを一時的に記憶するが、L1キャッシュ32よりも記憶容量が大きく、データを読み書きする速度が低速なキャッシュメモリである。ここで、ディレクトリ情報36aは、キャッシュディレクトリ管理部36に記憶されており、メモリ22の各記憶領域に記憶されたデータをキャッシュしたCPUや、キャッシュされたデータの更新状況を示す情報である。なお、以下の説明では、「ディレクトリ情報」を単に「ディレクトリ」と表記する場合がある。このディレクトリによるキャッシュメモリ管理方法は、ccNUMA(Cache Coherent Non-Uniform Memory)システムでよく利用される技術である。ccNUMA技術、ディレクトリ技術の両方とも公知の技術であるので、ここでは詳しく説明しない。また、図4ではディレクトリ36aはキャッシュディレクトリ管理部36に内蔵されているが、メモリ22の記憶領域の一部にディレクトリ情報36aを記録する事も可能である。
アドレス変換部35は、TLB35aを有する。TLB35aには、論理アドレスと物理アドレスとを対応付けたエントリが登録される。アドレス変換部35は、TLB35aを用いて、演算部31が出力した論理アドレスを物理アドレスに変換する。例えば、アドレス変換部35は、演算部31から取得した論理アドレスに対応する物理アドレスをTLB35aから検索し、検索した結果、物理アドレスが得られた場合には、得られた物理アドレスをキャッシュディレクトリ管理部36に出力する。なお、アドレス変換部35は、TLBミスが発生した場合は、トラップ処理を実行する。ここで、OSなどのシステムソフトウェアは、TLBミスした物理アドレスと論理アドレスの組をTLB35aに登録する。ただし、かかる組の登録が禁止された物理アドレスについては、TLBミスが発生した場合であっても、OSなどのシステムソフトウェアにより、物理アドレスと論理アドレスとの組がTLB35aに登録されない。
ここで、OSやアドレス変換部35などは、演算部31が実行するアプリケーションから共有メモリへの割当てを要求された場合には、次のような処理を実行する。すなわち、TLBミスが発生した場合、OSなどのシステムソフトウェアなどは、エントリをTLB35aに登録する。また、TLBミスが発生しない場合には、既にエントリがTLB35aに登録済みであるので、アドレス変換部35は、論理アドレスから物理アドレスへの変換を行う。
また、アドレス変換部35やOSは、アプリケーションやOSからローカル領域の割当を要求された場合は、次のような処理を実行する。すなわち、TLBミスが発生した場合、OSなどのシステムソフトウェアは、アドレス変換部35は、アプリケーションやOSがCPU21専用のローカル領域にアクセスするための論理アドレスと、ローカル領域に割当てられる範囲の物理アドレスとを対応付けたエントリをTLB35aに登録する。
キャッシュディレクトリ管理部36は、キャッシュデータおよびディレクトリの管理を行う。キャッシュディレクトリ管理部36は、アドレス変換部35から出力された物理アドレスを取得する。
そして、キャッシュディレクトリ管理部36は、アドレス変換部35から物理アドレスを取得した場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部36は、ディレクトリ36aを用いて、取得した物理アドレスに格納されたデータがL1キャッシュ32およびL2キャッシュ33にキャッシュされているか否かを判定する。
そして、キャッシュディレクトリ管理部36は、取得した物理アドレスに格納されたデータがキャッシュされていると判定した場合には、キャッシュされているデータを演算部31に出力する。また、キャッシュディレクトリ管理部36は、取得した物理アドレスに格納されたデータがL1キャッシュ32およびL2キャッシュ33にキャッシュされていない場合は、次のような処理を実行する。まず、キャッシュディレクトリ管理部36は、ノードマップ34を参照し、取得した物理アドレスを含む範囲のエントリを識別する。そして、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDがCPU21のCPUIDであるか否かを判定する。その後、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDがCPU21のCPUIDである場合は、メモリアクセス部41に、物理アドレスを出力する。
また、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDがCPU21のCPUIDではない場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部36は、識別したエントリのCPUIDと物理アドレスとを取得する。そして、キャッシュディレクトリ管理部36は、パケット制御部37に対して、取得したCPUIDと物理アドレスとを出力する。
また、キャッシュディレクトリ管理部36は、出力した物理アドレスが示す記憶領域に格納されているデータをメモリアクセス部41やパケット制御部37から取得した場合には、取得したデータをL1キャッシュ32およびL2キャッシュ33に格納する。そして、キャッシュディレクトリ管理部36は、L1キャッシュ32にキャッシュさせたデータを演算部31に出力する。
また、キャッシュディレクトリ管理部36は、パケット制御部37から物理アドレスを取得した場合、すなわち、他のCPUやI/O装置からのメモリアクセスのリクエストの対象となる物理アドレスを取得した場合には、次のような処理を実行する。すなわち、キャッシュディレクトリ管理部36は、ノードマップ34を参照して、取得した物理アドレスがローカル領域に振り分けられた物理アドレスであるか否かを判定する。
ほかのパーティションが要求のリクエスト元であり、取得した物理アドレスがローカル領域に振り分けられた物理アドレスである場合には、キャッシュディレクトリ管理部36は、パケット制御部37に対して、リクエスト元に否定応答(アクセスエラー)を送信するように指示する。
また、取得した物理アドレスが共有領域に振り分けられた物理アドレスである場合には、キャッシュディレクトリ管理部36は、取得した物理アドレスが示す記憶領域に記憶されたデータを取得し、取得したデータをパケット制御部37に出力し、リクエスト元へ送信するように指示する。
また、キャッシュディレクトリ管理部36は、ディレクトリ方式を用いて、キャッシュしたデータのコヒーレンシを保持する処理を合わせて実行する。例えば、キャッシュディレクトリ管理部36は、メモリ22に格納されたデータをリクエスト送信元のCPUに送信させる場合には、当該データがリクエスト送信元のCPU以外の他のCPUがキャッシュしているか否かを判定する。
そして、キャッシュディレクトリ管理部36は、リクエストの対象となるデータを他のCPUがキャッシュしていない場合は、L1キャッシュ32、L2キャッシュ33、メモリ22からリクエストの対象となるデータを取得する。その後、キャッシュディレクトリ管理部36は、取得したデータをパケット制御部37に出力する。
一方、キャッシュディレクトリ管理部36は、リクエストの対象となるデータを他のCPUがキャッシュしている場合は、イリノイプロトコル等の手法を用いて、キャッシュコヒーレンスを保持するための処理を実行する。例えば、キャッシュディレクトリ管理部36は、キャッシュされたデータの状態がMESI(Modified/Exclusive/Shared/Invalid)のいずれであるかを判定する。
そして、キャッシュディレクトリ管理部36は、判定結果に応じて、他のCPUが有するキャッシュディレクトリ管理部とコヒーレンシを保持するためのリクエストやオーダー(命令)の送受信を行い、キャッシュされたデータの状態に応じた処理を実行する。ここで、「Modified」とは、いずれか1つのCPUがデータをキャッシュしており、かつ、キャッシュされたデータが更新されている状態を示す。なお、キャッシュされたデータの状態が「Modified」である場合には、ライトバックを実行する必要がある。
また、「Exclusive」とは、いずれか1つのCPUがデータをキャッシュしており、かつ、キャッシュされたデータが更新されていない状態を示す。また、「Shared」とは、複数のCPUがデータをキャッシュしており、かつ、キャッシュされたデータが更新されていないことを示す。また、「Invalid」とは、キャッシュのステータスが登録されていないことを示す。
具体例を挙げて説明すると、キャッシュディレクトリ管理部36は、ステータスがM(Modified)であるデータをキャッシュしたCPUに対してライトバックを指示するオーダーを送信するようパケット生成部37aに指示する。そして、キャッシュディレクトリ管理部36は、データのステータスを更新し、更新後のステータスに応じた処理を実行する。なお、キャッシュディレクトリ管理部36が送受信するリクエストやオーダーの種別については、後述する。
パケット生成部37aは、キャッシュディレクトリ管理部36から物理アドレスと、CPUIDとを取得した場合には、取得した物理アドレスと、CPUIDとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。そして、パケット生成部37aは、生成したパケットをルータ40に送信する。
図6は、実施例1に係るCPUが送信するパケットを説明するための図である。図6に示す例では、パケット生成部37aは、CPUIDと、物理アドレスと、リクエストの内容を示すデータとを含むリクエストを生成し、生成したリクエストをルータ40に出力する。このような場合には、ルータ40は、パケット生成部37aが生成したリクエストを、XB接続部27を介してXB2に出力する。すると、XB2は、リクエストに含まれるCPUIDが示すCPUへとリクエストを転送する。
なお、パケット生成部37aは、キャッシュディレクトリ管理部36からコヒーレンシを保持するためのリクエストやオーダーの発行の指示を受付けた場合には、指示されたリクエストやオーダーを生成する。そして、パケット生成部37aは、生成したリクエストやオーダーをルータ40、XB接続部27、XB2を介して、指示されたCPUに送信する。また、パケット生成部37aは、I/O装置からデータを取得する場合は、I/O装置に対するアクセス要求をルータ40に出力する。
パケット受信部37bは、XB2、XB接続部27、ルータ40を介して、他のCPUや自ノード以外の他のI/O装置が出力したパケットを受信すると、受信したパケットに含まれる物理アドレスを取得する。また、パケット受信部37bは、PCIe制御部42、ルータ40を介して、自ノードのI/O装置が出力したパケットを受信すると、受信したパケットに含まれる物理アドレスを取得する。そして、パケット受信部37bは、取得した物理アドレスをキャッシュディレクトリ管理部36に出力する。また、パケット受信部37bは、他のCPUが送信したデータを受信した場合には、受信したデータをキャッシュディレクトリ管理部36に出力する。
また、パケット受信部37bは、コヒーレンシを保持するためのリクエストやオーダーを受信した場合には、受信したリクエストやオーダーをキャッシュディレクトリ管理部36に出力する。また、パケット受信部37bは、I/O装置に対するアクセス要求の応答やデータをルータ40から受信した場合は、受信した応答やデータをキャッシュディレクトリ管理部36に出力する。このような場合には、キャッシュディレクトリ管理部36は、例えば、取得したデータをメモリアクセス部41に出力する。これにより、メモリアクセス部41は、メモリ22にデータを格納する。
ルータ40は、パケット生成部37aが出力したパケットを受信した場合には、受信したリクエストをXB接続部27に出力する。また、ルータ40は、XB接続部27を介して、他のCPUから送信されたパケットやデータを受信し、受信したパケットやデータをパケット受信部37bに出力する。また、ルータ40は、パケット制御部37がI/O装置等に対して出力したパケットをPCIe制御部42に出力する。また、ルータ40は、I/O装置からのリクエスト等をPCIe制御部42から受信した場合には、受信したリクエスト等をパケット制御部37またはXB接続部27に出力する。また、ルータ40は、XB接続部27またはパケット制御部37を介して、I/O装置へのレスポンスを受信した場合には、受信したレスポンスをPCIe制御部42bに出力する。
メモリアクセス部41は、いわゆるMAC(Memory Access Controller)であり、メモリ22に対するアクセスの制御を行う。例えば、メモリアクセス部41は、キャッシュディレクトリ管理部36から物理アドレスを受信した場合には、受信した物理アドレスが示すメモリ22の領域に格納されたデータを取得し、取得したデータをキャッシュディレクトリ管理部36に出力する。なお、メモリアクセス部41は、メモリーミラー機能を用いて、共有領域を冗長化してもよい。
また、メモリアクセス部41は、ECCチェック部41a、CEアドレスレジスタ41b、ICE発生回数カウンタ41cを有する。
ECCチェック部41aは、所定の周期ごとに、または、キャッシュディレクトリ管理部36からメモリ22に対するリードのアクセスの要求があるたびに、次のような処理を行う。すなわち、ECCチェック部41aは、メモリ22の全記憶領域のデータ、または、アクセス対象の記憶領域のデータに、CEが発生しているか否かを判定する。このような判定によって、ECCチェック部41aは、CEを検出する。CEを検出した場合には、ECCチェック部41aは、検出したCEが発生した記憶領域のデータを読み出し、読み出したデータの誤りを訂正し、誤りを訂正したデータを、検出したCEが発生した記憶領域に書き戻す。そして、ECCチェック部41aは、データを書き戻した記憶領域のデータを再度読み出し、読み出したデータについて、再度、CEが発生しているか否かを判定する。この再度の判定において、CEが発生していると判定された場合には、ECCチェック部41aは、PCEが発生したと判定する。このようにして、ECCチェック部41aは、PCEを検出する。
また、ECCチェック部41aは、所定時間内のCEの発生回数をICE発生回数カウンタ41cに記録し、CEが所定時間内に所定回数αを超えて発生した場合には、ICEが発生していると判定する。このようにして、ECCチェック部41aは、ICEを検出する。なお、、メモリアクセス部41内の処理部(マイコンなど)がプログラム処理により所定時間内のCEの発生回数をカウントするカウント動作などを行うようにしてもよい。
そして、ECCチェック部41aは、ICEまたはPCEを検出した場合には、検出したICEまたはPCEが発生したメモリ22の物理アドレスをCEアドレスレジスタ41bに設定する。
リクエスト生成部42aは、ルータ40を介してI/O装置に対するアクセス要求を取得した場合には、アクセス要求の対象となるI/O装置に送信するリクエストを生成し、生成したリクエストをPCIeバス制御部42bに出力する。また、リクエスト生成部42aは、I/O装置から物理アドレスと、CPUIDとを取得した場合には、取得した物理アドレスと、CPUIDとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。かかるリクエストの種類としては、I/O装置がCPU21または他のCPUに接続されたメモリをリードするためのリクエストが挙げられる。また、リクエスト生成部42aは、I/O装置から物理アドレスと、CPUIDと、書き込みデータとを取得した場合には、取得した物理アドレスと、CPUIDと、書き込みデータとを格納したパケット、すなわち、メモリアクセスのリクエストとなるパケットを生成する。かかるリクエストの種類としては、I/O装置がCPU21または他のCPUに接続されたメモリにデータをライトするためのリクエストが挙げられる。そして、リクエスト生成部42aは、生成したパケットをルータ40に送信する。
PCIeバス制御部42bは、リクエスト生成部42aが生成したリクエストを取得した場合には、PCIe接続部28を介して、I/O装置にリクエストを送信する。また、PCIeバス制御部42bは、PCIe接続部28を介して、I/O装置から物理アドレスと、CPUIDとを取得した場合には、リクエスト生成部42aに、取得した物理アドレスと、CPUIDとを送信する。また、PCIeバス制御部42bは、PCIe接続部28を介して、I/O装置から物理アドレスと、CPUIDと、書き込みデータとを取得した場合には、リクエスト生成部42aに、取得した物理アドレスと、CPUIDと、書き込みデータとを送信する。
次に、図7を用いて、CPU21が他のCPUに対してリクエストを送信する処理の一例について説明する。図7は、実施例1に係るCPUがリクエストを送信する処理の一例を説明するための図である。例えば、図7中(A)に示すように、サービスプロセッサ24からノードマップ34に対して、物理アドレスが振り分けられるメモリにアクセスするCPUのCPUIDと当該メモリの物理アドレスとを対応付けたエントリの設定が行われる。
また、演算部31は、演算処理を実行し、図7中(B)に示すように、アクセス対象となる論理アドレスをアドレス変換部35に出力する。すると、アドレス変換部35は、論理アドレスを物理アドレスに変換し、変換した物理アドレスを図7中(C)に示すように、キャッシュディレクトリ管理部36に出力する。
ここで、キャッシュディレクトリ管理部36は、アドレス変換部35から物理アドレスを取得すると、図7中(D)に示すように、ノードマップ34を参照し、取得した物理アドレスと対応付けられたCPUIDを取得する。そして、キャッシュディレクトリ管理部36は、取得したCPUIDがCPU21のCPUIDではない場合には、図7中(E)に示すように、取得したCPUIDと物理アドレスとをパケット制御部37に出力する。
このような場合には、パケット生成部37aは、キャッシュディレクトリ管理部36から取得した物理アドレスとCPUIDとを格納したパケットを生成し、図7中(F)に示すように、生成したパケットをルータ40に出力する。続いて、図7中(G)に示すように、ルータ40は、パケット生成部37aから取得したパケットをXB接続部27に出力する。その後、図7中(H)に示すように、XB接続部27は、取得したパケットをXB2に出力する。すると、XB2は、パケットに格納されたCPUIDが示すCPUへパケットを伝達することとなる。
次に、図8を用いて、CPU21が他のCPUからパケットを受信した際に実行する処理の一例について説明する。図8は、実施例1に係るCPUがパケットを受信した際に実行する処理の一例を説明するための図である。例えば、図8中(J)に示すようにパケット受信部37bは、他のCPUからCPU21のCPUIDとメモリ22に振り分けられた物理アドレスとが格納されたパケットや、レスポンスのパケットを受信する。
このような場合には、パケット受信部37bは、受信したパケットから物理アドレスを取得し、図8中(K)に示すように、取得した物理アドレスをリクエスト元が自パーティションかどうかの情報とともにキャッシュディレクトリ管理部36に出力する。すると、キャッシュディレクトリ管理部36は、物理アドレスが示す記憶領域が、共有領域であるかローカル領域であるかを判別する。
リクエスト元が他パーティションである場合、共有領域に対するアクセスであるかチェックし、ローカル領域である場合はエラー応答するようにパケット制御部37に依頼する。それ以外の場合には、キャッシュディレクトリ管理部36は、図8中(L)に示すように、物理アドレスが示す記憶領域のデータがL1キャッシュ32およびL2キャッシュ33にキャッシュされているか判別する。
また、キャッシュディレクトリ管理部36は、データがキャッシュされていないと判別した場合には、図8中(M)に示すように、物理アドレスをメモリアクセス部41に出力する。すると、図8中(N)に示すように、メモリアクセス部41は、メモリ22から物理アドレスが示す記憶領域のデータを取得し、キャッシュディレクトリ管理部36に出力する。また、物理アドレスがメモリアクセス部41に入力された場合には、ECCチェック部41aは、入力された物理アドレスが示す記憶領域に記憶されたデータについてIECおよびPECを検出した場合には、図8中(O)に示すように、CEアドレスレジスタ41bに入力された物理アドレスを設定する。
そして、キャッシュディレクトリ管理部36は、L1キャッシュ32、L2キャッシュ33、またはメモリアクセス部41からデータを取得した場合には、取得したデータをパケット制御部37に出力し、リクエスト元のCPUに送信するよう指示する。
次に、図9を用いて、I/O装置がCPU21以外のCPUに対してリードやライトのリクエストを送信する処理の一例について説明する。図9は、実施例1に係るI/O装置がリクエストを送信する処理の一例を説明するための図である。例えば、PCIe接続部28は、I/O装置から物理アドレスと、CPUIDとを取得すると、図9中(P)に示すように、取得した物理アドレスと、CPUIDとをPCIeバス制御部42bに出力する。また、PCIe接続部28は、I/O装置から物理アドレスと、CPUIDと、書き込みデータとを取得すると、図9中(P)に示すように、取得した物理アドレスと、CPUIDと、書き込みデータとをPCIeバス制御部42bに出力する。
そして、PCIeバス制御部42bは、PCIe接続部28から物理アドレスと、CPUIDとを取得すると、図9中(Q)に示すように、取得した物理アドレスと、CPUIDとをリクエスト生成部42aに出力する。また、PCIeバス制御部42bは、PCIe接続部28から物理アドレスと、CPUIDと、書き込みデータとを取得すると、図9中(Q)に示すように、取得した物理アドレスと、CPUIDと、書き込みデータとをリクエスト生成部42aに送信する。
リクエスト生成部42aは、PCIeバス制御部42bから物理アドレスと、CPUIDとを取得すると、取得した物理アドレスと、CPUIDとを含むリードのリクエストとなるパケットを生成する。また、リクエスト生成部42aは、PCIeバス制御部42bから物理アドレスと、CPUIDと、書き込みデータとを取得すると、取得した物理アドレスと、CPUIDと、書き込みデータとを含むライトのリクエストとなるパケットを生成する。そして、リクエスト生成部42aは、図9中(R)に示すように、生成したパケットをルータ40に出力する。
続いて、図9中(T)に示すように、ルータ40は、リクエスト生成部42aから取得したリクエストをXB接続部27に出力する。その後、図9中(U)に示すように、XB接続部27は、取得したリクエストをXB2に出力する。すると、XB2は、リクエストに格納されたCPUIDが示すCPUへパケットを伝達することとなる。
次に、図10を用いて、I/O装置がCPU21以外のCPUからレスポンスを受信する処理の一例について説明する。図10は、実施例1に係るI/O装置がレスポンスを受信する処理の一例を説明するための図である。例えば、図10中(V)に示すようにXB接続部27は、CPU21以外のCPUからI/O装置へのレスポンスを受信する。
XB接続部27は、レスポンスを受信すると、図10中(W)に示すように、受信したレスポンスをルータ40に出力する。ルータ40は、レスポンスを受信すると、図10中(X)に示すように、受信したレスポンスをリクエスト生成部42aに出力する。また、リクエスト生成部42aは、図10中(Y)に示すように、レスポンスをPCIeバス制御部42bに出力する。PCIeバス制御部42bは、レスポンスを受信すると、図10中(Z)に示すように、受信したレスポンスをPCIe接続部28に出力する。これにより、PCIe接続部28からI/O装置へレスポンスが送信される。
通信部23、サービスプロセッサ24、XB接続部27、XB接続部27a、PCIe接続部28は、電子回路である。ここで、電子回路の例として、ASIC(Application Specific Integrated Circuit)やFPGA(Field Programmable Gate Array)などの集積回路、またはCPUやMPU(Micro Processing Unit)などを適用することができる。また、CPU21〜21cに代えて、ASICやFPGAなどの集積回路、またはMPUなどを適用することができる。
また、メモリ22〜22aは、RAM(Random Access Memory)、ROM(Read Only Memory)、フラッシュメモリ(flash memory)などの半導体メモリ素子である。また、L1キャッシュ32、L2キャッシュ33は、SRAM(Static Random Access Memory)等の高速な半導体メモリ素子である。
次に、各CPU21〜21cがキャッシュコヒーレンスを保持する処理について説明する。なお、以下の説明においては、情報処理システム1の各CPUはイリノイプロトコルを用いて、キャシュコヒーレンスを保持するものとする。
また、以下の説明においては、情報処理システム1が有する各メモリは、全てのCPUからキャッシュ可能な空間を有するメモリとして識別されるものとする。また、以下の説明においては、キャッシュ対象となるデータを記憶するメモリに、そのCPU内のMACを介して物理的に直接接続されているCPUをホームCPUとし、キャッシュを要求したCPUをローカルCPUと記載する。
また、ホームCPUに対して既にリクエストを送信し、データをキャッシュ済みであるCPUをリモートCPUと記載する。なお、ローカルCPUとホームCPUとが同一のCPUとなる場合や、ローカルCPUとリモートCPUとが同一のCPUとなる場合もある。
ローカルCPUは、自身のノードマップを参照し、アクセス対象となる物理アドレスがホームCPUがアクセスするメモリに振り分けられていると判定する。そして、ローカルCPUは、物理アドレスを格納したリクエストをホームCPUに対して発行する。なお、ローカルCPUが発行するリクエストには、複数の種別のリクエストが存在する。このため、ホームCPUが有するキャッシュディレクトリ管理部は、取得したリクエストの種別に応じたキャッシュコヒーレンス制御を実行することとなる。
例えば、ローカルCPUが発行するリクエストの種別としては、共有型フェッチアクセス、排他型フェッチアクセス、キャッシュ無効化要求、キャッシュリプレース要求等がある。共有型フェッチアクセスとは、例えば、「MoveIn to Share」の実行要求であり、ホームCPUがアクセスするメモリからデータの読出しを行う際に発行されるリクエストである。
また、排他型フェッチアクセスとは、例えば、「MoveIn Exclusively」の実行要求であり、ホームCPUがアクセスするメモリへデータストアを行う際の、キャッシュへのデータロードを行う際に発行される。また、キャッシュ無効化要求とは、例えば、「MoveOut」の実行要求であり、キャッシュラインの無効化をホームCPUに対して要求する際に発行される。なお、ホームCPUは、キャッシュ無効化要求を受信すると、リモートCPUに対してキャッシュ無効化要求を発行する場合や、キャッシュを「Invalidation」とさせるオーダーを発行する場合がある。
キャッシュリプレース要求とは、例えば、「WriteBack」の実行要求であり、更新されたキャッシュデータ、すなわち「Modified」状態のキャッシュデータをホームCPUがアクセスするメモリに書き戻す際に発行される。なお、キャッシュリプレース要求には、例えば、「FlushBack」の実行要求であり、更新されていないキャッシュデータ、すなわち、「Shared」又は「Exclusive」状態のキャッシュの破棄を行う際に発行される。
ホームCPUは、上述したリクエストをローカルCPUや、リモートCPUから受信した場合には、リクエストを処理するために、ローカルCPUやリモートCPUに対して、オーダーを発行する。ここで、ホームCPUは、取得したリクエストの種別に応じたキャッシュコヒーレンス制御を実行するため、複数の種別のオーダーを発行することとなる。例えば、ホームCPUは、リモートCPUがキャッシュしているデータをローカルCPUにロードさせる「MoveOut and Bypass to Share」を発行する。
また、例えば、ホームCPUは、ローカルCPU以外のすべてのリモートCPUのキャッシュを無効化し、その後、ホームCPUがローカルCPUにデータを送信するための「MoveOut and Bypass Exclusively」を発行する。また、ホームCPUは、リモートCPUにキャッシュの無効化を要求する「MoveOut WITH Invalidation」を発行する。なお、ホームCPUが「MoveOut WITH Invalidation」を発行した場合には、全てのCPUのキャッシュが、対象となるアドレスについて「Invalidate」状態となる。なお、トランザクション完了時にはローカルCPUがデータをキャッシュする。
また、ホームCPUは、リモートCPUにキャッシュラインの無効化を要求する「MoveOut for Flush」を発行する。なお、ホームCPUが「MoveOut for Flush」を発行した場合には、対象となるデータは、ホームCPUのメモリにのみ記憶される。また、ホームCPUは、対象となるデータの状態が「Shared」であるときに、リモートCPUにキャッシュの破棄を要求する「Buffer Invalidation」を発行する。
ホームCPUは、リクエストの種別に応じて、上述したオーダーを発行し、各CPUがキャッシュしたデータのステートを遷移させる。また、ローカルCPUやリモートCPUは、オーダーを受信した場合には、オーダーが示す処理を実行し、自身がキャッシュしたデータのステートを遷移させる。
その後、ローカルCPUやリモートCPUは、オーダーに対する完了応答やデータ付の完了応答をホームCPUに送信する。また、ホームCPUやリモートCPUは、オーダー処理を実行した後に、ローカルCPUに対して、データ付のリクエスト応答を送信することとなる。
[処理の流れ]
次に、図11を用いて、情報処理システム1が共有領域を制御する処理の流れについて説明する。図11は、共有領域を制御する処理の流れを説明するためのフローチャートである。まず、情報処理システム1は、アプリケーションの要求に応じて、ノード間の共有メモリの割当処理を実行する(ステップS101)。次に、情報処理システム1は、ノード間で共有する共有メモリのアタッチ処理を実行する(ステップS102)。
その後、情報処理システム1が有する各CPUによって実行されるアプリケーションが各メモリを使用する(ステップS103)。次に、情報処理システム1は、共有メモリのデタッチ処理を実行する(ステップS104)。その後、情報処理システム1は、共有メモリの解放処理を実行し(ステップS105)、処理を終了する。なお、ステップS101、およびステップS105は、その共有メモリのホームノード上のアプリケーションのみが実施するものとしても良いし、実際の処理はnop(no operation)となるものの、その共有メモリのホームノード以外のノード上のアプリケーションも実施するものとしても良い。
次に、図12を用いて、図11中ステップS101で示した共有メモリの割当処理の流れについて説明する。図12は、共有メモリの割当処理を説明するためのフローチャートである。図12に示す例では、例えば、CPU21が実行するアプリケーションがOSに対して、ノード間の共有メモリ割当処理の実行を要求する(ステップS201)。
すると、CPU21が実行するOSが共有領域用の物理アドレスの領域から要求されたサイズのメモリ割当を行う(ステップS202)。次に、OSが割り当てた共有メモリの管理用IDをアプリケーションに引渡し(ステップS203)、共有メモリの割当処理を終了する。
次に、図13を用いて、図11中ステップS102で示したノード間の共有メモリアタッチ処理の流れについて説明する。図13は、共有メモリアタッチ処理を説明するためのフローチャートである。まず、アプリケーションは、OSに対して管理用IDを引渡し、ノード間の共有メモリのアタッチ処理を要求する(ステップS301)。このような場合には、OSは、他のノードで実行されているOSと通信を行い、管理用IDに対応する物理アドレスを獲得する(ステップS302)。
ここで、OSが他のノードで実行されているOSと通信を行う場合には、LANなどによる通信、サービスプロセッサ24を介した各ノード間の通信等を用いる。また、各ノードで実行されるOSは、特定の共有領域を、ノード間通信に用いる領域として設定し、設定した領域に対する情報の格納や読み取りを行う事で、通信を行うこととしても良い。
次に、OSは、物理アドレスに対応する論理アドレスを決定し、割当を行う(ステップS303)。例えば、CPU21で実行されるOSは、物理アドレスと論理アドレスとのTLB35aをアドレス変換部35に設定する。
なお、各CPU21〜21cが用いる論理アドレスは、重複する範囲であっても良く、また、CPUごとに異なる範囲でもよい。また、各CPU21〜21cが用いる論理アドレスは、アプリケーションがOSに指定できるようにしてもよい。その後、OSは、論理アドレスの値をアプリケーションに引渡し(ステップS304)、処理を終了する。
次に、図14を用いて、図11中ステップS103で示したアプリケーションがノード間の共有メモリを使用する処理の流れについて説明する。図14は、アプリケーションが共有メモリを使用する処理を説明するためのフローチャートである。例えば、CPU21が実行するアプリケーションは、論理アドレスを発行し、論理アドレスが示す記憶領域へのアクセスを行う(ステップS401)。
すると、CPU21は、TLBミスが発生したか否かを判別する(ステップS402)。そして、CPU21は、TLBミスが発生した場合は(ステップS402肯定)、トラップ処理を実行し、TLBに論理アドレスと物理アドレスとの組のエントリを設定する(ステップS403)。
次に、アプリケーションは、再度論理アドレスを発行し、TLBによる物理アドレスへの変換を経て、正常に共有メモリに対するアクセスを実行し(ステップS404)、処理を終了する。一方、TLBミスが発生しなかった場合は(ステップS402否定)、正常に共有メモリに対するアクセスが実行され(ステップS405)、処理を終了する。
次に、図15を用いて、図11中ステップS104で示したノード間の共有メモリデタッチ処理の流れについて説明する。図15は、ノード間の共有メモリデタッチ処理を説明するためのフローチャートである。例えば、CPU21が実行するアプリケーションは、OSに対して、ノード間共有メモリの論理アドレス、または管理用IDを指定して、デタッチ処理を要求する(ステップS501)。
すると、CPU21が実行するOSは、キャッシュのフラッシュを行う(ステップS502)。すなわち、OSは、共有メモリの割り当て解除後、再度共有メモリとして割当てを行った場合に、共有メモリとして割当てが行われていない際に共有メモリの実メモリにアクセスするCPUがリブートすると、キャッシュと実メモリの状態が食い違う恐れがある。このため、OSは、キャッシュのフラッシュを行い、キャッシュと実メモリの状態とが食い違う状態を防止する。
そして、OSは、ノード間共有メモリ、すなわち、アプリケーションが利用していた範囲の論理アドレスの割当を解除し、解除した論理アドレスに関連するTLB35aのエントリを削除する(ステップS503)。なお、これ以降、本ノード上で、デタッチが完了しているメモリアドレスについてTLBミスが発生しても(ステップS402肯定)、OSはデタッチが完了している論理アドレスに対応する物理アドレスをTLB35aに設定しない。よって、ステップS404は正常に終了せず、アクセスエラーとなる。デタッチ完了後、ステップS302の処理とは異なり、OSがノード間で通信し、本アプリケーションがこの共有メモリのPAに対してアクセスを完了したことを通知する(ステップS504)。もし、この共有メモリがホームノード上で解放済みで、かつこのアプリケーションがこの共有メモリを最後に利用したアプリケーションであった場合、ホームノードに解放処理を依頼し(ステップS505)、処理を終了する。
次に、図16を用いて、図11中ステップS105で示したノード間共有メモリの解放処理の流れについて説明する。図16は、ノード間共有メモリの解放処理を説明するためのフローチャートである。例えば、CPU21が実行するアプリケーションは、OSに対してノード間共有メモリの解放処理を要求する(ステップS601)。すると、OSは、指定された共有領域の使用者がすべてデタッチしていた場合は、割当てを解放し(ステップS602)、処理を終了する。もしデタッチが完了していなければ、割り当ての解放処理は行わず、処理を完了する。なお、実際の割り当ての完了処理はステップS505で行われる。
次に、図17を用いて、CPU21が他のCPUに対して、メモリアクセスのリクエストを送信する処理の流れについて説明する。図17は、リクエストを発行する処理の流れを説明するためのフローチャートである。例えば、CPU21の演算部31は、論理アドレスを発行する(ステップS701)。
すると、アドレス変換部35において、論理アドレスから物理アドレスへの変換が行われる(ステップS702)。次に、キャッシュディレクトリ管理部36が、物理アドレスを取得し、キャッシュディレクトリ管理を実行する(ステップS703)。すなわち、キャッシュディレクトリ管理部36は、取得した物理アドレスが示す記憶領域についてのキャッシュステートを遷移させる。
次に、キャッシュディレクトリ管理部36は、ノードマップ34を参照し、取得した物理アドレスが他ノード(他パーティション)のメモリに振り分けられた物理アドレスであるか否かを判定する(ステップS704)。そして、キャッシュディレクトリ管理部36は、取得した物理アドレスが他ノード(他パーティション)のメモリに振り分けられた物理アドレスではないと判定した場合には(ステップS704否定)、取得した物理アドレスを用いてメモリアクセスを実行する(ステップS705)。そして、処理を終了する。
一方、キャッシュディレクトリ管理部36は、取得した物理アドレスが他ノード(他パーティション)のメモリに振り分けられた物理アドレスである場合には(ステップS704肯定)、ノードマップ34から物理アドレスと対応付けられたCPUIDを取得する(ステップS706)。そして、パケット送信部が、CPUIDと物理アドレスとを格納したパケット、すなわち、メモリアクセスのリクエストを生成し、XB2に送出し(ステップS707)、処理を終了する。
次に、図18を用いて、CPU21が他のCPUからメモリアクセスのリクエストを受信した際に実行する処理の流れについて説明する。図18は、リクエストを受信した際に実行する処理の流れを説明するためのフローチャートである。なお、図18に示す例では、CPU21が、他のCPUから「MoveIn to Share」や「MoveIn Exclusively」を受信した際に実行する処理の流れについて説明する。例えば、CPU21は、他のCPUからXB2を介してリクエストを受信する(ステップS801)。
このような場合には、CPU21は、ノードマップ34を用いて、リクエストの対象となる物理アドレスがローカル領域であるか否かを判定する(ステップS802)。そして、CPU21は、リクエストの対象となる物理アドレスがローカル領域である場合には(ステップS802肯定)、リクエスト元のCPUに否定応答を返信し(ステップS803)、処理を終了する。
また、CPU21は、リクエストの対象となる物理アドレスがローカル領域でない場合には(ステップS802否定)、コヒーレンスを保持するキャッシュディレクトリ管理を実行する(ステップS804)。また、CPU21は、物理アドレスが示す記憶領域のステータスを判定する(ステップS805)。
そして、CPU21は、判定したステータスに応じたオーダーを他のCPUに対して発行し(ステップS806)、ステータスを遷移させる(ステップS807)。その後、CPU21は、物理アドレスが示す記憶領域のデータをリクエスト元のCPUに送信する応答を行い(ステップS808)、処理を終了する。
次に、図19を用いて、ECCチェック部41aが、所定の周期ごとに、または、キャッシュディレクトリ管理部36からメモリ22に対するリードのアクセスの要求があるたびに実行する処理の流れについて説明する。図19は、ECCチェック部が実行する処理の流れを説明するためのフローチャートである。図19に示すように、ECCチェック部41aは、メモリ22の全記憶領域のデータ、または、アクセス対象の記憶領域のデータをエラーチェックする(ステップS901)。そして、ECCチェック部41aは、CEが発生したか否かを判定する(ステップS902)。
CEが発生していない場合(ステップS902否定)、例えば、データが正常であるか、または、PEが発生している場合には、処理を終了する。なお、この場合、メモリアクセス部41は、リードのアクセス対象の記憶領域のデータをキャッシュディレクトリ管理部36に送信する。一方、CEが発生した場合(ステップS902肯定)には、ECCチェック部41aは、CEが発生した記憶領域のデータを読み出し、読み出したデータの誤りを訂正し、誤りを訂正したデータを、CEが発生した記憶領域に書き戻す(ステップS903)。そして、ECCチェック部41aは、データを書き戻した記憶領域のデータを再度読み出し(ステップS904)、読み出したデータについて、再度(2度目の)、エラーチェックをする(ステップS905)。
続いて、ECCチェック部41aは、再度、エラーチェックが行われたデータに、CEが発生したか否かを判定する(ステップS906)。CEが発生した場合(ステップS906肯定)には、ECCチェック部41aは、CEが発生したメモリ22の物理アドレスをCEアドレスレジスタ41bに設定し(ステップS907)、処理を終了する。これにより、ICEを検出することができる。
一方、2度目のエラーチェックでCEが発生していない場合(ステップS906否定)には、ECCチェック部41aは、CEが発生したメモリ22の物理アドレスに該当するICE発生回数カウンタ41Cの値を1つインクリメントする(ステップS908)。ここで、ICE発生回数カウンタ41Cは、メモリ22の一定の記憶領域ごとに設けられる。例えば、ECCにより64バイトごとに1ビットの誤り訂正を行うことができる場合には、ICE発生回数カウンタ41Cは、64バイトごとに設けられる。また、ICE発生回数カウンタ41Cは、メモリ22の記憶領域を分割したページごとに設けられてもよい。
そして、ECCチェック部41aは、ICE発生回数カウンタ41Cの値が閾値α以下であるか否かを判定する(ステップS909)。ICE発生回数カウンタ41Cの値が閾値αよりも大きい場合(ステップS909否定)には、ステップS907へ進む。一方、ICE発生回数カウンタ41Cの値が閾値α以下である場合(ステップS909肯定)には、処理を終了する。
次に、図20を用いて、ECCチェック部41aが、所定の周期ごとに実行する処理の流れについて説明する。図20は、ECCチェック部が実行する処理の流れを説明するためのフローチャートである。この処理は、図19に示す処理が実行される周期よりも長い周期で実行される。図20に示すように、ECCチェック部41aは、ICE発生回数カウンタ41Cの値をクリアし(ステップS1001)、処理を終了する。
なお、ECCチェック部41aは、発生したCEの回数を計数し、計数したCEの回数を計数にかかった時間で除した値(単位時間あたりのCEの発生回数)を算出し、算出した値が、閾値βを超えた場合に、ICEが発生したと判定することもできる。このようにしてICEが発生したこと検出する場合のECCチェック部41aが実行する処理の一例について説明する。
図21〜図27は、ECCチェック部により実行されるICEの発生を検出する処理の一例を説明するための図である。図21〜図27の例では、ECCチェック部41aにより用いられるテーブルの一例が示されている。図21〜図27の例が示すテーブルは、単位時間あたりのCEの発生回数が登録される「平均値」の項目、CEの発生回数の計数が開始された時刻が登録される「開始時刻」の項目、CEが最後に発生した時刻が登録される「最終発生時刻」の項目を有する。
例えば、図21が示すテーブルの登録内容は、2011年1月1日0時0分から、CEの発生回数の計数が開始され、最後にCEが発生した時刻が、2011年1月1日3時30分であることを示す。また、図21が示すテーブルの登録内容は、2011年1月1日0時0分から3時30分までの210分間の間に発生したCEの回数を210分で除した値、すなわち、単位時間1分あたりに発生したCEの回数の平均値が、0.1(回/分)であることを示す。
図21の例において、2011年1月1日3時50分に、ECCチェック部41aが新たにECを検出した場合について説明する。この場合、ECCチェック部41aは、まず、図21の例に示すテーブルから、2011年1月1日0時0分から3時30分までの210分間の間に発生したCEの回数「21」(0.1×210)を算出する。そして、ECCチェック部41aは、2011年1月1日0時0分から3時50分までの230分間の間に発生したCEの回数「22」(21+1)を算出する。その後、ECCチェック部41aは、2011年1月1日0時0分から3時50分までの230分間の間に発生したCEの回数「22」を230分で除した値、すなわち、単位時間1分あたりに発生したCEの回数の平均値「0.095」を算出する。そして、ECCチェック部41aは、図22の例に示すように、テーブルの「平均値」の項目および「最終発生時刻」の項目を、それぞれ、「0.095」、「2011/1/1 03:50」に更新する。その後、ECCチェック部41aは、平均値「0.095」が閾値βを超えているか否かを判定し、閾値βを超えている場合には、ICEの発生を検出し、CEが発生したメモリ22の物理アドレスをCEアドレスレジスタ41bに設定する。
なお、テーブルの初期値としては、図23の例に示すように、各項目とも「0」が登録される。なお、「開始時刻」および「最終発生時刻」の項目における「0」は、システムにとって特定の時刻、例えば、Unix(登録商標)系のシステムにおける1970年1月1日0時0分を意味する。
また、ECCチェック部41aは、1回目のCEの発生については次のような処理を行う。例えば、図23の例において、2011年1月1日0時0分に、ECCチェック部41aが1回目のECを検出した場合について説明する。この場合、ECCチェック部41aは、図24の例に示すように、テーブルの「平均値」、「開始時刻」、「最終発生時刻」の各項目を「1」、「2011/1/1 00:00」、「2011/1/1 00:00」に更新する。
また、ECCチェック部41aは、2回目のCEの発生については次のような処理を行う。例えば、図24の例において、2011年1月1日0時5分に、ECCチェック部41aが2回目のECを検出した場合について説明する。この場合、ECCチェック部41aは、2011年1月1日0時0分から0時5分までの5分間の間に発生したCEの回数「2」(1+1)を算出する。その後、ECCチェック部41aは、2011年1月1日0時0分から0時5分までの5分間の間に発生したCEの回数「2」を5分で除した値、すなわち、単位時間1分あたりに発生したCEの回数の平均値「0.4」を算出する。そして、ECCチェック部41aは、図25の例に示すように、テーブルの「平均値」の項目および「最終発生時刻」の項目を、それぞれ、「0.5」、「2011/1/1 00:05」に更新する。
なお、ECCチェック部41aは、「最終発生時刻」の項目に登録された時刻から、所定時間、例えば、1時間以上が経過してから、CEを検出した場合には、このCEの発生を1回目のCEの発生とすることもできる。例えば、図26の例に示すように、テーブルの「最終発生時刻」の項目に、2011年1月1日3時30分に最後にCEが検出されたことを示す情報が登録されている場合について説明する。この場合に、2011年1月1日3時30分から、所定時間(1時間)以上が経過した2011年1月1日5時30分に、ECCチェック部41aが、CEを検出すると、このCEの検出を1回目のCEの検出とする。そして、ECCチェック部41aは、図27に示すように、テーブルの「平均値」、「開始時刻」、「最終発生時刻」の各項目を「1」、「2011/1/1 05:30」、「2011/1/1 05:30」に更新する。これにより、CEの発生頻度が急に上昇した場合に、過去の低い発生頻度に引きずられて、CEの発生頻度が上昇したことに気付くのが遅延するのを抑制することができる。
ここで、CPU21によって実行されるOSが実行する処理について説明する。図28Aは、実施例1に係るCPUが実行するOSの機能構成の一例を示す図である。図28B、図28Cは、OSの処理によって参照されるテーブルのデータ構成の一例を示す図である。図29〜図33、図36、図39は、OSが実行する処理の流れを説明するためのフローチャートである。
図28Aでは、ホームノード50およびリモートノード70におけるOSの機能構成が例示されている。図28の例では、ホームノード50は、検出部51、停止部52、停止依頼部53、送信部54、受信部55、判定部56、張替部57、張替依頼部58、再開部59、再開依頼部60を有する。また、リモートノード70は、受信部71、停止部72、完了通知作成部73、送信部74、張替部75、再開部76を有する。
図29に示すように、検出部51は、CEアドレスレジスタ41bにメモリ22の物理アドレスが設定されたか否かを判定することで、ICEまたはPCEが発生したか否かを判定する(ステップS1101)。ICEまたはPCEが発生していない場合(ステップS1101否定)には、検出部51は、再び、ステップS1101の処理を行う。また、ICEまたはPCEが発生した場合(ステップS1101肯定)には、検出部51は、ICEまたはPCEが共有メモリ内で発生したか否かを判定する(ステップS1102)。例えば、検出部51は、CEアドレスレジスタ41bに設定された物理アドレスが、共有メモリの記憶領域のアドレスであるか否かを判定する。これにより、検出部51は、ICEまたはPCEが共有メモリ内で発生したか否かを判定することができる。なお、CEアドレスレジスタ41bに論理アドレスが設定された場合には、検出部51は、論理アドレスから物理アドレスへ変換する式が登録されたテーブルを参照し、論理アドレスから物理アドレスを算出し、物理アドレスが、共有メモリの記憶領域のアドレスであるか否かを判定する。ここで、かかるテーブルは、アドレス域を示す情報と、アドレス域が示す物理アドレスの範囲と、論理アドレスから物理アドレスに変換する式と、物理アドレスから論理アドレスに変換する式とが対応付けられて登録されたエントリを有する。例えば、検出部51は、図28Bに示すようなテーブルを参照して、論理アドレスから物理アドレスを算出する。
ICEまたはPCEが共有メモリ内で発生していない場合(ステップS1102否定)には、検出部51は、所定の処理を実行し(ステップS1103)、処理を終了する。ここで、所定の処理とは、例えば、対象ページの縮退または縮退予約を行う処理である。なお、メモリアクセス部41が、CEの発生を無視してデータをキャッシュディレクトリ管理部36に送信する処理を行ってもよい。
一方、ICEまたはPCEが共有メモリ内で発生した場合(ステップS1102肯定)には、停止部52は、アクセス停止処理を実行する(ステップS1104)。そして、停止依頼部53は、送信部54に、共有メモリを使用している他ノード(リモートノード70)のOSに、共有メモリへのアクセス停止を行う旨の指示(アクセス停止依頼)を送信する(ステップS1105)。これにより、送信部54は、アクセス停止依頼を、共有メモリを使用している他ノードへ送信する。そして、アクセス停止依頼を受信したリモートノード70のOSがアクセス停止処理を実行し、共有メモリへのアクセスを停止させる。そして、リモートノード70のOSが、共有メモリへのアクセス停止処理を完了した旨をホームノード50へ通知する。なお、送信部54は、アクセス停止依頼を、自ノードに接続された他のノード全てに送信するか、または、図28Cの例に示すテーブルを参照し、共有メモリを使用しているノードを特定し、特定したノードにアクセス停止依頼を送信する。図28Cの例が示すテーブルは、共有メモリの物理アドレスと、共有メモリの論理アドレスと、共有メモリのメモリ長と、共有メモリを使用しているノードの識別子と、次のエントリを示すポインタとを対応付けたエントリを有する。
その後、判定部56は、自ノード(ホームノード50)および他ノードが共有メモリへのアクセスを停止したか否かを判定する(ステップS1106)。例えば、判定部56は、停止部52によるアクセス停止処理が完了したことを確認した場合には、自ノードが共有メモリへのアクセスを停止したと判定する。また、共有メモリへのアクセス停止処理を完了した旨の通知が受信部55で受信された場合には、判定部56は、当該通知を送信した他ノードが共有メモリへのアクセスを停止したと判定する。
自ノード(ホームノード50)および他ノードが共有メモリへのアクセスを停止したと判定した場合(ステップS1106肯定)には、張替部57は、ページ張替処理を実行する(ステップS1107)。
ここで、ページ張替処理の処理内容について具体例を挙げて説明する。例えば、ページ張替処理では、まず、ICEまたはPCEが発生した記憶領域が、分割した最小のサイズのページに含まれるように、ICEまたはPCEが発生した記憶領域を含むページが、複数のページに分割される。例えば、1ページが256MBである場合には、ICEまたはPCEが発生した記憶領域を含むページが最小のサイズ8KBのページに含まれるように、ICEまたはPCEが発生した記憶領域を含む1ページ(256MB)を次のように複数のページに分割する。例えば、1ページ(256MB)を、128MB(1ページ)、8KB(8ページ)、64KB(63ページ)、4MB(31ページ)の計103ページに分割する。これにより、コピーを行う量を256MBから8KBに抑制することができる。このページ分割処理は、コピー処理時間を短くするためのものであり、必ずとも必須の処理ではない。すなわち、このページ分割処理は行わなくてもよい。あるいは、使用可能な(アプリケーションから使用されていない)ノード間共有メモリがある一定容量以下の場合、もしくは、不足している場合のみページ分割処理を行ってもよい。256MBのページは獲得できなくても8KBのページを獲得できる可能性があるからである。そして、ページ張替処理では、コピー先のページが取得される。なお、コピー先のページは、必ず獲得できるよう、OS起動時、あるいはアプリケーション起動時に、システム固定、あるいはユーザ指定のサイズだけあらかじめ獲得するようにしてもよい。続いて、ページ張替処理では、ICEまたはPCEが発生した記憶領域を含むページ(8KB)のページがコピー先のページにコピーされる。なお、ページ分割処理を行わない場合、元のページ全体、たとえば先の例では256MB全体がコピーされる。その後、ページ張替処理では、新しいページ構成がOSの管理領域に設定される。
その後、張替依頼部58は、送信部54に、共有メモリを使用している他ノードのOSにページ張替を行う旨の指示(ページ張替依頼)を送信する(ステップS1108)。これにより、送信部54は、ページ張替依頼を、共有メモリを使用している他ノードへ送信する。そして、ページ張替依頼を受信したリモートノード70のOSがページ張替処理を実行し、ページを張り替える。そして、リモートノード70のOSが、ページ張替処理を完了した旨をホームノード50へ通知する。なお、送信部54は、ページ張替依頼を、自ノードに接続された他のノード全てに送信するか、または、図28Cの例に示すテーブルを参照し、共有メモリを使用しているノードを特定し、特定したノードにページ張替依頼を送信する。
その後、判定部56は、自ノードおよび他ノードがページの張替を完了したか否かを判定する(ステップS1109)。例えば、判定部56は、張替部57によるページ張替処理が完了したことを確認した場合には、自ノードがページの張替を完了したと判定する。また、ページ張替処理を完了した旨の通知が受信部55で受信された場合には、判定部56は、当該通知を送信した他ノードがページの張替を完了したと判定する。
自ノードおよび他ノードがページの張替を完了したと判定した場合(ステップS1109肯定)には、再開部59は、アクセス再開処理を実行する(ステップS1110)。そして、再開依頼部60は、送信部54に、共有メモリを使用している他ノードのOSに挙有メモリへのアクセスを再開する旨の指示(アクセス再開依頼)を送信し(ステップS1111)、処理を終了する。これにより、送信部54は、アクセス再開依頼を、共有メモリを使用している他ノードへ送信する。そして、アクセス再開依頼を受信したリモートノード70のOSがアクセス再開処理を実行し、共有メモリへのアクセスを再開する。そして、リモートノード70のOSが、アクセス再開処理を完了した旨をホームノード50へ通知する。なお、送信部54は、アクセス再開依頼を、自ノードに接続された他のノード全てに送信するか、または、図28Cの例に示すテーブルを参照し、共有メモリを使用しているノードを特定し、特定したノードにアクセス再開依頼を送信する。
次に、図30を用いて、アクセス停止依頼を受信したリモートノード70のOSが実行する処理について説明する。図30は、アクセス停止依頼を受信したリモートノードのOSが実行する処理を説明するためのフローチャートである。図30に示すように、停止部72は、アクセス停止処理を実行する(ステップS1201)。そして、完了通知作成部73は、アクセス停止処理が完了した旨を送信部74に通知し(ステップS1202)、処理を終了する。ここで、アクセス停止処理が完了した旨が通知された送信部74は、アクセス停止処理が完了した旨をホームノード50に送信する。
次に、図31を用いて、ページ張替依頼を受信したリモートノード70のOSが実行する処理について説明する。図31は、ページ張替依頼を受信したリモートノードのOSが実行する処理を説明するためのフローチャートである。図31に示すように、張替部75は、ページ張替処理を実行する(ステップS1301)。このページ張替処理により、新しいページ構成(新しいVA−PAの対応関係)がOSの管理領域に設定される。そして、完了通知作成部73は、ページ張替処理が完了した旨を送信部74に通知し(ステップS1302)、処理を終了する。ここで、ページ張替処理が完了した旨が通知された送信部74は、ページ張替処理が完了した旨をホームノード50に送信する。
次に、図32を用いて、アクセス再開依頼を受信したリモートノード70のOSが実行する処理について説明する。図32は、アクセス再開依頼を受信したリモートノードのOSが実行する処理を説明するためのフローチャートである。図32に示すように、再開部76は、アクセス再開処理を実行し(ステップS1401)、処理を終了する。なお、完了通知作成部73は、ステップS1401の処理の後で、アクセス停止処理が完了した旨を送信部74に通知することもできる。ここで、アクセス停止処理が完了した旨が通知された送信部74は、アクセス停止処理が完了した旨をホームノード50に送信する。
次に、図33を用いて、図29中ステップS1104および図30中ステップS1201で示したアクセス停止処理の流れについて説明する。図33は、アクセス停止処理を説明するためのフローチャートである。図33に示すように、停止部52(停止部72)は、指定された共有メモリについてメモリ管理テーブル(ページ管理テーブル)のI/O処理用ロックを獲得する(ステップS1501)。これにより、I/O装置によるアクセスが保留される。
ここで、メモリ管理テーブルのデータ構成の一例について説明する。図34は、メモリ管理テーブルのデータ構成の一例を示す図である。図34の例のメモリ管理テーブルは、アクセス停止フラグのオン/オフの状態を示す値が登録される「アクセス停止フラグ」の項目と、I/O処理用ロックの状態を示す値が登録される「I/O処理用ロック」の項目とを有する。また、図34の例のメモリ管理テーブルは、他のページ管理テーブルへのポインタが登録される「他のページ管理テーブルへのポインタ」の項目と、アドレス変換テーブルへのポインタが登録される「アドレス変換テーブルへのポインタ」の項目とを有する。また、図34の例のメモリ管理テーブルは、その他の各種管理情報が登録される「その他の管理情報」の項目を有する。
また、メモリ管理テーブルに登録された「アドレス変換テーブルへのポインタ」が示すアドレス変換テーブルについて説明する。図35は、アドレス変換テーブルのデータ構成の一例を示す図である。図35の例のアドレス変換テーブルは、メモリ22の物理アドレスが登録される「PA」の項目と、物理アドレスに対応する論理アドレスが登録される「VA」の項目と、メモリ22の物理アドレスが示す記憶領域のサイズが登録される「領域長」の項目とを有する。また、図35の例のアドレス変換テーブルは、ページ管理テーブルへのポインタが登録される「ページ管理テーブルへのポインタ」の項目と、他のアドレス変換テーブルへのポインタが登録される「他のアドレス変換テーブルへのポインタ」の項目とを有する。また、図35の例のアドレス変換テーブルは、その他の各種管理情報が登録される「その他の管理情報」の項目を有する。
そして、停止部52(停止部72)は、指定された共有メモリについて、メモリ管理テーブルのアクセス停止フラグを設定する(ステップS1502)。これにより、共有メモリへのアクセスが停止される。続いて、停止部52(停止部72)は、アドレス変換テーブルを参照し、TLB35aに、共有メモリの論理アドレスと物理アドレスとが対応付けられたエントリが登録されている場合には、次のような処理を行う。すなわち、停止部52(停止部72)は、TLB35aから当該エントリを削除し(ステップS1503)、処理を終了する。
ここで、共有メモリの論理アドレスと物理アドレスとが対応付けられたエントリがTLB35aから削除されると、アプリケーションが共有メモリへのアクセスを行う場合に、TLBミスが発生する。本実施例では、かかるTLBミスが発生した場合に、TLBミス処理が割込み処理として実行され、アプリケーションによる共有メモリへのアクセスが抑制される。
図36は、TLBミス処理の流れを説明するためのフローチャートである。図36に示すように、OSは、割込みが発生したプログラムカウンタからプロセスを特定する(ステップS1601)。続いて、OSは、発生アドレスから図35に示したアドレス変換テーブルを検索する。対応するアドレス変換テーブルが見つかれば、そのアドレス変換テーブル内のページ管理テーブルのポインタで指示されるページ管理テーブルをチェックする。アクセス先のアドレスが示す記憶領域が、アクセスが停止された記憶領域、(その他の管理情報にスワップアウト済みであることが記録されている)スワップアウトが発生した記憶領域、または、異常が発生した記憶領域(アドレス変換テーブルがない記憶領域)のいずれであるのかを判定する(ステップS1602)。
アクセス停止フラグがオンである場合、すなわち、アクセスが停止された記憶領域である場合(ステップS1602:アクセス停止中)には、OSは、対象プロセス情報を実行中プロセスリストから取り外し、アクセス再開待ちリストに移動させる(ステップS1603)。ここで、アクセス再開待ちリストのデータ構成の一例について説明する。図37は、アクセス再開待ちリストのデータ構成の一例を示す図である。図37の例に示すアクセス再開待ちリストは、プロセスを識別するための識別子が登録される「プロセス識別子」の項目と、再開プログラムカウンタなどのレジスタ情報が退避された領域を指すポインタが登録される「プロセス復元情報」の項目とを有する。また、図37の例に示すアクセス再開待ちリストは、再開待ちの共有メモリの論理アドレスが登録される「再開待ち共有メモリアドレス」の項目と、次のリストへのポインタが登録される「次のリストへのpointer」の項目とを有する。
続いて、OSは、OS内のスケジューラモジュールに別のプロセス起動を依頼し(ステップS1606)、処理を終了する。
また、スワップアウトが発生した記憶領域である場合(ステップS1602:swap out)には、OSは、アクセス先ページのスワップイン処理を起動する(ステップS1604)。そして、OSは、対象プロセス情報を実行中プロセスリストから取り外し、スケジュール待ちリストに移動させ(ステップS1605)、ステップS1606へ進む。ここで、スケジュール待ちリストのデータ構成の一例について説明する。図38は、アクセス再開待ちリストのデータ構成の一例を示す図である。図38の例に示すアクセス再開待ちリストは、プロセスを識別するための識別子が登録される「プロセス識別子」の項目と、再開プログラムカウンタなどのレジスタ情報が退避された領域を指すポインタが登録される「プロセス復元情報」の項目とを有する。また、図38の例に示すアクセス再開待ちリストは、次のリストへのポインタが登録される「次のリストへのpointer」の項目を有する。
また、異常が発生した記憶領域である場合(ステップS1602:異常アドレス)には、OSは、アクセスしたプロセスにアクセスエラーを発生させる「異常アドレスアクセス処理」を実行し(ステップS1607)、処理を終了する。
次に、図39を用いて、図29中ステップS1110および図32中ステップS1401で示したアクセス再開処理の流れについて説明する。図39は、アクセス再開処理を説明するためのフローチャートである。図39に示すように、再開部59(再開部76)は、指定された共有メモリについてメモリ管理テーブルのアクセス停止フラグをクリアする(ステップS1701)。これにより、CPUによる共有メモリへのアクセスが再開される。
そして、再開部59(再開部76)は、指定された共有メモリについて、メモリ管理テーブルのI/O処理用ロックを解放する(ステップS1702)。これにより、I/O装置によるアクセスが再開される。その後、再開部59(再開部76)は、アクセス再開待ちプロセスリストをチェックし、プロセスをスケジュール待ちリストに移動させ(ステップS1703)、処理を終了する。
なお、停止部52、停止部72、再開部59、再開部76などが実行する処理をプロセスが行うこともできる。図40は、実施例1に係るCPUが実行するOSおよびプロセスの機能構成の一例を示す図である。図40の例は、図28Aの例と比較して、プロセスが停止部52、停止部72、再開部59、再開部76を有する点が、図28Aの例と異なる。ここで、OSが予め共有メモリの物理アドレスと、各種のイベントハンドラとを対応付けられた情報を作成するものとする。本情報の作成は、たとえば、アプリケーションが“共有メモリのアドレス”と、“受け取りしたいイベント種別”(アクセス停止依頼、アクセス再開依頼など)、および、そのイベントに関する“イベントハンドラプログラムのアドレス”の対応付けをOSに依頼することで行う。アプリケーションは、通常、“共有メモリの仮想アドレス(VA)”のみを知っており、物理アドレス(PA)は知らない。そこで、OS側でVAをPAに変換し、記録する。そのPAに関連したイベント(たとえばアクセス停止依頼)が発生した場合、そのイベント、およびPAに対応するイベントハンドラプログラムが起動されることになる。(イベントハンドラプログラムの開始アドレスが登録されているので、その開始アドレスからプログラムの動作を開始させる)。
そして、停止部52および停止部72は、検出部51によってICEまたはPCEが検出された場合には、作成された情報を参照し、CEアドレスレジスタ41bに設定された共有メモリの物理アドレスに対応する第一のイベントハンドラを読み出す。具体的には、アプリケーションが動作中にイベントが発生した場合、その時点で動作していたレジスタ情報をスタックに退避し、第一のイベントハンドラプログラムの開始アドレスからイベントハンドラプログラムの動作を開始する。すると、第一のイベントハンドラが、アプリケーションの共有メモリに対する一切のアクセス(read/write、およびI/Oアクセス)を停止させる。停止させるための方法としては、1) プログラム内で”共有メモリに対するアクセス停止フラグ“を用意しておき、アプリケーションはこのフラグがオンになっていないときのみアクセスを続行するように作成する。第一のイベントハンドラでは、このフラグをオンにする、2)第一のイベントハンドラ内でアプリケーションの動作を停止し、アプリケーションの処理が一切進まないようにする、などの方法がある。
また、再開部59は、判定部56により自ノードおよび他ノードがページの張替を完了したと判定された場合には、作成された情報を参照し、CEアドレスレジスタ41bに設定された共有メモリの物理アドレスに対応する第二のイベントハンドラを読み出す。すると、アプリケーション(プロセス)は、指定された共有メモリに対する、停止していたすべてのアクセス(read/write、およびI/Oアクセス)を再開する。また、再開部76は、アクセス再開依頼を受信すると、作成された情報を参照し、CEアドレスレジスタ41bに設定された共有メモリの物理アドレスに対応する第二のイベントハンドラを読み出す。具体的には、アプリケーションが動作中にイベントが発生した場合、その時点で動作していたレジスタ情報をスタックに退避し、第二のイベントハンドラプログラムの開始アドレスからイベントハンドラプログラムの動作を開始する。すると、第二のイベントハンドラが、アプリケーション(プロセス)の、指定された共有メモリに対する、停止していたすべてのアクセスを再開させる。再開させるための方法としては、1)プログラム内で”共有メモリに対するアクセス停止フラグ“を用意しておき、アプリケーションはこのフラグがオンになっていないときのみアクセスを続行するように作成する。第二のイベントハンドラでは、このフラグをオフにする、2)第一のイベントハンドラ内でアプリケーションが動作を停止しているので、PCの書き換えることにより、アプリケーションの処理が第一のイベントハンドラから復帰するようにする、などの方法がある。なお、再開部59から直接呼び出される自ノード内のイベントハンドラと、再開部76から呼び出される他ノード上のイベントハンドラは、同一の命令列からなるプログラムであってもよいし、異なる命令列からなるプログラムであってもよい。(プログラマーの好みの問題であり、どちらでも実現可能である)。
[実施例1の効果]
上述したように、情報処理システム1は、メモリを各々が備える複数のビルディングブロックと、複数のビルディングブロック間を接続するXB2とを有する。複数のビルディングブロックのうち少なくとも1つのビルディングブロック10は、ビルディングブロック10又は他のビルディングブロックが備えるメモリに含まれる、ビルディングブロック10又は他のビルディングブロックによりアクセスされる共有メモリ領域に記憶されたデータについて、次のような処理を行う。すなわち、ビルディングブロック10は、所定時間内に所定回数を超えて発生するICE、または、共有メモリ領域内の同一箇所に発生するPCEを検出する。ビルディングブロック10は、エラーが検出された場合には、ビルディングブロック10及び他のビルディングブロックによる共有メモリへのアクセスを抑止するように制御する。ビルディングブロック10は、共有メモリ領域とは異なるメモリ領域にデータの復元を行う。ビルディングブロック10は、異なるメモリ領域を他のビルディングブロックに通知する。ビルディングブロック10ビルディングブロック10又は他のビルディングブロックによる共有メモリへのアクセスを再開するように制御する。したがって、情報処理システム1によれば、情報処理システム1がダウンする可能性を抑制することができる。
また、情報処理システム1は、受信した物理アドレスに基づいて、アクセス対象が共有領域であるかローカル領域であるかを判別するので、ローカル領域に格納するカーネルデータやユーザデータのセキュリティレベルを高く保つことができる。また、情報処理システム1は、全てのメモリをキャッシュ可能とするので、メモリアクセスにおけるレイテンシを容易に隠蔽することができる。
また、CPU21は、他のCPUがアクセスするメモリの共有領域に対して、メモリ22にアクセスする場合と同様の方法でアクセスする。すなわち、CPU21が有する演算部31は、アクセス対象となる記憶領域がメモリ22上に存在する場合にも、他のメモリ上に存在する場合にも、論理アドレスを出力するだけでよい。
このため、CPU21は、I/Oの排他制御等の処理やプログラミング等を実行せずとも、容易に共有領域にアクセスできるため、メモリアクセス性能を向上させることができる。また、CPU21は、実行するプログラムやOSに改変を行わずとも、共有メモリを適切に利用することができる結果、プリフェッチ処理の実行を従来と同様に行う事ができるため、メモリアクセスの性能を向上させることができる。
また、CPU21は、他のCPUからのメモリアクセスの対象がローカル領域へのアクセスであると判定した場合には、否定応答を返信する。このため、情報処理システム1は、共有領域以外へのアクセスを防止する結果、エラーを防ぐことができる。
また、キャッシュディレクトリ管理部36は、ノードマップ34を用いて、物理アドレスをノードマップ34に対応付けて記憶されたCPUIDに変換する。このため、CPU21は、アクセス対象となる物理アドレスが振り分けられたメモリにアクセスするCPUを識別することができる。
また、CPU21は、メモリ22に記憶されたデータをキャッシュしたCPUを管理するディレクトリを用いて、キャッシュコヒーレンスの制御を行う。このため、情報処理システム1は、情報処理システム1が有するCPUの数が増加した場合にも、XB2のトラフィックを増加させることなく、効率的にキャッシュコヒーレンスを保持することができる。
具体的には、情報処理システム1においては、各CPU間の通信が、リモートCPUとホームCPU間、または、リモートCPUとホームCPUと更新したデータをキャッシュするローカルCPU間に限定される。このため、情報処理システム1は、効率的にキャッシュコヒーレンスを保持することができる。
これまで本発明の実施例について説明したが実施例は、上述した実施例以外にも様々な異なる形態にて実施されてよいものである。そこで、他の実施例を説明する。
(1)ビルディングブロックについて
上述した情報処理システム1は、4つのCPUを有するビルディングブロック10〜10eを有していた。しかし、実施例はこれに限定されるものではなく、ビルディングブロック10〜10eは、任意の数のCPU及び各CPUがアクセスするメモリを有することができる。また、CPUとメモリは、1対1で対応している必要はなく、メモリに直接アクセスするCPUは全体の一部であってもよい。
(2)CPUが送信するパケットについて
上述したCPU21は、CPUIDとPAとを有するパケットをメモリアクセスのリクエストとして送信した。しかし、実施例は、これに限定されるものではない。すなわち、CPU21は、アクセス対象となるメモリにアクセスするCPUを一意に識別できるのであれば、任意の情報を格納したパケットを出力してよい。
また例えば、CPU21は、CPUIDからVC(Virtual Connection)IDに変換し、VCIDを格納することとしてもよい。また、CPU21は、パケットに、データ長を示すレングス等の情報を格納することとしてもよい。
(3)CPUが発行するオーダー(命令)について
上述したように、各CPU21〜21cは、リクエストやオーダーを発行して、キャッシュのコヒーレンスを保持した。しかし、上述したリクエストやオーダーは、あくまで一例であり、例えばCPU21〜21cは、CAS(Compare AndSwap)命令を発行してもよい。
このように、CPU21〜21cがCAS命令を発行した場合には、排他制御のコンテンションが複数のCPU間で頻発しても、各CPUのキャッシュ上で処理が行われる。この結果、CPU21〜21cは、メモリアクセスの発生による遅延を防止するとともに、各CPU間のドランザクションが混雑するのを防ぐことができる。
(4)ハイパーバイザを経由した制御について
上述した情報処理システム1では、OSによってハードウェアであるアドレス変換部35にアクセスを行う例について説明した。しかし、実施例はこれに限定されるものではなく、たとえは、仮想マシンを動作させるハイパーバイザ(HPV:Hypervisor)がアドレス変換部35にアクセスを行っても良い。
すなわち、ハイパーバイザが動作するノードにおいては、OSは、キャッシュやMMUなどのCPU21〜21cのハードウェア資源に対して直接の操作を行わず、操作をハイパーバイザに依頼することとなる。このように、各CPU21〜21cは、ハイパーバイザを介した制御を受付ける場合には、仮想アドレスを実アドレス(RA:Real Address)に変換し、その後、実アドレスを物理アドレスに変換することとなる。
また、ハイパーバイザが動作するノードにおいては、割り込み処理は、OSには直接割り込まず、HPVに対して割り込みを行う。このような場合には、ハイパーバイザが、OSの割り込み処理ハンドラを読出すことで割り込みを行う。なお、上述したハイパーバイザが実行する処理は、仮想マシンを動作させるために実行される公知な処理である。
(5)パーティションを用いた処理について
上述した情報処理システム1では、各CPU21〜21cは、1つのノードマップを用いてメモリアクセスを送信していた。しかし、実施例はこれに限定されるものではない。例えば、各ビルディングブロック10〜10eは、複数のノード群として動作し、各ノード群毎に、同一のファームウェア(ハイパーバイザ)を動作させる1つの論理パーティションを構成しても良い。
このような場合には、各CPU21〜21cは、アクセス先のCPUを示すノードマップと、同一論理パーティション内のCPUを示すノードマップとを有する。このように、各CPU21〜21cは、同一論理パーティション内に含まれるCPUを示すノードマップを有することで、エラー発生通知、ダウン要求、リセット要求パケット等の、論理パーティションを超えて転送すべきではない特殊パケットの転送範囲を識別することができる。
(6)サービスプロセッサを経由した制御について
上述した情報処理システム1では、サービスプロセッサ24によってハードウェアであるノードマップ34にアクセスを行う例について説明した。しかし、実施例はこれに限定されるものではなく、サービスプロセッサ24以外がノードマップ34にアクセスするよう構成しても良い。たとえば、CPU21〜21c上の一つあるいはすべてのCPUで動作している基本ファームウェアBIOS(Basic Input/Output System)あるいはHPVなどがノードマップ34にアクセスを行えるよう構成しても良い。