(57)【要約】【課題】ディレクトリでの訂正不可能障害から継続動作可能状態に復帰することを可能とするマルチプロセッサシステムを提供する。【解決手段】主記憶装置１０７と複数のプロセッサ１０１とメモリコントローラ１０５とディレクトリ１０６とを具備するマルチプロセッサシステムを用いる。プロセッサ１０１はプロセッサキャッシュ１０２を有する。ディレクトリ１０６は、エントリ情報を格納する。メモリコントローラ１０５は、プロセッサキャッシュ間のコヒーレンシを保証し、ディレクトリ１０６から得た第１アドレス情報に対応する第１エントリ情報に異常が有る場合、第１エントリ情報を無効化する指示をプロセッサ１０１へ出力する。プロセッサ１０１は、プロセッサキャッシュ１０２の第１エントリ情報を無効化し、第１アドレス情報で特定される最新データが主記憶装置１０７にあることを示す返信をメモリコントローラ１０５へ出力する。【選択図】図１
2008046701.tif 000002
【特許請求の範囲】
【請求項１】
主記憶装置と、
プロセッサキャッシュを有する複数のプロセッサと、
前記複数のプロセッサの各々から前記主記憶装置へのアクセスを制御し、プロセッサキャッシュ間のコヒーレンシを保証するメモリコントローラと、
前記主記憶装置のアドレス情報毎のキャッシュ制御状態を示すエントリ情報を格納するディレクトリと
を具備し、
前記メモリコントローラは、
前記ディレクトリから読み出した第１アドレス情報に対応する第１エントリ情報に異常が有る場合、前記第１エントリ情報を無効化する指示を前記複数のプロセッサへ出力し、
前記複数のプロセッサの各々は、
前記プロセッサキャッシュの前記第１エントリ情報を無効化し、
前記第１アドレス情報で特定されるデータの最新のものが前記主記憶装置にあることを示す返信を前記メモリコントローラへ出力する
マルチプロセッサシステム。
【請求項２】
請求項１に記載のマルチプロセッサシステムにおいて、
前記メモリコントローラは、
前記複数のプロセッサからの前記返信の有無を確認する障害処理部と、
前記複数のプロセッサの全てから前記返信を受信したことを前記障害処理部が確認するまで、読み出し要求を受け付けない調停部と
を備える
マルチプロセッサシステム。
【請求項３】
請求項１又は２に記載のマルチプロセッサシステムにおいて、
前記プロセッサは、自身の前記プロセッサキャッシュに前記第１アドレス情報で特定されるデータとして最新データを有している場合、前記最新データを前記メモリコントローラへ出力し、
前記メモリコントローラは、前記主記憶装置の前記第１アドレス情報において前記最新データに上書きする主記憶制御部を備える
マルチプロセッサシステム。
【請求項４】
請求項１乃至３のいずれか一項に記載のマルチプロセッサシステムにおいて、
前記メモリコントローラは、
前記ディレクトリから再度読み出した前記第１アドレス情報に対応する第２エントリ情報に異常が有る場合、前記第１アドレス情報に対応する前記エントリ情報を格納する固定障害処理部を備え、
前記ディレクトリに対する前記第１アドレス情報に対応するデータへの読み出し要求を受けたとき、前記固定障害処理部は、前記第１アドレス情報に対応する前記エントリ情報を、前記ディレクトリに替わって出力する
マルチプロセッサシステム。
【請求項５】
接続される主記憶装置のアドレス情報毎のキャッシュ制御状態を示すエントリ情報を格納するディレクトリから読み出した第１アドレス情報に対応する第１エントリ情報に異常が有るか否かを検出する異常検出部と、
前記異常の検出に基づいて、前記第１エントリ情報を無効化する指示を複数のプロセッサへ出力するリクエスト部と
を具備する
メモリコントローラ。
【請求項６】
請求項５に記載のメモリコントローラにおいて、
接続される複数のプロセッサからの第１アドレス情報で特定されるデータの最新のものが前記主記憶装置にあることを示す返信の有無を確認する障害処理部と、
前記複数のプロセッサの全てから前記返信を受信したことを前記障害処理部が確認するまで、読み出し要求を受け付けない調停部と
を更に具備する
メモリコントローラ。
【請求項７】
請求項５又は６に記載のメモリコントローラにおいて、
前記プロセッサは、自身の前記プロセッサキャッシュに前記第１アドレス情報で特定されるデータとして最新データを有している場合、前記最新データを前記メモリコントローラへ出力し、
前記主記憶装置の前記第１アドレス情報において前記最新データに上書きする主記憶制御部を更に具備する
メモリコントローラ。
【請求項８】
請求項５乃至７のいずれか一項に記載のメモリコントローラにおいて、
前記ディレクトリから再度読み出した前記第１アドレス情報に対応する第２エントリ情報に異常が有る場合、前記第１アドレス情報に対応する前記エントリ情報を格納する固定障害処理部を更に具備し、
前記ディレクトリに対する前記第１アドレス情報に対応するデータへの読み出し要求を受けたとき、前記固定障害処理部は、前記第１アドレス情報に対応する前記エントリ情報を、前記ディレクトリに替わって出力する
メモリコントローラ。
【請求項９】
マルチプロセッサシステムの動作方法であって、
ここで、マルチプロセッサシステムは、
主記憶装置と、
プロセッサキャッシュを有する複数のプロセッサと、
前記複数のプロセッサの各々から前記主記憶装置へのアクセスを制御し、プロセッサキャッシュ間のコヒーレンシを保証するメモリコントローラと、
前記主記憶装置のアドレス情報毎のキャッシュ制御状態を示すエントリ情報を格納するディレクトリと
を具備し、
前記マルチプロセッサシステムの動作方法は、
（ａ）前記メモリコントローラが、前記ディレクトリから読み出した第１アドレス情報に対応する第１エントリ情報に異常が有る場合、前記第１エントリ情報を無効化する指示を前記複数のプロセッサへ出力するステップと、
（ｂ）前記複数のプロセッサの各々が、前記プロセッサキャッシュの前記第１エントリ情報を無効化するステップと、
（ｃ）前記複数のプロセッサの各々が、前記第１アドレス情報で特定されるデータの最新のものが前記主記憶装置にあることを示す返信を前記メモリコントローラへ出力するステップと
を具備する
マルチプロセッサシステムの動作方法。
【請求項１０】
請求項９に記載のマルチプロセッサシステムの動作方法において、
前記メモリコントローラは、障害処理部と調停部とを備え、
前記マルチプロセッサシステムの動作方法は、
（ｄ）前記調停部が、前記複数のプロセッサの全てから前記返信を受信したことを前記障害処理部が確認するまで、読み出し要求を受け付けないステップを更に具備する
マルチプロセッサシステムの動作方法。
【請求項１１】
請求項９又は１０に記載のマルチプロセッサシステムの動作方法において、
前記メモリコントローラは、主記憶制御部を備え、
前記マルチプロセッサシステムの動作方法は、
（ｅ）前記プロセッサが、自身の前記プロセッサキャッシュに前記第１アドレス情報で特定されるデータとして最新データを有している場合、前記最新データを前記メモリコントローラへ出力するステップと、
（ｆ）前記主記憶制御部が、前記主記憶装置の前記第１アドレス情報において前記最新データに上書きするステップと
を更に具備する
マルチプロセッサシステムの動作方法。
【請求項１２】
請求項９乃至１１のいずれか一項に記載のマルチプロセッサシステムの動作方法において、
前記メモリコントローラは、固定障害処理部を備え、
前記マルチプロセッサシステムの動作方法は、
（ｇ）前記固定障害処理部が、前記ディレクトリから再度読み出した前記第１アドレス情報に対応する第２エントリ情報に異常が有る場合、前記第１アドレス情報に対応する前記エントリ情報を格納するステップと、
（ｈ）前記メモリコントローラが、前記ディレクトリに対する前記第１アドレス情報に対応するデータへの読み出し要求を受けたとき、前記固定障害処理部が、前記第１アドレス情報に対応する前記エントリ情報を、前記ディレクトリに替わって出力するステップを更に具備する
マルチプロセッサシステムの動作方法。
【請求項１３】
マルチプロセッサシステムの動作方法を実行するプログラムであって、
ここで、マルチプロセッサシステムは、
主記憶装置と、
プロセッサキャッシュを有する複数のプロセッサと、
前記複数のプロセッサの各々から前記主記憶装置へのアクセスを制御し、プロセッサキャッシュ間のコヒーレンシを保証するメモリコントローラと、
前記主記憶装置のアドレス情報毎のキャッシュ制御状態を示すエントリ情報を格納するディレクトリと
を具備し、
前記プログラムは、
（ａ）前記メモリコントローラが、前記ディレクトリから読み出した第１アドレス情報に対応する第１エントリ情報に異常が有る場合、前記第１エントリ情報を無効化する指示を前記複数のプロセッサへ出力するステップと、
（ｂ）前記複数のプロセッサの各々が前記プロセッサキャッシュの前記第１エントリ情報を無効化し、前記第１アドレス情報で特定されるデータの最新のものが前記主記憶装置にあることを示す返信を出力したとき、前記メモリコントローラが、前記返信を受信するステップと
を具備する
マルチプロセッサシステムの動作方法を実行するためのプログラム。
【請求項１４】
請求項１３に記載のプログラムにおいて、
前記メモリコントローラは、障害処理部と調停部とを備え、
前記プログラムは、
（ｃ）前記調停部が、前記複数のプロセッサの全てから前記返信を受信したことを前記障害処理部が確認するまで、読み出し要求を受け付けないステップを更に具備する
プログラム。
【請求項１５】
請求項１３又は１４に記載のプログラムにおいて、
前記メモリコントローラは、主記憶制御部を備え、
前記プログラムは、
（ｄ）前記主記憶制御部が、前記プロセッサが自身の前記プロセッサキャッシュに前記第１アドレス情報で特定されるデータとして最新データを有している場合に前記メモリコントローラへ出力した前記最新データを、前記主記憶装置の前記第１アドレス情報において前記最新データに上書きするステップと
を更に具備する
プログラム。
【請求項１６】
請求項１３乃至１５のいずれか一項に記載のプログラムにおいて、
前記メモリコントローラは、固定障害処理部を備え、
前記プログラムは、
（ｅ）前記固定障害処理部が、前記ディレクトリから再度読み出した前記第１アドレス情報に対応する第２エントリ情報に異常が有る場合、前記第１アドレス情報に対応する前記エントリ情報を格納するステップと、
（ｆ）前記メモリコントローラが、前記メモリコントローラが、前記ディレクトリに対する前記第１アドレス情報に対応するデータへの読み出し要求を受けたとき、前記固定障害処理部が、前記第１アドレス情報に対応する前記エントリ情報を、前記ディレクトリに替わって出力するステップを更に具備する
プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、マルチプロセッサシステム及びその動作方法に関し、特にＲＡＭ（Ｒａｎｄｏｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）で構成されるディレクトリの訂正不可能障害を救済可能なマルチプロセッサシステム及びその動作方法に関する。
【背景技術】
【０００２】
複数のＣＰＵやＩ／Ｏプロセッサを搭載したマルチプロセッサシステムが知られている。このようなマルチプロセッサシステムは、例えば、内部に主記憶データを一時的に格納するＭＥＳＩなどの一般的なプロトコルを採用するストアイン方式のキャッシュメモリ（プロセッサキャッシュ）を搭載している。そして、複数のＣＰＵやＩＯプロセッサのキャッシュ間コヒーレンシ保証方式としてすべての自メモリコントローラ搭載主記憶データをキャッシュラインサイズ単位でその状態を管理するフルディレクトリ方式を採用するキャッシュコヒーレンシ制御回路や、主記憶制御回路を有するメモリコントローラとを接続するシステムインタフェースを有している。例えば、特開２００５−２５０８３０号公報に開示された主記憶共有マルチプロセッサは、プロセッサが内部にプロセッサキャッシュを内蔵し、主記憶の各ページごとにその主記憶がプロセッサキャッシュに登録されているかどうかを示すディレクトリを有し、それらプロセッサキャッシュやディレクトリを管理する制御回路を有している。
【０００３】
特開平４−１１５３３９号公報にメモリエラー処理システムが開示されている。このメモリエラー処理システムは、主記憶装置から読み出したデータを一時格納する緩衝記憶装置のメモリエラー処理システムである。エラー検出手段と、エラーアドレスレジスタと、エラーデータレジスタと、データフェッチ手段と、書き込み手段と、比較手段とを含む。エラー検出手段は、前記緩衝記憶装置からの読み出しデータのエラーをチェックする。エラーアドレスレジスタは、このエラー検出手段によりエラーが検出されたときのアドレスを保持する。エラーデータレジスタは、前記エラー検出時の読み出しデータを保持する。データフェッチ手段は、前記エラーアドレスレジスタの保持アドレスにより前記主記憶装置からデータフェッチする。書き込み手段は、このフェッチされたデータを前記緩衝記憶装置の対応アドレスへ格納する。比較手段は、この書き込み後の該当データを前記緩衝記憶装置から読み出して前記エラーデータレジスタの格納データと比較する。
【０００４】
特開平４−３２６４３６号公報にキャッシュコントローラが開示されている。このキャッシュコントローラは、テーブルと、不良アドレス検索手段と、アドレス変換手段からなる。テーブルは、キャッシュメモリの読み出しまたは書き込み時に発生したメモリエラーの発生アドレスを記憶しておく。不良アドレス検索手段は、データをキャッシュメモリに読み出しまたは書き込み時に、上記テーブルを検索する。アドレス変換手段は、上記検索の結果、不良アドレスがあれば代替アドレスを指示して代替アドレスにデータを読み出し又は書き込ませる。
【０００５】
特開平５−１６５７１９号公報にメモリアクセス処理装置が開示されている。このメモリアクセス処理装置は、データアレイとアドレスアレイとキャッシュと第１のエラー検出訂正手段を備えている。情報処理装置は、前記アドレスアレイのＭビットを強制的に有効にするＭビット変更手段を更に備える。主記憶をリードし前記データアレイにデータを登録し、対応するアドレスをアドレスアレイに登録するときに前記第１のエラー検出訂正手段により主記憶の訂正可能なエラーが検出された場合には、前記Ｍビット変更手段により強制的にＭビットを有効状態にしてアドレスアレイに登録するようにしている。
【０００６】
特開平９−３０５４８９号公報に情報処理システム及びその制御方法が開示されている。この情報処理システムは、複数のノードによって共有分散メモリを実現する。第１記憶手段と、第２記憶手段と、実行手段と、第１更新手段とを備える。第１記憶手段は、当該情報処理システムにおけるマルチキャストの宛て先を、各マルチキャストのエントリ毎に、１つ又は複数のノードを含むグループを単位として記憶する。第２記憶手段は、マルチキャストを実行すべきエントリについて、前記第１記憶手段よりキャッシュの状態を獲得してノード単位の情報に展開し、これをマルチキャスト情報として記憶する。実行手段は、前記第２記憶手段に記憶されたマルチキャスト情報に基づいて、当該エントリについてマルチキャストを実行する。第１更新手段は、前記実行手段によるマルチキャストの結果に基づいて前記第２記憶手段に記憶されたマルチキャスト情報をノード毎に更新する。
【０００７】
特開平１１−２３２２４０号公報にマルチプロセッサシステムのキャッシュ障害処理方法が開示されている。ここで、マルチプロセッサシステムは、複数のプロセッサとバス制御回路と第１のバスとを有する系を少なくとも一つ備える。複数のプロセッサは、キャッシュメモリを有する。バス制御回路は、前記キャッシュメモリに格納されたデータのキーアドレス及びステータスからなるアドレスアレイのコピーデータを保持するコピーキャッシュを有する前記キャッシュメモリの内容と主記憶装置のキャッシュコヒーレンシを保証する。第１のバスは、前記プロセッサ及び前記バス制御回路を接続する。前記系と前記主記憶装置が第２のバスによって接続されている。このマルチプロセッサシステムのキャッシュ障害処理方法は、マルチプロセッサシステムで、前記アドレスアレイのデータに訂正不可能なエラーが発生した場合に実行される。前記アドレスアレイのデータで発生した前記エラーの検出回数をカウントし、予め設定された回数になるまで、前記コピーキャッシュで保持した前記コピーデータを用いて前記アドレスアレイのデータを回復させる。
【０００８】
【特許文献１】特開２００５−２５０８３０号公報
【特許文献２】特開平４−１１５３３９号公報
【特許文献３】特開平４−３２６４３６号公報
【特許文献４】特開平５−１６５７１９号公報
【特許文献５】特開平９−３０５４８９号公報
【特許文献６】特開平１１−２３２２４０号公報
【発明の開示】
【発明が解決しようとする課題】
【０００９】
従来、メモリコントローラに接続されＲＡＭで構成されるディレクトリにおけるディレクトリの情報は、ＥＣＣ（Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｎｇ  Ｃｏｄｅ）により保護されている。ここで、このディレクトリにおいて訂正不可能障害が検出された場合、該当データのプロセッサキャッシング情報が失われる。そうなると、プロセッサキャッシュ間コヒーレンシ保証が不可能となり、即システム停止とせざるを得ない状況が起こり得る。その場合、比較的障害の可能性の高いＲＡＭ障害にシステム全体の可用性が制限されるおそれがある。訂正不可能障害から継続動作可能状態に復帰することを可能とする技術が望まれる。また、ディレクトリのＲＡＭ障害が固定障害であった場合でも、継続動作可能状態に復帰することを可能とする技術が望まれる。
【００１０】
本発明の目的は、ＲＡＭで構成されるディレクトリでの訂正不可能障害から継続動作可能状態に復帰することを可能とするマルチプロセッサシステム及びマルチプロセッサシステムの動作方法を提供することにある。
【００１１】
本発明の他の目的は、ディレクトリのＲＡＭ障害が固定障害であった場合でも、継続動作可能状態に復帰することを可能とするマルチプロセッサシステム及びマルチプロセッサシステムの動作方法を提供することにある。
【課題を解決するための手段】
【００１２】
以下に、発明を実施するための最良の形態で使用される番号・符号を用いて、課題を解決するための手段を説明する。これらの番号・符号は、特許請求の範囲の記載と発明を実施するための最良の形態との対応関係を明らかにするために括弧付きで付加されたものである。ただし、それらの番号・符号を、特許請求の範囲に記載されている発明の技術的範囲の解釈に用いてはならない。
【００１３】
上記課題を解決するために、本発明のマルチプロセッサシステムは、主記憶装置（１０７）と複数のプロセッサ（１０１）とメモリコントローラ（１０５）とディレクトリ（１０６）とを具備する。複数のプロセッサ（１０１）は、プロセッサキャッシュ（１０２）を有する。メモリコントローラ（１０５）は、複数のプロセッサ（１０１）の各々から主記憶装置（１０７）へのアクセスを制御し、プロセッサキャッシュ間のコヒーレンシを保証する。ディレクトリ（１０６）は、主記憶装置（１０７）のアドレス情報毎のキャッシュ制御状態を示すエントリ情報（２０２、２０３、２０４）を格納する。メモリコントローラ（１０５）は、ディレクトリ（１０６）から読み出した第１アドレス情報に対応する第１エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１エントリ情報（２０２、２０３、２０４）を無効化する指示を複数のプロセッサ（１０１）へ出力する。複数のプロセッサ（１０１）の各々は、プロセッサキャッシュ（１０２）の第１エントリ情報（２０２、２０３、２０４）を無効化する。第１アドレス情報で特定されるデータの最新のものが主記憶装置（１０７）にあることを示す返信をメモリコントローラ（１０５）へ出力する。
本発明では、ディレクトリ（ＲＡＭ：１０６）で訂正不可能な障害を検出した際に、該当アドレスの無効化を全プロセッサキャッシュ（１０２）に指示する機能を用意することで、ディレクトリ（ＲＡＭ：１０６）で訂正不可能な障害を検出したエントリ情報（２０２、２０３、２０４）に対応する主記憶データが最新であることを保証することが出来る。
【００１４】
上記のマルチプロセッサシステムにおいて、メモリコントローラ（１０５）は、複数のプロセッサ（１０１）からの返信の有無を確認する障害処理部（３２２）と、複数のプロセッサ（１０１）の全てから返信を受信したことを障害処理部（３２２）が確認するまで読み出し要求を受け付けない調停部（３０５）とを備えることが好ましい。
本発明では、ディレクトリ（ＲＡＭ：１０６）で訂正不可能な障害を検出した際に、更に、全プロセッサキャッシュ（１０２）の無効化完了を待ち合わせる機能を用意することで、ディレクトリ（ＲＡＭ：１０６）で訂正不可能な障害を検出したアドレス情報（エントリ）に対応する主記憶データが最新であることを保証することが出来る。
【００１５】
上記のマルチプロセッサシステムにおいて、プロセッサ（１０１）は、自身のプロセッサキャッシュ（１０２）に第１アドレス情報で特定されるデータとして最新データを有している場合、最新データをメモリコントローラ（１０５）へ出力することが好ましい。メモリコントローラ（１０５）は、主記憶装置（１０５）の第１アドレス情報において最新データに上書きする主記憶制御部（３１３）を備えることが好ましい。
本発明では、ディレクトリ（ＲＡＭ：１０６）で訂正不可能な障害を検出した際に、該ディレクトリ（ＲＡＭ：１０６）のエントリ情報を、主記憶データが最新データであることを示す値に強制的に上書きすることで、障害状態から通常状態への復旧を行うことが出来る。
【００１６】
上記のマルチプロセッサシステムにおいて、メモリコントローラ（１０５）は、ディレクトリ（１０６）から再度読み出した第１アドレス情報に対応する第２エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を格納する固定障害処理部（３２７）を備えることが好ましい。ディレクトリ（１０６）に対する第１アドレス情報に対応するデータへの読み出し要求を受けたとき、固定障害処理部（３２７）は、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を、ディレクトリ（１０６）に替わって出力することが好ましい。
本発明では、更に、上記処理によっても同ディレクトリ（ＲＡＭ：１０６）のアドレス情報（エントリ）での障害がなくならない場合、これを固定障害と判断し、ディレクトリ（ＲＡＭ：１０６）の該エントリ情報（２０２、２０３、２０４）を、ディレクトリ（１０６）とは別に用意する固定障害処理部（３２７：例示、レジスタ）に移し、その後は該ディレクトリ（１０６）のアドレス情報（エントリ）に対するアクセスは、ディレクトリ（１０６）ではなくこの固定障害処理部（３２７）に対して行うことで、ディレクトリ（１０６）で固定障害が発生した場合でも、システムの継続動作を可能にできる。
【００１７】
本発明のメモリコントローラ（１０５）は、接続される主記憶装置（１０７）のアドレス情報毎のキャッシュ制御状態を示すエントリ情報を格納するディレクトリ（１０６）から読み出した第１アドレス情報に対応する第１エントリ情報（２０２、２０３、２０４）に異常が有るか否かを検出する異常検出部（３１０）と、異常の検出に基づいて、第１エントリ情報（２０２、２０３、２０４）を無効化する指示を複数のプロセッサ（１０１）へ出力するリクエスト部（３１１）とを具備する。
【００１８】
上記のメモリコントローラ（１０５）において、接続される複数のプロセッサ（１０１）からの第１アドレス情報で特定されるデータの最新のものが主記憶装置（１０７）にあることを示す返信の有無を確認する障害処理部（３２２）と、複数のプロセッサ（１０１）の全てから返信を受信したことを障害処理部（３２２）が確認するまで読み出し要求を受け付けない調停部（３０５）とを備えることが好ましい。
【００１９】
上記のメモリコントローラ（１０５）において、プロセッサ（１０１）は、自身のプロセッサキャッシュ（１０２）に第１アドレス情報で特定されるデータとして最新データを有している場合、最新データをメモリコントローラ（１０５）へ出力することが好ましい。メモリコントローラ（１０５）は、主記憶装置（１０５）の第１アドレス情報において最新データに上書きする主記憶制御部（３１３）を備えることが好ましい。
【００２０】
上記のメモリコントローラ（１０５）において、ディレクトリ（１０６）から再度読み出した第１アドレス情報に対応する第２エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を格納する固定障害処理部（３２７）を備えることが好ましい。ディレクトリ（１０６）に対する第１アドレス情報に対応するデータへの読み出し要求を受けたとき、固定障害処理部（３２７）は、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を、ディレクトリ（１０６）に替わって出力することが好ましい。
【００２１】
上記課題を解決するために、本発明は、マルチプロセッサシステムの動作方法である。ここで、マルチプロセッサシステムは、主記憶装置（１０７）と、プロセッサキャッシュ（１０２）を有する複数のプロセッサ（１０１）と、複数のプロセッサ（１０１）の各々から主記憶装置（１０７）へのアクセスを制御し、プロセッサキャッシュ間のコヒーレンシを保証するメモリコントローラ（１０５）と、主記憶装置（１０７）のアドレス情報毎のキャッシュ制御状態を示すエントリ情報（２０２、２０３、２０４）を格納するディレクトリ（１０６）とを具備する。マルチプロセッサシステムの動作方法は、（ａ）メモリコントローラ（１０５）が、ディレクトリ（１０６）から読み出した第１アドレス情報に対応する第１エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１エントリ情報（２０２、２０３、２０４）を無効化する指示を複数のプロセッサ（１０１）へ出力するステップと、（ｂ）複数のプロセッサ（１０１）の各々が、プロセッサキャッシュ（１０２）の第１エントリ情報（２０２、２０３、２０４）を無効化するステップと、（ｃ）複数のプロセッサ（１０１）の各々が、第１アドレス情報で特定されるデータの最新のものが主記憶装置（１０７）にあることを示す返信をメモリコントローラ（１０５）へ出力するステップとを具備する。
【００２２】
上記のマルチプロセッサシステムの動作方法において、メモリコントローラ（１０５）は、障害処理部（３２２）と調停部（３０５）を備えることが好ましい。マルチプロセッサシステムの動作方法は、（ｄ）調停部（３０５）が、複数のプロセッサ（１０１）の全てから返信を受信したことを障害処理部（３２２）が確認するまで、読み出し要求を受け付けないステップを更に具備することが好ましい。
【００２３】
上記のマルチプロセッサシステムの動作方法において、メモリコントローラ（１０５）は、主記憶制御部（３１３）を備えることが好ましい。前記マルチプロセッサシステムの動作方法は、（ｅ）プロセッサ（１０１）が、自身のプロセッサキャッシュ（１０２）に第１アドレス情報で特定されるデータとして最新データを有している場合、最新データをメモリコントローラ（１０５）へ出力するステップと、（ｆ）主記憶制御部（３１３）が、主記憶装置（１０５）の第１アドレス情報において最新データに上書きするステップとを更に具備することが好ましい。
【００２４】
上記のマルチプロセッサシステムの動作方法において、メモリコントローラ（１０５）は、固定障害処理部（３２７）を備えることが好ましい。マルチプロセッサシステムの動作方法は、（ｇ）固定障害処理部（３２７）が、ディレクトリ（１０６）から再度読み出した第１アドレス情報に対応する第２エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を格納するステップと、（ｈ）メモリコントローラ（１０５）が、ディレクトリ（１０６）に対する第１アドレス情報に対応するデータへの読み出し要求を受けたとき、固定障害処理部（３２７）が、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を、ディレクトリ（１０６）に替わって出力するステップを更に具備することが好ましい。
【００２５】
上記課題を解決するために、本発明は、マルチプロセッサシステムの動作方法を実行するプログラムである。ここで、マルチプロセッサシステムは、主記憶装置（１０７）と、プロセッサキャッシュ（１０２）を有する複数のプロセッサ（１０１）と、複数のプロセッサ（１０１）の各々から主記憶装置（１０７）へのアクセスを制御し、プロセッサキャッシュ間のコヒーレンシを保証するメモリコントローラ（１０５）と、主記憶装置（１０７）のアドレス情報毎のキャッシュ制御状態を示すエントリ情報（２０２、２０３、２０４）を格納するディレクトリ（１０６）とを具備する。プログラムは、（ａ）メモリコントローラ（１０５）が、ディレクトリ（１０６）から読み出した第１アドレス情報に対応する第１エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１エントリ情報（２０２、２０３、２０４）を無効化する指示を複数のプロセッサ（１０１）へ出力するステップと、（ｂ）複数のプロセッサ（１０１）の各々がプロセッサキャッシュ（１０２）の第１エントリ情報（２０２、２０３、２０４）を無効化し、第１アドレス情報で特定されるデータの最新のものが主記憶装置（１０７）にあることを示す返信を出力したとき、メモリコントローラ（１０５）が、返信を受信するステップとを具備する。
【００２６】
上記のプログラムにおいて、メモリコントローラ（１０５）は、障害処理部（３２２）と調停部（３０５）とを備えることが好ましい。プログラムは、（ｃ）調停部（３０５）が、複数のプロセッサ（１０１）の全てから返信を受信したことを障害処理部（３２２）が確認するまで、読み出し要求を受け付けないステップを更に具備することが好ましい。
【００２７】
上記のプログラムにおいて、メモリコントローラ（１０５）は、主記憶制御部（３１３）を備えることが好ましい。プログラムは、（ｄ）主記憶制御部（３１３）が、プロセッサ（１０１）が自身のプロセッサキャッシュ（１０２）に第１アドレス情報で特定されるデータとして最新データを有している場合にメモリコントローラ（１０５）へ出力した最新データを、主記憶装置（１０５）の第１アドレス情報において最新データに上書きするステップとを更に具備することが好ましい。
【００２８】
上記のプログラムにおいて、メモリコントローラ（１０５）は、固定障害処理部（３２７）を備えることが好ましい。プログラムは、（ｅ）固定障害処理部（３２７）が、ディレクトリ（１０６）から再度読み出した第１アドレス情報に対応する第２エントリ情報（２０２、２０３、２０４）に異常が有る場合、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を格納するステップと、（ｆ）メモリコントローラ（１０５）が、メモリコントローラ（１０５）が、ディレクトリ（１０６）に対する第１アドレス情報に対応するデータへの読み出し要求を受けたとき、固定障害処理部（３２７）が、第１アドレス情報に対応するエントリ情報（２０２、２０３、２０４）を、ディレクトリ（１０６）に替わって出力するステップを更に具備することが好ましい。
【発明の効果】
【００２９】
本発明により、ＲＡＭで構成されるディレクトリでの訂正不可能障害から継続動作可能状態に復帰することが可能となり、ディレクトリのＲＡＭ障害が固定障害であった場合でも継続動作可能状態に復帰することが可能となる。
【発明を実施するための最良の形態】
【００３０】
以下、本発明のマルチプロセッサシステムの実施の形態に関して、添付図面を参照して説明する。図１は、本発明のマルチプロセッサシステムの実施の形態の構成の一例を示すブロック図である。マルチプロセッサシステムは、複数のプロセッサ１０１（１０１−ｉ：ｉ＝１〜ｍの自然数、以下同じ）、メモリコントローラ１０５、ディレクトリ１０６、主記憶装置１０７、システムインタフェース１０８（１０８−ｉ）を具備する。
【００３１】
この例において、マルチプロセッサシステムは、メモリコントローラ１０５と複数のプロセッサ１０１の各々とを１：１接続している。ここでは、ｍ＝４、すなわち、プロセッサ数は４個、メモリコントローラは１個である。ただし、この例は本発明を説明するにあったっての簡略化のためであり、本発明はこの個数に限定されるものではない。また、この例ではプロセッサ１０１とメモリコントローラ１０５とを１：１接続しているが、これも同様に簡略化のためであり、バス接続などの他の接続方法でも本発明を実現可能である。
【００３２】
プロセッサ１０１（１０１−ｉ）は、ＣＰＵ（Ｃｅｎｔｒａｌ  Ｐｒｏｃｅｓｓｉｎｇ  Ｕｎｉｔ）やＩ／Ｏプロセッサに例示される演算装置である。プロセッサ１０１は、ＭＥＳＩ（Ｍｏｄｉｆｉｅｄ  Ｅｘｃｌｕｓｉｖｅ  Ｓｈａｒｅｄ  Ｉｎｖａｌｉｄ）プロトコルのような一般的なキャッシュプロトコルを採用するストアイン方式のプロセッサキャッシュ（１０２−ｉ）を搭載している。プロセッサ１０１−ｉは主記憶アクセスリクエストのリクエスタになるものであり、一般的なものでよく、ここではその詳細については言及しない。
【００３３】
メモリコントローラ１０５は、プロセッサ１０１からの主記憶アクセスリクエストを処理し、プロセッサキャッシュ間コヒーレンシを保証する。メモリコントローラには、主記憶装置１０７とディレクトリ１０６とが接続されている。
【００３４】
主記憶装置１０７は、ＤＩＭＭ（Ｄｕａｌ  Ｉｎｌｉｎｅ  Ｍｅｍｏｒｙ  Ｍｏｄｕｌｅ）などで構成され、ＳＤＲＡＭ（Ｓｙｎｃｈｒｏｎｏｕｓ  ｄｙｎａｍｉｃ  ｒａｎｄｏｍ  ａｃｃｅｓｓ  ｍｅｍｏｒｙ）に例示される。
【００３５】
ディレクトリ１０６は、ＲＡＭ（Ｒａｎｄａｍ  Ａｃｃｅｓｓ  Ｍｅｍｏｒｙ）で構成される。このマルチプロセッサシステムのプロセッサキャッシュ間コヒーレンシを保証するために用いられる。主記憶装置１０７の各アドレスデータに対応するプロセッサキャッシング情報（例示：キャッシュステータス、キャッシングエージェント（後述））を保持する。ディレクトリ１０６は、主記憶装置１０７の全てのデータをプロセッサキャッシュラインサイズで管理可能なフルディレクトリ方式を実現可能な容量を備えるものである。
【００３６】
システムインタフェース１０８（１０８−ｉ）は、プロセッサ１０１（１０１−ｉ）とメモリコントローラ１０５とを接続している。プロセッサ１０１からメモリコントローラ１０５上の主記憶装置１０７への主記憶アクセスリクエスト及びそのデータリプライや、メモリコントローラ１０５からプロセッサ１０１への主記憶データのキャッシング状態問い合わせリクエスト（以降スヌープリクエスト）及びそのリプライは、このインタフェースを通じて行われる。
【００３７】
図２は、本発明のマルチプロセッサシステムにおけるディレクトリの構成を示す概略図である。このディレクトリ２０１は、図１のディレクトリ１０６と同じである。このディレクトリ２０１は、本発明のマルチプロセッサシステムがキャッシュコヒーレンシ保証方式として採用するフルディレクトリ方式を実現可能とする。そのために、ディレクトリ２０１は、メモリコントローラ１０５に接続される主記憶装置１０７をキャッシュラインサイズ単位で管理可能な容量とする。したがって、ディレクトリ２０１の１エントリで一つのキャッシュラインサイズを管理するとすると、このディレクトリ２０１の総エントリ数は、［（主記憶装置１０７の総容量）／（キャッシュラインサイズ）］となる。この計算結果を（ｎ）とすると、ディレクトリ２０１はエントリ０からエントリｎまでの（ｎ）個のエントリ（キャッシュライン）で構成されることになる。また、このディレクトリ２０１の各エントリは主記憶装置１０７に対してダイレクトにマッピングされる。すなわち主記憶アクセスリクエストのアドレスと、それに対応するディレクトリ１０７のエントリは１：１である。
【００３８】
ディレクトリ２０１の各エントリ（エントリｊ：ｊ＝０〜ｎの整数）は、主記憶装置１０７をキャッシュラインサイズ単位で管理するための情報を格納している。エントリは、キャッシュステータス２０２、キャッシングエージェント情報２０３、ＥＣＣ（Ｅｒｒｏｒ  Ｃｏｒｒｅｃｔｉｎｇ  Ｃｏｄｅ）２０４を有する。
【００３９】
ＥＣＣ２０４は、キャッシュステータス２０２、及び、キャッシュエージェント情報２０３のＥＣＣである。
【００４０】
キャッシュステータス２０２は、プロセッサ１０１が対応する主記憶データをキャッシングしているか否かを示し、「ＭＥＳＩ」のいずれかの状態を示すコードを格納する。ここで用いるＭＥＳＩプロトコルは一般的なものである。図８は、ＭＥＳＩプロトコルを説明する表である。すなわち「Ｍ」４０１は、「Ｍｏｄｉｆｉｅｄ」である。プロセッサ１０１−１〜１０１−４の中の唯一つのプロセッサ１０１（例示：１０１−ｉ１）が、主記憶データとは異なる状態でシステム唯一の最新データをプロセッサキャッシュ１０２（例示：１０２−ｉ１）内に保持していることを示す。
【００４１】
「Ｅ」４０２は「Ｅｘｃｌｕｓｉｖｅ」である。プロセッサ１０１−１〜１０１−４の中の唯一つのプロセッサ１０１（例示：１０１−ｉ１）が、主記憶と同じデータを、又は、主記憶データとは異なる状態でシステム唯一の最新データを、プロセッサキャッシュ１０２（例示：１０２−ｉ１）内に保持している可能性があることを示す。場合により、プロセッサキャッシュ１０２内にデータを保持していないこともある。このように状態が異なる可能性があるのは、「Ｅ」４０２で主記憶データをキャッシュしたプロセッサ１０１は、そのデータをプロセッサキャッシュ１０２内で更新したり、あるいはプロセッサキャッシュ１０２内データを更新する前ならば（主記憶と同じデータならば）メモリコントローラ１０５に通知することなくこれを廃棄することが許可されているためである。「Ｅ」４０２のプロセッサ１０１が主記憶装置１０７と同じ状態のデータをプロセッサキャッシュ１０２内に保持しているか、主記憶装置１０７とは異なる最新データを保持しているか、又は、データをプロセッサキャッシュ１０２内に保持していないかは、メモリコントローラ１０５からシステムインタフェース１０８を通じてスヌープリクエストを発行しない限り確認できない。
【００４２】
「Ｓ」４０３は「Ｓｈａｒｅｄ」である。プロセッサ１０１−１〜１０１−４の中の複数、又は一つのプロセッサ１０１が主記憶装置１０７と同じデータをプロセッサキャッシュ１０２内に保持している可能性があることを示す。場合により、プロセッサキャッシュ１０２内にデータを保持していないこともある。このように状態が異なる可能性があるのは、「Ｓ」４０３で主記憶データをキャッシュしたプロセッサ１０１は、そのデータ（主記憶と同じデータ）をメモリコントローラ１０５に通知することなくこれを廃棄することが許可されているためである。「Ｓ」４０３のプロセッサが主記憶装置１０７と同じ状態のデータをプロセッサキャッシュ１０２内に保持しているかは、メモリコントローラ１０５からシステムインタフェース１０８を通じてスヌープリクエストを発行しない限り確認できない。
【００４３】
「Ｉ」４０４は「Ｉｎｖａｌｉｄａｔｅ」であり、プロセッサ１０１−１〜１０１−４のいずれのプロセッサ１０１も主記憶装置１０７と同じデータをプロセッサキャッシュ１０２内に保持していないことを示す。
【００４４】
図２を参照して、キャッシングエージェント情報２０３は、キャッシュステータス２０２が「Ｍ」４０１、「Ｅ」４０２、「Ｓ」４０３の場合に、この状態でそのディレクトリ２０１のエントリに対応する主記憶データをキャッシングしているプロセッサ情報を示す。キャッシングエージェント情報２０３は、プロセッサキャッシュ１０２を搭載するプロセッサ数と同じビット数で構成される。図９は、キャッシングエージェント情報を説明する表である。例えば、キャッシングエージェント情報２０３のビット「０」５０１が“１”ならば、プロセッサ１０１−１のプロセッサキャッシュ１０２−１にディレクトリ２０１のエントリに対応する主記憶データがキャッシュされている可能性があることを示す。同様に、ビット「１」５０２が“１”ならば、プロセッサ１０１−２のプロセッサキャッシュ１０２−２にディレクトリ２０１のエントリに対応する主記憶データが保持されている可能性があることを示す。ビット「２」５０３が“１”ならば、プロセッサ１０１−３のプロセッサキャッシュ１０２−３にディレクトリ２０１のエントリに対応する主記憶データが保持されている可能性があることを示す。ビット「３」５０４が“１”ならば、プロセッサ１０１−４のプロセッサキャッシュ１０２−４にディレクトリ２０１のエントリに対応する主記憶データが保持されている可能性があることを示す。
【００４５】
ここで、キャッシュステータス２０２が「Ｍ」４０１、「Ｅ」４０２ならば、キャッシングエージェント情報２０３の中の唯一つのビットのみが“１”であることは自明である。また、「Ｓ」ならば一つ又は複数のビットが「１」となる。そして「Ｉ」ならばすべてのビットが“０”となる。
【００４６】
図１０Ａ及び図１０Ｂは、システムインタフェースで使用するリクエストと、そのリクエストによるプロセッサキャッシュステータス遷移、ディレクトリ内キャッシュステータス遷移を示す表である。
【００４７】
ここで記すリクエストのアドレス情報は、全て同一主記憶データに対するものである。図中、「Ｍ［Ａ］」という表記は、ディレクトリ１０６のキャッシュステータス２０２は「Ｍ」、キャッシングエージェント情報２０３はプロセッサＡに対応するビットのみが“１”であることを示す。また「Ｓ［Ａ＆Ｘ］」という表記は、ディレクトリ１０６のキャッシュステータス２０２は「Ｓ」、キャッシングエージェント情報２０３はプロセッサＡと「Ｘ」に対応するビットが“１”であることを示す。他の表記についても同様である。
【００４８】
また、図中、「プロセッサＸキャッシュステータス」及び「プロセッサＡキャッシュステータス」は、プロセッサＸ及びプロセッサＡ（それぞれプロセッサ１０１−１〜１０１−４のいずれか）のプロセッサキャッシュ１０２内に有するキャッシュステータスである。そのキャッシュステータスは、図２に示すキャッシュステータス２０２と同様であり、アドレス情報とデータとに対応付けられて格納されている。
【００４９】
メモリリードｆｏｒ  ｌｏａｄリクエストは、プロセッサ１０１が主記憶データをｌｏａｄしたとき、自プロセッサキャッシュ１０２にミス、すなわち自キャッシュステータスが「Ｉ」であった場合に発行されるリクエストである。
【００５０】
欄６０１、６０２、６０３、６０４は、メモリコントローラ１０５がメモリリードｆｏｒ  ｌｏａｄリクエストを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｍ［Ｘ］」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６０１、６０２、６０３、６０４のときメモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｌｏａｄリクエストの処理を一旦保留するとともに、プロセッサＸに対してスヌープｆｏｒ  ｌｏａｄリクエストを発行する。
【００５１】
ここで、スヌープｆｏｒ  ｌｏａｄリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｍ」である場合（欄６０１）、プロセッサＸキャッシュステータスは「Ｉ」に更新される。それとともに、プロセッサＸはシステムインタフェース１０８を通じてメモリコントローラ１０５に対して主記憶装置１０７を最新状態に書き戻すためのライトバックリクエストを発行する。ライトバックリクエストを受け付けたメモリコントローラ１０５は、後述の欄６２０の場合と同様、ディレクトリ内のキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｌｏａｄリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｌｏａｄリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６０９の場合と同様、これを「Ｅ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡキャッシュステータスは「Ｅ」に更新され、処理を終了する。
【００５２】
スヌープｆｏｒ  ｌｏａｄリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｅ」である場合（欄６０２）や、「Ｓ」である場合（欄６０３）はありえない。これは、ディレクトリキャッシュステータス２０２が「Ｍ」に更新されるのは、後述のメモリリードｆｏｒ  ｓｔｏｒｅリクエストの場合のみであり、メモリリードｆｏｒ  ｓｔｏｒｅリクエストを発行したプロセッサ１０１のプロセッサキャッシュ１０２は必ず「Ｍ」に更新されるためである。
【００５３】
スヌープｆｏｒ  ｌｏａｄリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｉ」である場合はありえる（欄６０４）。これはプロセッサＸが、メモリコントローラ１０５からのスヌープリクエストを受け取る前にキャッシュリプレースが発生し、ライトバックリクエストを発行した場合である。この場合プロセッサＸはキャッシュを「Ｉ」のまま更新せず、システムインタフェース１０８を通じてメモリコントローラ１０５に対してディレクトリキャッシュステータス２０２を「Ｉ」に更新するためのスヌープリプライＩを転送する。スヌープリプライＩを受け付けたメモリコントローラ１０５はディレクトリキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｌｏａｄリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｌｏａｄリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６０９の場合と同様、これを「Ｅ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｅ」に更新され、処理を終了する。
【００５４】
欄６０５、６０６、６０７は、メモリコントローラ１０５がメモリリードｆｏｒ  ｌｏａｄを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３がＥ［Ｘ］であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６０５、６０６、６０７のときメモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｌｏａｄリクエストの処理を一旦保留するとともに、プロセッサＸに対してスヌープｆｏｒ  ｌｏａｄリクエストを発行する。
【００５５】
スヌープｆｏｒ  ｌｏａｄリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｅ」である場合（欄６０５）、プロセッサＸはキャッシュステータスを「Ｓ」に更新し、システムインタフェース１０８を通じてメモリコントローラ１０５に対してディレクトリキャッシュステータス２０２を「Ｓ」にするためのスヌープリプライＳを転送する。スヌープリプライＳを受け付けたメモリコントローラ１０５はディレクトリキャッシュステータス２０２を「Ｓ」に更新し、その後、保留していたメモリリードｆｏｒ  ｌｏａｄリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｌｏａｄリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６０８の場合と同様、これを「Ｅ［Ａ＆Ｘ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｓ」に更新され、処理を終了する。
【００５６】
スヌープｆｏｒ  ｌｏａｄリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｓ」である場合（欄６０６）はありえない。これは、ディレクトリステータス２０２が「Ｅ」に更新されるのは、メモリリードｆｏｒ  ｌｏａｄリクエストあるいは再開されたメモリリードｆｏｒ  ｌｏａｄリクエストがディレクトリキャッシュステータス２０２を索引し「Ｉ」であった場合のみであり、メモリリードｆｏｒ  ｓｔｏｒｅリクエストを発行したプロセッサのキャッシュは必ず「Ｅ」に更新されるためである。そして「Ｅ」の状態から「Ｓ」の状態に遷移するのは、欄６０５の場合のように、必ず他プロセッサのメモリリードｆｏｒ  ｌｏａｄリクエストを要因とするスヌープｆｏｒ  ｌｏａｄリクエストによる場合であり、この場合、最終状態としてディレクトリキャッシュステータス２０２は「Ｓ」に遷移する。
【００５７】
スヌープｆｏｒ  ｌｏａｄリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｉ」である場合はありえる（欄６０７）。これはプロセッサＸが、メモリコントローラからのスヌープリクエストを受け取る前にキャッシュリプレースが発生した場合である。この場合プロセッサＸはキャッシュステータスを「Ｉ」のまま更新せず、システムインタフェース１０８を通じてメモリコントローラ１０５に対してディレクトリキャッシュステータス２０２を「Ｉ」に更新するためのスヌープリプライＩを転送する。スヌープリプライＩを受け付けたメモリコントローラ１０５はディレクトリキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｌｏａｄリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｌｏａｄリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６０９の場合と同様、これを「Ｅ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｅ」に更新され、処理を終了する。
【００５８】
欄６０８は、メモリコントローラ１０５がメモリリードｆｏｒ  ｌｏａｄを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｓ［Ｘ１（＆Ｘ２．．．）］」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６０８のときメモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｌｏａｄリクエストによってディレクトリキャッシュステータス２０２を「Ｓ［Ａ＆Ｘ１（＆Ｘ２．．．）］」に更新し、さらにプロセッサＡに主記憶読み出しデータをリプライする。スヌープリクエストは発行しない。メモリコントローラ１０５からの主記憶読み出しデータを受け取ったプロセッサＡのキャッシュステータスは「Ｓ」に更新され、処理を終了する。
【００５９】
欄６０９は、メモリコントローラ１０５がメモリリードｆｏｒ  ｌｏａｄを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｉ」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６０９の場合、メモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｌｏａｄリクエストによってディレクトリキャッシュステータス２０２を「Ｅ［Ａ］」に更新し、さらにプロセッサＡに主記憶読み出しデータをリプライする。スヌープリクエストは発行しない。メモリコントローラ１０５からの主記憶読み出しデータを受け取ったプロセッサＡのキャッシュステータスは「Ｅ」に更新され、処理を終了する。
【００６０】
メモリリードｆｏｒ  ｓｔｏｒｅリクエストは、プロセッサ１０１が主記憶データにｓｏｔｏｒｅしようとしたとき、自プロセッサキャッシュ１０２にミス、すなわち自キャッシュステータスが「Ｉ」、「Ｓ」、「Ｅ」の、このままでは更新不可能な状態であった場合に発行されるリクエストである。
【００６１】
欄６１０、６１１、６１２、６１３は、メモリコントローラ１０５がメモリリードｆｏｒ  ｓｔｏｒｅリクエストを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｍ［Ｘ］」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６１０、６１１、６１２、６１３のときメモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を一旦保留するとともに、プロセッサＸに対してスヌープｆｏｒ  ｓｔｏｒｅリクエストを発行する。
【００６２】
ここで、スヌープｆｏｒ  ｓｔｏｒｅリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｍ」である場合（欄６１０）、プロセッサＸキャッシュステータスは「Ｉ」に更新されるとともに、プロセッサＸはシステムインタフェース１０８を通じてメモリコントローラ１０５に対して主記憶を最新状態に書き戻すためのライトバックリクエストを発行する。ライトバックリクエストを受け付けたメモリコントローラ１０５は、後述の欄６２０の場合と同様、ディレクトリキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｓｔｏｒｅリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６１９の場合と同様、これを「Ｍ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｍ」に更新され、処理を終了する。
【００６３】
スヌープｆｏｒ  ｓｔｏｒｅリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｅ」である場合（欄６１１）や、「Ｓ」である場合（欄６１２）はありえない。これは、ディレクトリキャッシュステータス２０２が「Ｍ」に更新されるのは、メモリリードｆｏｒ  ｓｔｏｒｅリクエストの場合のみであり、メモリリードｆｏｒ  ｓｔｏｒｅリクエストを発行したプロセッサのキャッシュステータスは必ず「Ｍ」に更新されるためである。
【００６４】
スヌープｆｏｒ  ｓｔｏｒｅリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｉ」であることはありえる（６１３）。これはプロセッサＸが、メモリコントローラ１０５からのスヌープリクエストを受け取る前にキャッシュリプレースが発生し、ライトバックリクエストを発行した場合である。この場合プロセッサＸはキャッシュを「Ｉ」のまま更新せず、システムインタフェース１０８を通じてメモリコントローラ１０５に対してディレクトリキャッシュステータス２０２を「Ｉ」に更新するためのスヌープリプライＩを転送する。スヌープリプライＩを受け付けたメモリコントローラ１０５はディレクトリキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｓｔｏｒｅリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の６１９同様、これを「Ｍ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｍ」に更新され、処理を終了する。
【００６５】
欄６１４、６１５、６１６は、メモリコントローラ１０５がメモリリードｆｏｒ  ｓｔｏｒｅリクエストを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｅ［Ｘ］」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６１４、６１５、６１６のときメモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を一旦保留するとともに、プロセッサＸに対してスヌープｆｏｒ  ｓｔｏｒｅリクエストを発行する。
【００６６】
スヌープｆｏｒ  ｓｔｏｒｅリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｅ」である場合（欄６１４）、プロセッサＸはキャッシュステータスを「Ｉ」に更新し、システムインタフェース１０８を通じてメモリコントローラ１０５に対してディレクトリキャッシュステータス２０２を「Ｉ」にするためのスヌープリプライＩを転送する。スヌープリプライＩを受け付けたメモリコントローラ１０５はディレクトリキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｓｔｏｒｅリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６１９の場合と同様、これを「Ｍ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｍ」に更新され、処理を終了する。
【００６７】
スヌープｆｏｒ  ｓｔｏｒｅリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｓ」である場合（欄６１５）はありえない。これは、ディレクトリステータスが「Ｅ」に更新されるのは、メモリリードｆｏｒ  ｌｏａｄリクエストあるいは再開されたメモリリードｆｏｒ  ｌｏａｄリクエストがディレクトリキャッシュステータス２０２を索引し「Ｉ」であった場合のみであり、メモリリードｆｏｒ  ｓｔｏｒｅリクエストを発行したプロセッサのキャッシュは必ず「Ｅ」に更新されるためである。そして「Ｅ」の状態から「Ｓ」の状態に遷移するのは、欄６０５の場合のように、必ず他プロセッサのメモリリードｆｏｒ  ｌｏａｄリクエストを要因とするスヌープｆｏｒ  ｌｏａｄリクエストによる場合であり、この場合、最終状態としてディレクトリキャッシュステータス２０２は「Ｓ」に遷移する。
【００６８】
スヌープｆｏｒ  ｓｔｏｒｅリクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｉ」である場合（欄６１６）はありえる。これはプロセッサＸが、メモリコントローラ１０５からのスヌープリクエストを受け取る前にキャッシュリプレースが発生した場合である。この場合、プロセッサＸはキャッシュを「Ｉ」のまま更新せず、システムインタフェース１０８を通じてメモリコントローラ１０５に対してディレクトリキャッシュステータス２０２を「Ｉ」に更新するためのスヌープリプライＩを転送する。スヌープリプライＩを受け付けたメモリコントローラ１０５はディレクトリキャッシュステータス２０２を「Ｉ」に更新し、その後、保留していたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を再開する。再開されたメモリリードｆｏｒ  ｌｏａｄリクエストが索引するディレクトリキャッシュステータス２０２は「Ｉ」となるので、後述の欄６１９の場合と同様、これを「Ｍ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｍ」に更新され、処理を終了する。
【００６９】
欄６１７、６１８は、メモリコントローラ１０５がメモリリードｆｏｒ  ｓｔｏｒｅリクエストを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｓ［Ｘ１（＆Ｘ２．．．）］」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６１７、６１８のときメモリコントローラ１０５は、プロセッサ「Ｘ１」を初め、複数個のプロセッサが「Ｓ」である場合にはそのすべてのプロセッサに対してスヌープｆｏｒ  ｓｔｏｒｅ（Ｓ）リクエストを発行する。この場合は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｓｔｏｒｅリクエストの処理を一旦保留することはせず、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３を「Ｍ［Ａ］」に更新し、更にプロセッサＡに主記憶読み出しデータをリプライする。これを受け取ったプロセッサＡのキャッシュステータスは「Ｍ」に更新される。
【００７０】
上記メモリコントローラ１０５の処理と並行して、スヌープｆｏｒ  ｓｔｏｒｅ（Ｓ）リクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｓ」であった場合（欄６１７）、プロセッサＸキャッシュステータスは「Ｉ」に更新される。この場合、プロセッサＸはスヌープリプライを転送せず、処理を終了する。
【００７１】
上記メモリコントローラ１０５の処理と並行して、スヌープｆｏｒ  ｓｔｏｒｅ（Ｓ）リクエストによる索引の結果、プロセッサＸキャッシュステータスが「Ｉ」であった場合（欄６１８）、プロセッサＸキャッシュステータスは「Ｉ」のまま更新されない。この場合、プロセッサＸはスヌープリプライを転送せず、処理を終了する。
【００７２】
欄６１９は、メモリコントローラ１０５がメモリリードｆｏｒ  ｓｔｏｒｅを受け付けたとき、ディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３が「Ｉ」であった場合のディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。欄６１９のときメモリコントローラ１０５は、プロセッサＡから受け付けたメモリリードｆｏｒ  ｓｔｏｒｅリクエストによってディレクトリキャッシュステータス２０２を「Ｍ［Ａ］」に更新し、さらにプロセッサＡに主記憶読み出しデータをリプライする。スヌープリクエストは発行しない。メモリコントローラ１０５からの主記憶読み出しデータを受け取ったプロセッサＡのキャッシュステータスは「Ｍ」に更新され、処理を終了する。
【００７３】
ライトバックリクエストは、プロセッサが新たなデータをキャッシングしようとするたキャッシュに空きがない場合、あるアルゴリズムに従って、キャッシュ内に「Ｍ」で格納されているデータを主記憶に書き戻す際に発行されるリクエストである。
【００７４】
欄６２０は、メモリコントローラ１０５がライトバックリクエストを受け付けたときのディレクトリキャッシュステータス２０２、プロセッサキャッシュステータス、システムインタフェースリクエストの動きを示すものである。このときディレクトリキャッシュステータス２０２／キャッシングエージェント情報２０３は必ず「Ｍ［Ａ］」であるので、ディレクトリを索引する必要はなく、直接ディレクトリキャッシュステータス２０２を「Ｉ」に更新し、ライトバックリクエストに付与されるデータを主記憶装置１０７へ書き戻し処理を終了する。
【００７５】
図３〜図７は、本発明のマルチプロセッサシステムにおけるメモリコントローラ内のディレクトリ制御部の構成を示すブロック図である。図３はディレクトリ制御部４００の全体図であり、図４〜図７はその一部の詳細図である。
【００７６】
図４を参照して、プロセッサ間インタフェース３００ａは、プロセッサ間インタフェース入力部３０１、コマンドデコーダ３０２、リードリクエストバッファ３０３、ライトバックリクエストバッファ３０４を備える。
【００７７】
プロセッサ間インタフェース入力部３０１は、プロセッサ１０１とメモリコントローラ１０５とを接続するインタフェースである。プロセッサ間インタフェース入力部３０１は、プロセッサ１０１からのメモリアクセスリクエスト、及びメモリコントローラ１０５から各プロセッサ１０１に発行したキャッシュスヌープリクエストに対するリプライを受け付ける。コマンドデコーダ３０２は、プロセッサ間インタフェース３００ａで受信されたリクエスト、リプライを判別し、リードリクエストバッファ３０３とライトバックリクエストバッファ３０４に振り分けるデコーダである。リードリクエストバッファ３０３は、プロセッサ１０１からのメモリアクセスリクエストのうち、主記憶リードリクエストを格納するバッファである。ライトバックリクエストバッファ３０４は、プロセッサ１０１からのメモリアクセスリクエストのうち、プロセッサ１０１のキャッシュデータを主記憶装置１０７に書き戻すライトバックリクエストと、メモリコントローラ１０５が発行したキャッシュスヌープリクエストに対するスヌープリプライを格納するバッファである。
【００７８】
図３を参照して、調停回路３０５は、リードリクエストバッファ３０３で受信したリクエストやリプライ、ライトバックリクエストバッファ３０４で受信したリクエストやリプライ、ディレクトリ索引後のディレクトリ更新リクエスト（後述）、及び、ディレクトリ固定障害検出のためのディレクトリチェックリクエスト（後述）の中から、ディレクトリ制御部４００で処理するリクエスト、リプライをひとつ選択する。
【００７９】
コマンド／アドレスレジスタ３０７は、調停回路３０５で選択したリードリクエスト、ライトバックリクエスト、リプライのコマンド情報、アドレス情報を保持するためのレジスタである。このレジスタの情報は、ディレクトリ索引、更新、主記憶リード、更新の各々において使用される。
【００８０】
データ生成回路３０６は、調停回路３０５で選択したライトバックリクエスト、スヌープリプライ、ディレクトリ索引後のディレクトリ更新リクエスト（後述）によってディレクトリを更新する際に、ディレクトリ書き込みデータを生成する。ディレクトリ書き込みデータレジスタ３０８は、生成されたディレクトリ書き込みデータを保持する。
【００８１】
主記憶書き込みデータレジスタ３２８は、ライトバックリクエストデータ、すなわち主記憶更新データを保持するである。
【００８２】
ディレクトリ３０９は、プロセッサキャッシュ間コヒーレンシを保証するための情報を保持するディレクトリである。その内部情報は、図２で示したとおりである。すなわち、ディレクトリ３０９は、ディレクトリ２０１であり、ディレクトリ１０６である。障害検出回路３１０は、ディレクトリ３０９から読み出したデータのＥＣＣチェックを行い、訂正可能障害検出時にはデータ訂正を行い、訂正不可能障害時にはこれをディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１および訂正不可能障害処理部３２２へ通知する。
【００８３】
ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１は、プロセッサ１０１からのリードリクエストによってディレクトリ３０９を索引した結果、いずれかのプロセッサキャッシュ１０２にデータが存在することが判明した場合、図１０Ａ及び図１０Ｂに従い、ディレクトリ更新リクエストを生成し信号線３２１により調停回路３０５にディレクトリ索引後のディレクトリ更新リクエストを発行したり、信号線３２３によりプロセッサキャッシュスヌープリクエストバッファ３１５にキャッシュスヌープリクエストを発行したりする。特に本発明では、障害検出回路３１０でディレクトリ３０９の訂正不可能障害を検出した場合にもプロセッサキャッシュスヌープリクエスト生成を行う。
【００８４】
セレクタ３１２は、ディレクトリ３０９情報を使用するか、ディレクトリ固定障害処理部３２７情報を使用するかを選択する回路である。
【００８５】
主記憶制御部３１３は、プロセッサ１０１からのメモリアクセスリクエスト種別およびディレクトリ索引結果により主記憶アクセスを制御する。主記憶装置３１４は主記憶装置１０７である。
【００８６】
図５を参照して、プロセッサ間インタフェース３００ｂは、プロセッサキャッシュスヌープリクエストバッファ３１５、リプライデータバッファ３１６、調停回路３１７、プロセッサ間インタフェース出力部３１８を備える。
【００８７】
プロセッサキャッシュスヌープリクエストバッファ３１５は、ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１で生成されたプロセッサキャッシュスヌープリクエストを格納し、プロセッサ間システムインタフェース出力部３１８に転送するためのバッファである。リプライデータバッファ３１６は、プロセッサ１０１からのメモリリードリクエストに対してプロセッサ１０１に返却するディレクトリ索引情報、主記憶データリプライを格納し、プロセッサ間システムインタフェース出力部３１８に転送する。調停回路３１７は、プロセッサキャッシュスヌープリクエストバッファ３１５とリプライデータバッファ３１６内のリクエスト、リプライのうち、プロセッサ間インタフェース出力部３１８に転送するリクエスト、リプライを選択する。プロセッサ間インタフェース出力部３１８は、プロセッサ１０１とメモリコントローラ１０５とを接続するシステムインタフェース１０８に調停回路３１７で選択したリクエスト、リプライを出力するための回路である。
【００８８】
図６を参照して、訂正不可能障害処理部３２２は、レジスタ３１９、カウンタレジスタ３２０を備える。
【００８９】
レジスタ３１９は、障害検出回路３１０でディレクトリ３０９データの訂正不可能障害を検出した際に点灯し、本発明のためのディレクトリ訂正不可能障害救済処理中であることを示す。カウンタレジスタ３２０は、障害検出回路３１０でディレクトリ３０９データの訂正不可能障害を検出した際に、本発明のマルチプロセッサシステム内に存在するプロセッサキャッシュ個数を格納する。本発明において訂正不可能障害検出時に、ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１で生成され全プロセッサに転送するプロセッサキャッシュスヌープリクエストに対するスヌープリプライを調停回路３０５で受け取るたびに１減算するカウンタレジスタである。このカウンタレジスタ値が０でない場合、本発明の障害救済処理のためのスヌープリプライ待ち合わせ状態であることを示す。
【００９０】
図７を参照して、ディレクトリ固定障害処理部３２７は、レジスタ３２４、固定障害エントリ情報レジスタ３２５、固定障害ディレクトリ情報レジスタ３２６を備える。
【００９１】
レジスタ３２４は、訂正不可能障害処理部３２２で全スヌープリプライ受付後に行う、ディレクトリ固定障害確認リクエストによるディレクトリ索引で、訂正不可能障害が検出された場合に点灯する。このレジスタが「１」の場合、訂正不可能障害が検出されたディレクトリ３０９のエントリ情報は今後無視され、固定障害ディレクトリ情報レジスタ３２６（後述）の値が使用されることを示す。固定障害エントリ情報レジスタ３２５は、上記固定障害が検出されたディレクトリ３０９のエントリ情報を保持する。コマンド／アドレスレジスタ３０７にメモリアクセスリクエスト、スヌープリプライが存在し、レジスタ３２４が「１」でかつコマンドアドレスレジスタ３０７のアドレス情報が固定障害エントリレジスタ情報と一致する場合、ディレクトリ情報としてディレクトリ３０９データではなく、固定障害ディレクトリ情報レジスタ３２６データ（後述）が使用される。固定障害ディレクトリ情報レジスタ３２６は、上記固定障害が検出されたディレクトリ３０９エントリに対応するディレクトリ情報を保持する。
【００９２】
次に、本発明のマルチプロセッサシステムの実施の形態の動作について説明する。図１１は、本発明のマルチプロセッサシステムの実施の形態の動作を示すフローチャートである。
【００９３】
メモリコントローラ１０５は、プロセッサ間インタフェース入力部３０１からメモリリードリクエストを受け付けた場合、コマンドデコーダ３０２でこのメモリリードリクエストをデコードする。その後、リードリクエストバッファ３０３にリードリクエストを格納する（Ｓ０１）。
【００９４】
調停回路３０５は、このリードリクエストを選択し、コマンド／アドレスレジスタ３０７に格納する。その後、ディレクトリ３０９から、リクエストアドレスに該当するエントリ情報を読み出す（Ｓ０２）。ここで、エントリ情報は、リクエストアドレスに対応する図２に示すエントリ番号のプロセスキャッシング情報（キャッシュステータス２０２、キャッシングエージェント情報２０３、ＥＣＣ２０４）である。
【００９５】
障害検出回路１０は、エントリ情報が正常か否かを、例えばＥＣＣ２０４により検査する（Ｓ０３）。そして、ディレクトリ３０９からの読み出しデータに障害がない場合（Ｓ０３：Ｙｅｓ）、読み出しデータをディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１に送る。ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１は、エントリ情報に基づいて、図１０Ａ及び図１０Ｂに従い、信号線３２１を介してディレクトリ索引後のディレクトリ更新リクエストを調停回路３０５へ発行する。それにより、データ生成回路３０６及びディレクトリ書き込みデータレジスタ３０８を介して、ディレクトリ３０９が適切に更新される（Ｓ０４）。
【００９６】
また、コマンド／アドレスレジスタ３０７からのリードリクエストに基づいて、主記憶制御部３１３は、主記憶装置３１４のデータを読み出し、プロセッサ間インターフェース部３００ｂへ出力する。プロセッサ間インタフェース出力部３１８は、リプライデータバッファ３１６及び調停回路３１７を介して受信した主記憶データを、メモリリードリクエストを発行したプロセッサ１０１へ転送する（Ｓ０５）。
【００９７】
ディレクトリ３０９からの読み出しデータに障害がある場合（Ｓ０３：Ｎｏ）、特に障害検出回路３１０で訂正不可能を検出した場合、従来は、その時点でプロセッサキャッシュコヒーレンシ保証が不可能となるためシステム停止としていた。
【００９８】
本発明では、そのような場合でも、以下のようにして対応可能である。すなわち、ディレクトリ３０９からの読み出しデータについて障害検出回路３１０で訂正不可能障害を検出した場合（Ｓ０３：Ｎｏ）、ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１は、図１０Ａ及び図１０Ｂ中のコマンド（「ｆｒｏｍメモリコントローラｔｏプロセッサＸ」欄）にあるスヌープリクエストｆｏｒ  ｓｔｏｒｅを発行する（Ｓ０６）。マルチプロセッサシステム内全プロセッサに対し該当エントリ情報の無効化を指示するためである。これにより、後述されるように、全プロセッサキャッシュ１０２のプロセッサＸキャッシュステータスが「Ｉ」に更新されると共に、プロセッサＸキャッシュステータスが「Ｍ」のプロセッサ１０１が存在する場合、そのデータがライトバックリクエストによって主記憶装置３１４へ書き戻される。
【００９９】
また、これと並行して本発明のディレクトリ障害救済処理中であることを示すレジスタ３１９を“１”に設定し、カウンタレジスタ３２０に、本発明のマルチプロセッサシステム内の全プロセッサキャッシュ個数の値、すなわち上記スヌープリクエストｆｏｒ  ｓｔｏｒｅを発行した個数と同じ値を設定する（Ｓ０７）。そしてこのカウンタレジスタ３２０の値が０でない間は、これを調停回路３０５に通知し、リードリクエストバッファ３０３を選択することを停止する。これは、後続のリードリクエストバッファ３０３内リクエストを選択し、そのリクエストでも訂正不可能障害が検出されることにより本発明の障害処理が複雑化することを避けるためである。
【０１００】
ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部３１１で生成されたスヌープリクエストｆｏｒ  ｓｔｏｒｅは、プロセッサキャッシュスヌープリクエストバッファ３１５、調停回路３１７、プロセッサ間インタフェース出力部３１８を介して全プロセッサ１０１に発行される。
【０１０１】
上記のスヌープリクエストｆｏｒ  ｓｔｏｒｅを受け取った各プロセッサ１０１は、図１０Ａ及び図１０Ｂ中の通常のスヌープリクエストｆｏｒ  ｓｔｏｒｅを受け取った場合と同じ動き（スヌープリプライ）を行う。すなわち、プロセッサＸキャッシュステータスが「Ｍ」のプロセッサは、欄６１０の場合と同様、キャッシュステータスを「Ｉ」に更新し、スヌープリプライとして主記憶データ書き戻しのためのライトバックリクエストを発行する。プロセッサキャッシュステータスが「Ｅ」、「Ｓ」のプロセッサは、それぞれ欄６１４、６１７の場合と同様、キャッシュステータスを「Ｉ」に更新し、スヌープリプライとしてスヌープリプライＩを発行する。プロセッサキャッシュステータスが「Ｉ」のプロセッサは、欄６１３の場合と同様、キャッシュステータスは「Ｉ」のまま更新を行わず、スヌープリプライとしてスヌープリプライＩを発行する。
【０１０２】
このように全てのプロセッサが必ずライトバックリクエストまたはスヌープリプライＩを発行するため、どのような場合でも本発明の訂正不可能障害救済処理完了後のディレクトリ３０９のステータスは「Ｉ」であると言える。そして、そのステータスが示すとおり主記憶装置３１４のデータがシステム内で唯一の最新データであることも保証できる。
【０１０３】
プロセッサ間インターフェース入力部３０１は、上記ライトバックリクエスト、スヌープリプライＩを受け取る（Ｓ０８）。ライトバックリクエストバッファ３０４は、上記ライトバックリクエスト、スヌープリプライＩを格納する。
【０１０４】
プロセッサキャッシュ１０２が「Ｍ」であった場合、プロセッサ１０１は欄６０１に従ってライトバックリクエストを生成する。そのライトバックリクエストは、ライトバックリクエストバッファ３０４に格納される。調停回路３０５は、そのライトバックリクエストのうち、コマンド／アドレスをコマンド／アドレスレジスタ３０７へ格納し、データをディレクトリ書き込みデータレジスタ３０８に格納する。ディレクトリ３０９は、そのコマンド／アドレスに基づいて、ステータス情報を「Ｉ」とし、エージェント情報を、どのプロセッサキャッシュ１０２もキャッシングしていないことを示す「Ａｌｌ＿０」とする（Ｓ０９）。また、調停回路３０５は、そのライトバックリクエストを主記憶書込データレジスタ３２８に格納する。主記憶制御部３１３は、そのライトバックリクエストに基づいて、主記憶装置３１４にライトバックデータを書き込む。
【０１０５】
プロセッサキャッシュ１０２が「Ｍ以外」であった場合、プロセッサ１０１は欄６０４に従ってスヌープリプライＩを生成する。そのスヌープリプライＩは、ライトバックリクエストバッファ３０４に格納される。調停回路３０５は、そのスヌープリプライＩのうち、コマンド／アドレスをコマンド／アドレスレジスタ３０７へ格納する。ディレクトリ３０９は、そのコマンド／アドレスに基づいて、ステータス情報を「Ｉ」とし、エージェント情報を、どのプロセッサキャッシュ１０２もキャッシングしていないことを示す「Ａｌｌ＿０」とする（Ｓ０９）。
【０１０６】
マルチプロセッサシステム内のプロセッサの個数により、上記のディレクトリ更新は複数回行われる。しかし、どれも同じ情報を書き込むので特に問題ない。また、「Ｍ」のキャッシュはシステム内に最高１つなので、主記憶への書き込みは０回あるいはただ１回のみ行われる。
【０１０７】
上記ライトバックリクエスト、スヌープリプライＩが調停回路３０５を通過するたびに調停回路３０５は、訂正不可能障害処理部３２２にこの旨を通知し、訂正不可能障害処理部３２２内のカウンタレジスタ３２０はそのたびに１ずつ減算を実施する。
【０１０８】
このようにして全プロセッサに発行した本発明のためのスヌープリクエストｆｏｒ  ｓｏｔｒｅに対するライトバックリクエストまたはスヌープリプライＩを全て受け付けると、本発明の障害処理中であることを示すレジスタ３１９は“１”、カウンタレジスタ３２０は「Ａｌｌ＿０」、ディレクトリ３０９の障害エントリのディレクトリキャッシュステータス２０２は「Ｉ」、キャッシングエージェント情報２０３は「Ａｌｌ＿０」、主記憶３１４のディレクトリ３０９障害検出エントリに対応するアドレスのデータはシステム内で唯一最新、という状態となる。
【０１０９】
ディレクトリ３０９の障害が間欠障害である場合、ここまででマルチプロセッサシステム内唯一の最新データのある場所と、ディレクトリ情報とが一致している、マルチプロセッサシステムとしてプロセッサキャッシュ間コヒーレンシ制御可能な状態に復帰した、と言える。
【０１１０】
本発明は、更にディレクトリ３０９の障害が固定障害である場合にも備えている。
【０１１１】
上記のとおり障害状態からの復旧が完了したならば、すなわち、本発明の障害処理中であることを示すレジスタ３１９は「１」、カウンタレジスタ３２０は「Ａｌｌ＿０」の状態となったならば、本発明の訂正不可能障害救済処理に移入する原因となったディレクトリ３０９の障害が間欠障害か、固定障害かを確認する（Ｓ１０）。そのために、信号線３２９により調停回路３０５にディレクトリ固定障害検出のためのディレクトリチェックリクエストを兼ねてプロセッサ１０１からのリクエストを再実行しリクエストを発行する。このリクエストは通常のリードリクエストと同様に動作し、すなわち、ディレクトリ３０９にて先に障害を検出したエントリデータを読み出す。また、通常のリードリクエストと同様に主記憶装置３１４のデータも読み出す。
【０１１２】
ここで、障害検出回路３１０で障害を検出しなかった場合、間欠障害であったと判断する（Ｓ１０：Ｎｏ）。その場合、通常のリードリクエスト同様に主記憶装置３１４から読み出したデータをリクエスト発行元のプロセッサへ返却し、本発明の訂正不可能障害救済処理を全て完了する。
【０１１３】
障害検出回路３１０で障害を検出した場合、固定障害であると判断する（Ｓ１０：Ｙｅｓ）。その場合、障害検出回路３１０は、ディレクトリ固定障害処理部３２７のレジスタ３２４が“１”であるか否かを判定する（Ｓ１１）。すなわち、ディレクトリ３０９の別のエントリの固定障害で既にディレクトリ固定障害処理部３２７が未使用か否かを判定する。
【０１１４】
ディレクトリ固定障害処理部３２７のレジスタ３２４が“１”（使用中）の場合（Ｓ１１：Ｎｏ）、すなわちディレクトリ３０９の別のエントリの固定障害で既にディレクトリ固定障害処理部３２７が使用されていた場合、救済不可能障害となり、システムを停止する（Ｓ１２）。
【０１１５】
ディレクトリ固定障害処理部３２７のレジスタ３２４が“０”（未使用）の場合（Ｓ１１：Ｙｅｓ）、障害検出回路３１０は、ディレクトリ固定障害処理部３２７のレジスタ３２４を“１”に設定し、コマンド／アドレスレジスタ３０７のアドレス情報を固定障害エントリ情報レジスタ３２５に設定し、対応するデータは主記憶装置３１４のみに存在することを示す情報、すなわちディレクトリキャッシュステータス２０２「Ｉ」、キャッシングエージェント情報２０３「Ａｌｌ＿０」を固定障害ディレクトリ情報レジスタ３２６に設定する（Ｓ１３）。
【０１１６】
ディレクトリ固定障害処理部３２７が有効、すなわちレジスタ３２４を“１”に設定後、固定障害エントリ情報３２５と同じアドレスのメモリアクセスリクエストをコマンド／アドレスレジスタ３０７に受け付けた場合、ディレクトリ索引指示に対してはセレクタ３１２をディレクトリ障害処理部３２７側に切り替え、ディレクトリ３０９データではなく、固定障害ディレクトリ情報レジスタ３２６のデータを使用する。また、ディレクトリ更新指示に対しては固定障害ディレクトリ情報レジスタ３２６の値を更新する。そして通常のリードリクエスト同様に主記憶装置３１４から読み出したデータをリクエスト発行元のプロセッサへ返却し、処理を終了する。
【０１１７】
こうすることで、ディレクト３０９に固定障害が発生した場合でも、外部に用意したレジスタをあたかもディレクトリ３０９の１エントリのように使用することで、システムの継続運用を可能に出来る。
【０１１８】
ディレクトリで訂正不可能障害を検出した場合には、システム内全プロセッサにキャッシュ無効化指示を発行することにより主記憶内データを最新にし、ディレクトリキャッシュステータス２０２を必ず「Ｉ」とすることでディレクトリキャッシュステータス２０２とシステム内唯一の最新データのありかを一致させ、訂正不可能障害から継続動作可能状態に復帰する。またディレクトリ障害が固定障害であった場合は、ディレクトリの固定障害エントリをディレクトリとは別に用意するレジスタで代替することにより可用性を高めることが出来る
【０１１９】
本発明は上記各実施の形態に限定されず、本発明の技術思想の範囲内において、各実施例は適宜変形又は変更され得ることは明らかである。
【図面の簡単な説明】
【０１２０】
【図１】図１は、本発明のマルチプロセッサシステムの実施の形態の構成の一例を示すブロック図である。
【図２】図２は、本発明のマルチプロセッサシステムにおけるディレクトリの構成を示す概略図である。
【図３】図３は、本発明のマルチプロセッサシステムにおけるメモリコントローラ内のディレクトリ制御部の全体の構成を示すブロック図である。
【図４】図４は、本発明のマルチプロセッサシステムにおけるメモリコントローラ内のディレクトリ制御部の一部の構成を示すブロック図である。
【図５】図５は、本発明のマルチプロセッサシステムにおけるメモリコントローラ内のディレクトリ制御部の一部の構成を示すブロック図である。
【図６】図６は、本発明のマルチプロセッサシステムにおけるメモリコントローラ内のディレクトリ制御部の一部の構成を示すブロック図である。
【図７】図７は、本発明のマルチプロセッサシステムにおけるメモリコントローラ内のディレクトリ制御部の構成を示すブロック図である。
【図８】図８は、ＭＥＳＩプロトコルを説明する表である。
【図９】図９は、キャッシングエージェント情報を説明する表である。
【図１０Ａ】図１０Ａは、システムインタフェースで使用するリクエストと、そのリクエストによるプロセッサキャッシュステータス遷移、ディレクトリ内キャッシュステータス遷移を示す表である。
【図１０Ｂ】図１０Ｂは、システムインタフェースで使用するリクエストと、そのリクエストによるプロセッサキャッシュステータス遷移、ディレクトリ内キャッシュステータス遷移を示す表である。
【図１１】図１１は、本発明のマルチプロセッサシステムの実施の形態の動作を示すフローチャートである。
【符号の説明】
【０１２１】
１０１（１０１−ｉ：ｉ＝１〜ｍの自然数、以下同じ）    プロセッサ
１０５    メモリコントローラ
１０６、２０１    ディレクトリ
１０７    主記憶装置
１０８（１０８−ｉ）    システムインタフェース
２０２    キャッシュステータス
２０３    キャッシングエージェント情報
２０４    ＥＣＣ
３００ａ、    プロセッサ間インタフェース
３００ｂ    プロセッサ間インタフェース
３０１    プロセッサ間インタフェース入力部
３０２    コマンドデコーダ
３０３    リードリクエストバッファ
３０４    ライトバックリクエストバッファ
３０５    調停回路
３０６    データ生成回路
３０７    コマンド／アドレスレジスタ
３０８    ディレクトリ書き込みデータレジスタ
３０９    ディレクトリ
３１０    障害検出回路
３１１    ディレクトリ更新／プロセッサキャッシュスヌープリクエスト生成部
３１２    セレクタ
３１３    主記憶制御部
３１４    主記憶装置
３１５    プロセッサキャッシュスヌープリクエストバッファ
３１６    リプライデータバッファ
３１７    調停回路
３１８    プロセッサ間システムインタフェース出力部
３１９    レジスタ
３２０    カウンタレジスタ
３２１、３２３、３２９    信号線
３２２  訂正不可能障害処理部
３２４    レジスタ
３２５    固定障害エントリ情報レジスタ
３２６    固定障害ディレクトリ情報レジスタ
３２７    ディレクトリ固定障害処理部
３２８    主記憶書き込みデータレジスタ
４００    ディレクトリ制御部
４０１    「Ｍ」
４０２    「Ｅ」
４０３    「Ｓ」
４０４    「Ｉ」
５０１    「０」
５０２    「１」
５０３    「２」
５０４    「３」
６０１〜６２０    欄
【図１】
2008046701.tif 000003
【図２】
2008046701.tif 000004
【図３】
2008046701.tif 000005
【図４】
2008046701.tif 000006
【図５】
2008046701.tif 000007
【図６】
2008046701.tif 000008
【図７】
2008046701.tif 000009
【図８】
2008046701.tif 000010
【図９】
2008046701.tif 000011
【図１０Ａ】
2008046701.tif 000012
【図１０Ｂ】
2008046701.tif 000013
【図１１】
2008046701.tif 000014