(57)【要約】【課題】使用許可された共有メモリの単位領域のうち、障害が発生した情報処理装置や障害が発生したアプリケーションが使用していた単位領域へのアクセスの停止及び再開の処理を行いつつ、正常な情報処理装置や正常なアプリケーションが、障害が発生した情報処理装置や障害が発生したアプリケーションが使用していない単位領域を継続利用可能にすること。【解決手段】ホームノードのセグメント情報通知部７２が、正常な各リモートノードに異常ノードが使用していた共有メモリ４３のセグメント番号を通知して、セグメント単位で一時的にアクセスの停止を指示する。そして、メモリアクセストークン設定部７５が、異常ノードが使用していた共有メモリセグメントに対応するメモリトークンレジスタに新しいトークンを設定し、正常な各リモートノードに新しいトークンを通知する。そして、アクセス再開部７６が、正常な各リモートノードにアクセス再開を通知する。【選択図】図３
2017111750.tif 000002
【特許請求の範囲】
【請求項１】
複数の他の情報処理装置とともに情報処理システムを構築し、該複数の他の情報処理装置からアクセスされる共有メモリを有する情報処理装置において、
前記共有メモリのそれぞれの単位領域と単位領域毎に使用許可を受けた情報処理装置を対応付ける管理情報を記憶する管理情報記憶部と、
前記共有メモリの単位領域毎にアクセスの認証制御に用いる認証情報を記憶する認証情報記憶部と、
前記複数の他の情報処理装置のうち異常が検出された異常情報処理装置が使用していた停止対象領域へのアクセスの停止指示を、前記管理情報に基づいて、該異常情報処理装置を除く他の情報処理装置に通知する第１の通知部と、
前記停止対象領域の各単位領域に対応する認証情報記憶部に新しい認証情報を設定する設定部と、
前記第１の通知部により前記停止指示が通知された情報処理装置に前記新しい認証情報とアクセスの再開指示を通知する第２の通知部と
を有することを特徴とする情報処理装置。
【請求項２】
前記設定部が前記認証情報記憶部に新しい認証情報を設定する前に前記停止対象領域に対してキャッシュフラッシュを実行するフラッシュ実行部をさらに有することを特徴とする請求項１に記載の情報処理装置。
【請求項３】
前記第１の通知部は、前記停止対象領域へのアクセスの停止指示を、前記異常情報処理装置を除く他の情報処理装置で動作するアプリケーションのうち該停止対象領域の各単位領域のいずれかを使用するアプリケーションに通知し、
前記第２の通知部は、前記第１の通知部により前記停止指示が通知されたアプリケーションに前記新しい認証情報とアクセスの再開指示を通知することを特徴とする請求項１又は２に記載の情報処理装置。
【請求項４】
前記異常情報処理装置は、動作するアプリケーションに異常が発生した情報処理装置であることを特徴とする請求項１、２又は３に記載の情報処理装置。
【請求項５】
複数の他の情報処理装置とともに情報処理システムを構築し、該複数の他の情報処理装置からアクセスされる共有メモリを有する情報処理装置による共有メモリ管理方法において、
前記共有メモリのそれぞれの単位領域と単位領域毎に使用許可を受けた情報処理装置を対応付ける管理情報に基づいて、
前記複数の他の情報処理装置のうち異常が検出された異常情報処理装置が使用していた停止対象領域へのアクセスの停止指示を、該異常情報処理装置を除く他の情報処理装置に通知し、
前記停止対象領域の各単位領域に対応する認証情報を新しい認証情報に更新し、
前記停止指示を通知した情報処理装置に前記新しい認証情報とアクセスの再開指示を通知する
ことを特徴とする共有メモリ管理方法。
【請求項６】
複数の他の情報処理装置とともに情報処理システムを構築し、該複数の他の情報処理装置からアクセスされる共有メモリを有する情報処理装置で実行される共有メモリ管理プログラムにおいて、
前記共有メモリのそれぞれの単位領域と単位領域毎に使用許可を受けた情報処理装置を対応付ける管理情報に基づいて、
前記複数の他の情報処理装置のうち異常が検出された異常情報処理装置が使用していた停止対象領域へのアクセスの停止指示を、該異常情報処理装置を除く他の情報処理装置に通知し、
前記停止対象領域の各単位領域に対応する認証情報を新しい認証情報に更新し、
前記停止指示を通知した情報処理装置に前記新しい認証情報とアクセスの再開指示を通知する
処理を前記情報処理装置に実行させることを特徴とする共有メモリ管理プログラム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置、共有メモリ管理方法及び共有メモリ管理プログラムに関する。
【背景技術】
【０００２】
近年、複数の情報処理装置をクロスバースイッチ等で接続した情報処理システムが利用されている。各情報処理装置は、複数のＣＰＵ（Central  Processing  Unit）、メモリ、ＨＤＤ（Hard  Disk  Drive）等を有し、クロスバースイッチ等を介して他の情報処理装置と通信を行う。また、各情報処理装置が有するメモリには、自装置だけがアクセス可能なローカルメモリと他の情報処理装置がアクセス可能な共有メモリがある。
【０００３】
共有メモリについては、他の情報処理装置からのアクセスの許可を制御する技術としてアクセストークンを用いる技術が開発されている。各情報処理装置は、共有メモリの所定の大きさの単位領域毎にメモリトークンと呼ばれるキーをレジスタに記憶し、キーをアクセストークンとして指定した情報処理装置だけに対応する単位領域へのアクセスを許可する。そして、共有メモリを利用する他の情報処理装置に障害が発生すると、共有メモリを有する情報処理装置は、新たなメモリトークンをレジスタに記憶する。そして、共有メモリを有する情報処理装置は、新たなメモリトークンを障害が発生した情報処理装置に送信する。しかしながら、障害が発生した情報処理装置は新たなメモリトークンを受信できないため、共有メモリにアクセスしてもメモリトークンが不一致となる。それゆえ、障害が発生した情報処理装置からの共有メモリへのアクセスを防ぐことができる。
【０００４】
また、共用資源のアクセスに関して、以下のような従来技術がある。システム上のノードと資源からなる新しい構成毎に、新しいメンバシップ・リストを生成し、それに基づいて、それが存在する時期と相関関係にあるメンバシップを明確に識別する新しいエポック番号を生成する。エポック番号に基づく制御キーが生成され、システム上の各資源制御装置及びノードで格納される。あるノードの障害が発生したものと識別されると、それはメンバシップ・リストから除去され、新しいエポック番号と制御キーが生成される。ノードが資源に対してアクセス要求を送ると、資源制御装置は、ローカルに格納されたその制御キーと、ノードで格納された制御キー（アクセス要求とともに伝送されたもの）とを比較する。２つのキーが一致した場合のみ、アクセス要求が実行される。
【先行技術文献】
【特許文献】
【０００５】
【特許文献１】特開２０１３−１４０４４６号公報
【特許文献２】特開平９−２３７２２６号公報
【発明の概要】
【発明が解決しようとする課題】
【０００６】
しかし、共有メモリを利用するある情報処理装置に障害が発生した場合に、アクセストークンの再設定のために共有メモリ全体に対するアクセスの一時的な停止が行われる。そのため、障害が発生した情報処理装置を除く他の正常な情報処理装置が、共有メモリのうち障害が発生した情報処理装置がアクセスする領域とは異なる領域へのアクセスを行いたい場合であっても、共有メモリ全体に対するアクセスの停止及び再開の処理により、アクセスが中断してしまうという問題がある。
【０００７】
本発明は、１つの側面では、正常な情報処理装置や正常なアプリケーションに対して、使用許可された共有メモリの単位領域のうち、障害が発生した情報処理装置や障害が発生したアプリケーションが使用していた単位領域へのアクセスの停止及び再開の処理を行いつつ、正常な情報処理装置や正常なアプリケーションが、障害が発生した情報処理装置や障害が発生したアプリケーションが使用していない単位領域を継続利用可能にすることを目的とする。
【課題を解決するための手段】
【０００８】
１つの態様では、情報処理装置は、複数の他の情報処理装置とともに情報処理システムを構築し、該複数の他の情報処理装置からアクセスされる共有メモリを有する。前記情報処理装置は、前記共有メモリのそれぞれの単位領域と単位領域毎に使用許可を受けた情報処理装置を対応付ける管理情報を記憶する管理情報記憶部を有する。前記情報処理装置は、前記共有メモリの単位領域毎にアクセスの認証制御に用いる認証情報を記憶する認証情報記憶部を有する。前記情報処理装置は、前記複数の他の情報処理装置のうち異常が検出された異常情報処理装置が使用していた停止対象領域へのアクセスの停止指示を、前記管理情報に基づいて、該異常情報処理装置を除く他の情報処理装置に通知する第１の通知部を有する。前記情報処理装置は、前記停止対象領域の各単位領域に対応する認証情報記憶部に新しい認証情報を設定する設定部を有する。前記情報処理装置は、前記第１の通知部により前記停止指示が通知された情報処理装置に前記新しい認証情報とアクセスの再開指示を通知する第２の通知部を有する。
【発明の効果】
【０００９】
１つの側面では、正常な情報処理装置や正常なアプリケーションに対して、使用許可された共有メモリの単位領域のうち、障害が発生した情報処理装置や障害が発生したアプリケーションが使用していた単位領域へのアクセスの停止及び再開の処理を行いつつ、正常な情報処理装置や正常なアプリケーションが、障害が発生した情報処理装置や障害が発生したアプリケーションが使用していない単位領域を継続利用可能にすることができる。
【図面の簡単な説明】
【００１０】
【図１】図１は、実施例に係る情報処理システムのハードウェア構成を示す図である。
【図２】図２は、ＣＰＵチップのブロック図である。
【図３】図３は、実施例に係る情報処理システムのハードウェアの論理構成及びソフトウェアの機能構成を示す図である。
【図４】図４は、管理テーブルの一例を示す図である。
【図５】図５は、トークンの受け渡しを説明するための図である。
【図６Ａ】図６Ａは、再通知方式を説明するための第１の図である。
【図６Ｂ】図６Ｂは、再通知方式を説明するための第２の図である。
【図７】図７は、共有メモリを使用する処理のフローを示すフローチャートである。
【図８Ａ】図８Ａは、共有メモリを使用するノードをセグメント単位で把握する処理のフローを示すフローチャートである。
【図８Ｂ】図８Ｂは、共有メモリを使用するプロセスをセグメント単位で把握する処理のフローを示すフローチャートである。
【図９】図９は、ノード異常発生時の処理のフローを示すフローチャートである。
【図１０】図１０は、アプリ異常発生時の処理のフローを示すフローチャートである。
【発明を実施するための形態】
【００１１】
以下に、本願の開示する情報処理装置、共有メモリ管理方法及び共有メモリ管理プログラムの実施例を図面に基づいて詳細に説明する。なお、この実施例は開示の技術を限定するものではない。
【実施例】
【００１２】
まず、実施例の記載で用いられる用語について説明する。
「ノード」：  一つ以上のＯＳ（Operating  System）が動作する情報処理装置（コンピュータシステム）。仮想化機能を有するコンピュータシステムでは、ノード内を論理的に複数の論理ドメインに分割して、複数のＯＳを稼働させることもできる。
「ノード間の共有メモリ」：  複数のノード（複数の異なるＯＳ上で動作する複数のアプリケーション）からアクセス（リード／ライト）可能な共有メモリ。
【００１３】
「ホームノード」：  ノード間の共有メモリ領域として設定した物理メモリを有するノード。
「リモートノード」：  ホームノードのメモリを参照したり更新したりするノード。
「セグメント」：  共有メモリの管理単位。セグメント毎に後述するメモリトークンを設定することができる。
「セグメントサイズ」：  共有メモリの管理単位のサイズ。例えば、４ＭＢ（メガバイト）、３２ＭＢ、２５６ＭＢ、２ＧＢ（ギガバイト）等。
【００１４】
「ＲＡ」：  実アドレス。仮想化機能を導入したシステムで論理ドメイン毎に割り振られるアドレス。
「ＰＡ」：  物理アドレス。物理位置によって割り振られるアドレス。
【００１５】
「メモリトークン」：  ホームノード側のＣＰＵチップのメモリトークンレジスタに設定されるメモリアクセスキー。セグメント毎に異なるメモリトークンが設定される。メモリアクセスキーは、トークンとも呼ばれる。
「アクセストークン」：  リモートノードからホームノード（他ノード）の共有メモリにアクセスする際に設定されるメモリアクセスキー。
・リモートノードからのメモリアクセス要求に付加されたアクセストークンとホームノードのメモリトークンレジスタに設定されたメモリトークンに基づいて、ハードウェアがメモリアクセス要求実行の可否を制御する。
・ホームノードのメモリトークンとリモートノードのアクセストークンが一致する場合は、共有メモリにアクセス（リード及びライト）することが可能。
・ホームノードのメモリトークンとリモートノードのアクセストークンが不一致の場合、共有メモリにアクセス（リード及びライト）しようとすると、例外トラップが発生してアクセス不可。
【００１６】
次に、実施例に係る情報処理システムのハードウェア構成について説明する。図１は、実施例に係る情報処理システムのハードウェア構成を示す図である。図１に示すように、情報処理システム２は、３つのノード１と、サービスプロセッサ３とを有する。また、３つのノード１とサービスプロセッサ３はクロスバーネットワーク４で接続される。
【００１７】
ノード１は、２つのＣＰＵチップ１１と、ディスクユニット１２と、通信インターフェイス１３とを有する情報処理装置である。ＣＰＵチップ１１は、２つのコア１４と、２つのメモリ１５を有するチップである。コア１４は、２つのストランド１６を有する演算処理装置である。ストランド１６は、コア１４において命令を実行する単位である。プログラムは、各ストランド１６で実行される。メモリ１５は、コア１４が実行するプログラムやコア１４が使用するデータを記憶するＲＡＭ（Random  Access  Memory）である。
【００１８】
ディスクユニット１２は、２つのＨＤＤ１７を有する記憶装置である。ＨＤＤ１７は、磁気ディスク装置である。通信インターフェイス１３は、クロスバーネットワーク４を介して他のノード１やサービスプロセッサ３と通信するためのインターフェイスである。
【００１９】
サービスプロセッサ３は、ノード１を制御する装置であり、ＣＰＵ３１と、メモリ３２と、通信インターフェイス３３とを有する。ＣＰＵ３１は、メモリ３２が記憶するプログラムを実行する中央処理装置である。メモリ３２は、ＣＰＵ３１によって実行されるプログラムやＣＰＵ３１が使用するデータ等を記憶するＲＡＭである。通信インターフェイス３３は、クロスバーネットワーク４を介してノード１と通信するためのインターフェイスである。
【００２０】
なお、説明の便宜上、図１では３つのノード１を示したが、情報処理システム２は、任意の個数のノード１を有してよい。また、図１では、ノード１が２つのＣＰＵチップ１１を有する場合を示したが、ノード１は、任意の個数のＣＰＵチップ１１を有してよい。また、図１では、ＣＰＵチップ１１が２つのコア１４を有する場合を示したが、ＣＰＵチップ１１は、任意の個数のコア１４を有してよい。また、図１では、コア１４が２つのストランド１６を有する場合を示したが、コア１４は、任意の個数のストランド１６を有してよい。また、図１では、ＣＰＵチップ１１が２つのメモリ１５を有する場合を示したが、ＣＰＵチップ１１は、任意の個数のメモリ１５を有してよい。また、図１では、ディスクユニット１２が２つのＨＤＤ１７を有する場合を示したが、ディスクユニット１２は、任意の個数のＨＤＤ１７を有してよい。
【００２１】
図２は、ＣＰＵチップ１１のブロック図である。図２に示すように、ＣＰＵチップ１１は、２つのコア１４と、メモリ２６と、メモリトークンレジスタ２７と、二次キャッシュ１８とを有する。なお、メモリ２６は、図１の２つのメモリ１５と対応する。
【００２２】
メモリトークンレジスタ２７は、セグメント毎にメモリトークンを記憶する。二次キャッシュ１８は、コア１４内の一次キャッシュ１９と比較して低速で大容量のキャッシュメモリを有するキャッシュ装置である。なお、図１において、メモリトークンレジスタ２７と二次キャッシュ１８は省略されている。
【００２３】
コア１４は、一次キャッシュ１９と、２つのストランド１６とを有する。一次キャッシュ１９は、二次キャッシュ１８と比較して高速で小容量のキャッシュメモリを有するキャッシュ装置である。一次キャッシュ１９は、命令キャッシュ２０とデータキャッシュ２１とを有する。命令キャッシュ２０は、命令を記憶し、データキャッシュ２１は、データを記憶する。
【００２４】
ストランド１６は、一次キャッシュ１９から命令及びデータを読み出す。ストランド１６が読み出す命令又はデータが一次キャッシュ１９にない場合には、一次キャッシュ１９は、二次キャッシュ１８から命令又はデータを読み出す。一次キャッシュ１９が読み出す命令又はデータが二次キャッシュ１８にない場合には、二次キャッシュ１８は、メモリ２６から命令又はデータを読み出す。
【００２５】
また、ストランド１６は、メモリ２６に格納するデータを一次キャッシュ１９に書き込む。ストランド１６が一次キャッシュ１９に書き込んだデータは、二次キャッシュ１８に書き込まれ、二次キャッシュ１８からメモリ２６に書き込まれる。
【００２６】
ストランド１６は、命令制御部２２と、命令バッファ２３と、演算部２４と、レジスタ部２５と、アクセストークンレジスタ２８とを有する。命令制御部２２は、命令バッファ２３から命令を読み出し、読み出した命令の実行を制御する。命令バッファ２３は、命令キャッシュ２０から読み出された命令を記憶する。演算部２４は、四則演算等の演算を実行する。レジスタ部２５は、命令の実行に用いられるデータや命令の実行結果等を記憶する。なお、ストランド１６は独自の命令バッファ２３とレジスタ部２５を備えるが、命令制御部２２と演算部２４は２つのストランド１６で共用される。
【００２７】
アクセストークンレジスタ２８は、他のノード１の共有メモリのセグメント毎にアクセストークンを記憶する。ストランド１６で実行されるプロセスは、アクセストークンレジスタ２８に記憶されたアクセストークンを用いて共有メモリにアクセスする。なお、図１では、一次キャッシュ１９及びアクセストークンレジスタ２８は省略されている。また、図２では、アクセストークンレジスタ２８はストランド１６に含まれるが、アクセストークンレジスタ２８の実装は図２の例に限定されることなく、各ストランド１６に対応する各アクセストークンレジスタ２８はストランド１６の外にあってもよい。
【００２８】
次に、実施例に係る情報処理システム２のハードウェアの論理構成及びソフトウェアの機能構成について説明する。ここで、ハードウェアの論理構成とは、ＯＳやアプリケーションが使用する論理的なハードウェアである。図３は、実施例に係る情報処理システム２のハードウェアの論理構成及びソフトウェアの機能構成を示す図である。なお、図３では、１つのノード１を１つの論理ドメインとした場合を示す。１つの論理ドメインでは１つのＯＳが実行される。したがって、図３では、各ノード１で１つのＯＳが実行される。
【００２９】
図３に示すように、ノード１は、論理資源として、４つのＶＣＰＵ４１と、ローカルメモリ４２と、共有メモリ４３と、ディスク装置４４と有する。ＶＣＰＵ４１は、論理的なＣＰＵであり、図１に示した８個のストランド１６のいずれかに対応付けられる。
【００３０】
ローカルメモリ４２は、自ノード１だけからアクセスされるメモリであり、共有メモリ４３は、他のノード１からもアクセス可能なメモリである。ローカルメモリ４２と共有メモリ４３は、図１に示した４つのメモリ１５に対応する。ローカルメモリ４２に２つのメモリ１５を対応付け、共有メモリ４３に他の２つのメモリ１５を対応付けてもよいし、ローカルメモリ４２に３つのメモリ１５を対応付け、共有メモリ４３に他の１つのメモリ１５を対応付けてもよい。ディスク装置４４は、図１に示したディスクユニット１２に対応する。
【００３１】
ハイパーバイザ５０は、情報処理システム２の物理資源を管理してＯＳ６０に論理資源を提供する基本ソフトウェアである。ＯＳ６０は、論理資源を用いてアプリケーションの実行を制御する。ＯＳ６０は、共有メモリ管理部６１を有する。
【００３２】
共有メモリ管理部６１は、共有メモリ４３を管理し、管理テーブル７０と、ノード・プロセス管理部７１と、セグメント情報通知部７２と、アクセス停止部７３と、キャッシュフラッシュ部７４と、メモリアクセストークン設定部７５と、アクセス再開部７６とを有する。
【００３３】
管理テーブル７０は、他のノード１が有する共有メモリ４３を含めて情報処理システム２が有する全ての共有メモリ４３について、セグメント毎に共有メモリ４３の情報が登録されるテーブルである。
【００３４】
図４は、管理テーブル７０の一例を示す図である。図４は、ノード番号が「０」であるホームノードが有する管理テーブル７０と、ノード番号が「１」であるホームノードが有する管理テーブル７０と、ノード番号が「２」であるリモートノードが有する管理テーブル７０を示す。図４において、セグメント番号が「０」〜「５」のセグメントは、ノード番号が「０」であるホームノードが物理メモリを有するセグメントである。また、セグメント番号が「１６」〜「２０」のセグメントは、ノード番号が「１」であるホームノードが物理メモリを有するセグメントである。
【００３５】
図４に示すように、ノード番号が「０」及び「１」であるホームノードの管理テーブル７０には、セグメント毎に、セグメント番号と、アドレスと、セグメントサイズと、使用許可ノード番号と、使用中アプリのＰＩＤと、メモリトークンとが登録される。また、ノード番号が「２」であるリモートノードの管理テーブル７０には、ホームノードの管理テーブル７０とほぼ同じ項目が登録されるが、メモリトークンの代わりにアクセストークンが登録される。
【００３６】
セグメント番号は、セグメントを識別する識別番号である。アドレスは、セグメントのＲＡである。なお、アドレスは、ＰＡであってもよい。セグメントサイズは、セグメントのサイズである。使用許可ノード番号は、ホームノードの管理テーブル７０でだけ用いられ、セグメントの使用が許可されたノード１の番号である。
【００３７】
使用中アプリのＰＩＤは、自ノードにおいてセグメントを使用するアプリケーションのプロセスＩＤである。メモリトークンは、セグメントのアクセス許可の制御に用いられるメモリアクセスキーである。アクセストークンは、ホームノードの共有メモリ４３にアクセスする際に使用されるメモリアクセスキーである。
【００３８】
例えば、ノード番号が「０」であるホームノードの管理テーブル７０では、識別番号が「０」であるセグメントは、ＲＡが１６進数で「００００００００」であり、サイズが「２５６ＭＢ」であり、使用が許可されたノード１の番号は「０」及び「２」である。また、識別番号が「０」であるセグメントは、ホームノードにおいてプロセスＩＤが「１２３」、「４５６」等のプロセスで使用されており、メモリアクセスキーは１６進数で「０１２３」である。
【００３９】
また、ノード番号が「２」であるリモートノードの管理テーブル７０では、識別番号が「０」であるセグメントは、ＲＡが１６進数で「００００００００」であり、サイズが「２５６ＭＢ」である。また、識別番号が「０」であるセグメントは、自ノードが物理メモリを有する共有メモリ４３ではないので、使用許可ノード番号は使用されない。また、識別番号が「０」であるセグメントは、自ノードにおいてプロセスＩＤが「２１３」、「５４６」等のプロセスで使用されており、メモリアクセスキーは１６進数で「０１２３」である。また、識別番号が「２」であるセグメントは、使用が許可されていないので、使用しているアプリケーションのプロセスＩＤはない。
【００４０】
図３に戻って、ノード・プロセス管理部７１は、共有メモリ４３のセグメント毎に、どのノード１で使用され、どのプロセスで使用されているかを管理する。具体的には、ホームノードのノード・プロセス管理部７１は、リモートノードに共有メモリ４３の使用許可を与える際に、その共有メモリセグメントを使用するリモートノードのノード番号を管理テーブル７０に記録する。共有メモリ４３なので、その共有メモリ４３を使用するリモートノードは複数存在する可能性があり、ノード・プロセス管理部７１は、共有メモリ４３の使用許可を与える度にノード番号を全て記録する。
【００４１】
また、各ノード１のノード・プロセス管理部７１は、共有メモリ４３をアプリケーションに割り当てる際に、その共有メモリ４３を使用するアプリケーションのプロセスＩＤを管理テーブル７０に記録する。共有メモリ４３なので、その共有メモリ４３を使用するアプリケーションは複数存在する可能性があり、ノード・プロセス管理部７１は、共有メモリ４３をアプリケーションに割り当てる度にプロセスＩＤを全て記録する。
【００４２】
また、ホームノードのノード・プロセス管理部７１は、リモートノードから共有メモリ４３の使用終了の通知があった場合や、リモートノードが停止した場合は、該当リモートノードのノード番号の記録を管理テーブル７０から削除する。また、各ノード１のノード・プロセス管理部７１は、アプリケーションから共有メモリ４３の使用終了の通知があった場合や、アプリケーションが終了した場合は、該当アプリケーションのプロセスＩＤの記録を管理テーブル７０から削除する。
【００４３】
セグメント情報通知部７２は、リモートノードの異常が検出された場合に、異常ノードが使用していたセグメントのうち自ノードが物理メモリを有するセグメントについて、当該セグメントを使用する正常なリモートノードを、管理テーブル７０を用いて特定する。そして、セグメント情報通知部７２は、特定したリモートノードに、異常ノードが使用していたセグメントのうち自ノードが物理メモリを有するセグメントのセグメント番号を通知する。
【００４４】
また、セグメント情報通知部７２は、アプリケーションの異常が検出された場合に、異常アプリケーションが使用していたセグメントを、管理テーブル７０を用いて特定する。そして、セグメント情報通知部７２は、特定したセグメントのホームノードにセグメント番号とともにアプリケーションの異常を通知する。そして、通知されたセグメント番号と管理テーブル７０を用いてホームノードのセグメント情報通知部７２が、異常アプリケーションが使用していたセグメントを使用する正常なリモートノードを特定し、特定したリモートノードにセグメント番号を通知する。なお、ノード１の異常／アプリケーションの異常は、相手ノード／相手アプリケーションが無応答になった場合や、ネットワークの異常により相手ノード／相手アプリケーションと通信できない状態になった場合に検出される。
【００４５】
アクセス停止部７３は、異常ノードが使用していたセグメント番号が通知されると、セグメント番号が通知されたセグメントを使用する全てのアプリケーションを、管理テーブル７０を用いて特定し、特定した全てのアプリケーションを停止させる。あるいは、アクセス停止部７３は、特定した全てのアプリケーションにセグメント番号を通知し、異常ノードが使用していたセグメントへのアクセスのみを停止させてもよい。異常ノードが使用していたセグメントへのアクセスのみを停止させた場合には、一時的にアクセスを停止させる範囲がセグメント単位に局所化でき、異常ノードが使用していたセグメント以外の共有メモリについては継続してアクセスが可能となる。したがって、異常ノードが使用していたセグメントへのアクセスのみを停止させた場合には、情報処理システム２に対する影響を小さくすることができる。
【００４６】
アクセス停止部７３は、異常アプリケーションが使用していたセグメント番号が通知されると、セグメント番号が通知されたセグメントを使用する全てのアプリケーションを、管理テーブル７０を用いて特定し、特定した全てのアプリケーションを停止させる。あるいは、アクセス停止部７３は、特定した全てのアプリケーションにセグメント番号を通知し、異常アプリケーションが使用していたセグメントへのアクセスのみを停止させてもよい。
【００４７】
キャッシュフラッシュ部７４は、後述するメモリアクセストークン設定部７５がメモリトークンを変更する直前に、セグメント単位でキャッシュフラッシュを実行する。すなわち、キャッシュフラッシュ部７４は、一次キャッシュ１９又は二次キャッシュ１８にキャッシュされている最新データを共有メモリ４３に書き戻す。キャッシュフラッシュ部７４は、異常ノードが検出された場合には、異常ノードが使用していたセグメントに対してキャッシュフラッシュを実行する。キャッシュフラッシュ部７４は、異常アプリケーションが検出された場合には、異常アプリケーションが使用していたセグメントに対してキャッシュフラッシュを実行する。キャッシュフラッシュ部７４がメモリトークン変更の直前に、セグメント単位でキャッシュフラッシュを実行することで、キャッシュコヒーレンシを保持した状態で異常ノード又は異常アプリケーションからのアクセスを遮断することができる。
【００４８】
メモリアクセストークン設定部７５は、リモートノードの異常が検出された場合に、異常ノードが使用していたセグメントのうち自ノードが物理メモリを有するセグメントについて、新しいトークンをメモリトークンレジスタ２７に設定する。そして、メモリアクセストークン設定部７５は、新しいトークンを正常なリモートノードに送信する。そして、リモートノードの共有メモリ管理部６１は、新しいトークンをアクセストークンレジスタ２８に設定する。このように、メモリアクセストークン設定部７５が、新しいトークンを正常なリモートノードに送信することによって、正常なノードは、異常ノードが使用していたセグメントを継続して利用することができる。
【００４９】
図５は、トークンの受け渡しを説明するための図である。図５は、ノード＃２の共有メモリ４３に含まれるセグメント８２をノード＃１がアクセスする場合を示す。なお、図５では、コア１４はストランド１６を１つ有し、アクセストークンレジスタ２８はコア１４に対応付けられる。図５に示すように、ノード＃２のＯＳ６０は、セグメント８２に対応させてメモリトークンレジスタ２７に設定したトークンを管理テーブル７０にセグメント番号に対応させて登録するとともに、ノード＃２で動作するアプリケーション８０に渡す。
【００５０】
ノード＃２で動作するアプリケーション８０は、ＯＳ６０から渡されたトークンをアクセストークン８１としてアドレスリージョン（アドレス及びサイズ）の情報とともに、ノード＃１で動作してセグメント８２をアクセスするアプリケーション８０に送信する。ノード＃１で動作するアプリケーション８０は、受け取ったアクセストークン８１をノード＃１で動作するＯＳ６０に渡す。そして、ノード＃１で動作するＯＳ６０は、アクセストークン８１をアクセストークンレジスタ２８に格納する。
【００５１】
そして、ノード＃１のコア１４は、セグメント８２をアクセスする場合にアクセストークン８１を含む情報をノード＃２に送信する。そして、ノード＃２のチェック部２９が、メモリトークンレジスタ２７がセグメント８２に対応付けて記憶するメモリトークンとアクセストークン８１を比較し、両者が一致するとセグメント８２へのアクセスを許可する。
【００５２】
図３に戻って、アクセス再開部７６は、新たなトークンが設定されたセグメントへのアクセスを再開させる。ホームノードのアクセス再開部７６は、正常なリモートノードへアクセス再開を通知する。アクセス再開を通知されたリモートノードのアクセス再開部７６は、一時的に停止させていた全てのアプリケーションを再開させる。あるいは、アクセス再開部７６は、アクセス停止部７３によりアクセスが停止されたセグメントすなわち新たにアクセストークン８１が通知されたセグメントへのアクセスをアプリケーションに再開させてもよい。
【００５３】
このように、ホームノードのメモリアクセストークン設定部７５は、異常ノード又は異常アプリケーションが使用していたセグメントに対して新たなメモリトークンを設定し、設定したメモリトークンを正常なリモートノードに再通知する。そして、ホームノードのアクセス再開部７６は、正常なリモートノードへアクセス再開を通知する。したがって、正常なリモートノードは、異常ノード又は異常アプリケーションが使用していたセグメントに継続してアクセスすることができる。一方、異常が発生したノード１又は異常アプリケーションは、異常ノード又は異常アプリケーションが使用していたセグメントへアクセスすることができない。
【００５４】
図６Ａ及び図６Ｂは、このような再通知方式を説明するための図である。図６Ａはトークン再通知前の状態を示し、図６Ｂはトークン再通知後の状態を示す。図６Ａ及び図６Ｂでは、ノード＃０がホームノードであり、ノード＃１〜ノード＃３がそれぞれリモートノード＃Ａ〜リモートノード＃Ｃである。また、図６Ａ及び図６Ｂは、各ノード１は１つのＣＰＵチップ１１を有し、各ＣＰＵチップ１１は１つのコア１４を有する場合を示す。また、セグメント＃０〜セグメント＃Ｎはセグメントを表し、トークン＃Ａ０〜トークン＃ＡＮ及びトークン＃Ｂ０〜トークン＃ＢＮはトークンを表す。
【００５５】
図６Ａに示すように、トークンが再通知される前は、ホームノードにおいて、セグメント＃０にはトークン＃Ａ０が対応付けられ、セグメント＃１にはトークン＃Ａ１が対応付けられ、セグメント＃Ｎにはトークン＃ＡＮが対応付けられる。そして、３つのリモートノードに対してセグメント＃０とセグメント＃１へのアクセスが許可され、各アクセストークンレジスタ２８には、トークン＃Ａ０及びトークン＃Ａ１がそれぞれセグメント＃０及びセグメント＃１に対応付けられて記憶される。各リモートノードは、アクセストークンレジスタ２８に記憶されたアクセストークンを用いてセグメント＃０及びセグメント＃１へのアクセスが可能である。
【００５６】
リモートノード＃Ａに異常が発生すると、図６Ｂに示すように、ホームノードにおいてセグメント＃０〜セグメント＃Ｎに対応するメモリトークンがそれぞれトークン＃Ｂ０〜トークン＃ＢＮに変更される。そして、トークン＃Ｂ０及びトークン＃Ｂ１がリモートノード＃Ｂ及びリモートノード＃Ｃに通知され、リモートノード＃Ｂ及びリモートノード＃Ｃのアクセストークンレジスタ２８が書き換えられる。一方、リモートノード＃Ａにはトークン＃Ｂ０及びトークン＃Ｂ１が通知されないため、リモートノード＃Ａのアクセストークンレジスタ２８は書き換えられない。
【００５７】
したがって、リモートノード＃Ｂ及びリモートノード＃Ｃは、アクセス再開を通知されるとセグメント＃０及びセグメント＃１にアクセス可能であるが、リモートノード＃Ａからセグメント＃０及びセグメント＃１へのアクセスは遮断される。
【００５８】
次に、共有メモリ４３を使用する処理のフローについて説明する。図７は、共有メモリ４３を使用する処理のフローを示すフローチャートである。図７に示すように、ホームノードにおいて、ＯＳ６０が共有メモリ４３を使用するアプリケーションであるアプリＨを起動する（ステップＳ１）。そして、アプリＨは、共有メモリ４３のセグメントＡを獲得する（ステップＳ２）。そして、ホームノードのノード・プロセス管理部７１は、管理テーブル７０にセグメントＡを使用するアプリＨのプロセスＩＤを追加する（ステップＳ３）。
【００５９】
その後、ホームノードは、リモートノードＮに共有メモリ４３のセグメントＡの使用を許可し、セグメントＡの使用許可をリモートノードＮに通知する（ステップＳ４）。その際、ホームノードのノード・プロセス管理部７１は、管理テーブル７０にセグメントＡを使用するリモートノードＮのノード番号を追加する。
【００６０】
一方、リモートノードＮにおいては、ＯＳ６０が共有メモリ４３を使用するアプリＲを起動する（ステップＳ１８）。そして、リモートノードＮの共有メモリ管理部６１は、セグメントＡの使用許可をホームノードから通知されると、アプリＲにセグメントＡを割り当てる（ステップＳ１９）。また、リモートノードＮのノード・プロセス管理部７１は、管理テーブル７０にセグメントＡを使用するアプリＲのプロセスＩＤを追加する（ステップＳ２０）。
【００６１】
そして、ホームノードは、セグメントＡのメモリトークンを設定し（ステップＳ５）、リモートノードＮにセグメントＡのメモリトークンを通知する（ステップＳ６）。そして、ホームノードは、セグメントＡのメモリトークンをＯＳ６０に通知し（ステップＳ７）、ＯＳ６０は管理テーブル７０にセグメントＡのメモリトークンを追加する（ステップＳ８）。
【００６２】
一方、リモートノードＮのアプリＲは、セグメントＡのメモリトークンをホームノードから通知されると、セグメントＡのメモリトークンをＯＳ６０に通知する（ステップＳ２１）。そして、リモートノードＮの共有メモリ管理部６１は、管理テーブル７０にセグメントＡのアクセストークンを追加し（ステップＳ２２）、アクセストークンレジスタ２８にアクセストークンを設定する（ステップＳ２３）。そして、リモートノードＮのアプリＲは、セグメントＡへのアクセスを開始する（ステップＳ２４）。
【００６３】
セグメントＡへのアクセスを受信すると、ホームノードのチェック部２９は、セグメントＡのメモリトークンとアクセストークンが一致するか否かを判定し（ステップＳ９）、一致した場合にはアクセス可と判定する（ステップＳ１０）。一方、一致しない場合には、チェック部２９は、アクセス拒否と判定し（ステップＳ１１）、アクセス拒否をリモートノードＮに通知する。アクセス拒否を通知されると、リモートノードＮは、トークン不一致のトラップを生成する（ステップＳ２５）。
【００６４】
リモートノードＮは、トークン不一致のトラップが発生したか否かを判定し（ステップＳ２６）、発生しない場合には、アクセス成功と判定し（ステップＳ２７）、発生した場合には、アクセス失敗と判定する（ステップＳ２８）。その後、リモートノードＮは、アクセストークンを解除し（ステップＳ２９）、アプリＲがセグメントＡの使用終了を通知する（ステップＳ３０）。
【００６５】
ホームノードは、リモートノードＮからセグメントＡの使用終了の通知があるか否かを判定し（ステップＳ１２）、通知がない場合には、ステップＳ９へ戻る。一方、通知がある場合には、キャッシュフラッシュ部７４がセグメントＡに対してキャッシュフラッシュを実行する（ステップＳ１３）。そして、ホームノードはセグメントＡのメモリトークンを解除し（ステップＳ１４）、ノード・プロセス管理部７１がリモートノードＮのセグメントＡ使用許可を解除する（ステップＳ１５）。すなわち、ノード・プロセス管理部７１は、管理テーブル７０からリモートノードＮのノード番号を削除する。
【００６６】
そして、ノード・プロセス管理部７１は、管理テーブル７０からセグメントＡのメモリトークンとアプリＨのプロセスＩＤを削除する（ステップＳ１６）。そして、ホームノードは、共有メモリ４３を使用するアプリＨを終了する（ステップＳ１７）。
【００６７】
一方、リモートノードＮのノード・プロセス管理部７１は、管理テーブル７０からセグメントＡのアクセストークンとアプリＲのプロセスＩＤを削除する（ステップＳ３１）。そして、リモートノードＮは、共有メモリ４３を使用するアプリＲを終了する（ステップＳ３２）。
【００６８】
このように、ホームノードのノード・プロセス管理部７１とリモートノードＮのノード・プロセス管理部７１が連携してセグメントＡを使用するノード１のノード番号及びプロセスのプロセスＩＤを把握する。したがって、セグメントＡを使用するノード１又はアプリケーションに異常が発生した場合に、セグメントＡのホームノードのアクセス停止部７３は、セグメントＡを使用するリモートノードにセグメントＡの使用停止を依頼することができる。
【００６９】
次に、共有メモリ４３を使用するノード１をセグメント単位で把握する処理のフローについて説明する。図８Ａは、共有メモリ４３を使用するノード１をセグメント単位で把握する処理のフローを示すフローチャートである。
【００７０】
図８Ａに示すように、ホームノードのノード・プロセス管理部７１は、リモートノードへの共有メモリ４３のセグメント使用の許可時であるか否かを判定する（ステップＳ４１）。その結果、リモートノードへの共有メモリ４３のセグメント使用の許可時である場合には、ホームノードのノード・プロセス管理部７１は、管理テーブル７０にセグメントを使用するノード１のノード番号を追加する（ステップＳ４２）。
【００７１】
一方、リモートノードへの共有メモリ４３のセグメント使用の許可時でない場合、すなわち、使用終了時は、ホームノードのノード・プロセス管理部７１は、管理テーブル７０からセグメントの使用を終了したノード１のノード番号を削除する（ステップＳ４３）。
【００７２】
このように、ホームノードのノード・プロセス管理部７１は、セグメントを使用するノード１のノード番号を、管理テーブル７０を用いて管理することによって、セグメントを使用するリモートノードを把握することができる。
【００７３】
次に、共有メモリ４３を使用するプロセスをセグメント単位で把握する処理のフローについて説明する。図８Ｂは、共有メモリ４３を使用するプロセスをセグメント単位で把握する処理のフローを示すフローチャートである。
【００７４】
図８Ｂに示すように、リモートノードのノード・プロセス管理部７１は、セグメント割り当て時であるか否かを判定する（ステップＳ５１）。その結果、セグメント割り当て時である場合には、リモートノードのノード・プロセス管理部７１は、管理テーブル７０にセグメントを使用するアプリケーションのＰＩＤを追加する（ステップＳ５２）。
【００７５】
一方、セグメント割り当て時でない場合、すなわち、解放時は、リモートノードのノード・プロセス管理部７１は、管理テーブル７０からセグメントを解放するアプリケーションのＰＩＤを削除する（ステップＳ５３）。
【００７６】
このように、リモートノードのノード・プロセス管理部７１は、セグメントを使用するアプリケーションのＰＩＤを、管理テーブル７０を用いて管理することによって、セグメントを使用するアプリケーションを把握することができる。
【００７７】
次に、ノード異常発生時の処理のフローについて説明する。図９は、ノード異常発生時の処理のフローを示すフローチャートである。図９に示すように、リモードノードで異常が発生し（ステップＳ６１）、ホームノードがリモートノードの異常を検出する（ステップＳ６２）。そして、ホームノードのセグメント情報通知部７２が、正常な各リモートノードに、異常ノードが使用していた共有メモリ４３のセグメント番号を通知する（ステップＳ６３）。
【００７８】
そして、正常な各リモートノードのアクセス停止部７３が、異常ノードが使用していたセグメントを使用している全アプリに、異常ノードが使用していたセグメント番号を通知して、セグメント単位で一時的にアクセスの停止を指示する（ステップＳ６４）。そして、アクセス停止部７３は、ホームノードに一時停止したことを通知する（ステップＳ６５）。
【００７９】
そして、ホームノードは、正常な各リモートノードから一時停止通知を受信したか否かを判定し（ステップＳ６６）、受信していないリモートノードがある場合には、一時停止通知を受信したか否かの判定を繰り返す。一方、正常な各リモートノードから一時停止通知を受信した場合には、キャッシュフラッシュ部７４が、異常ノードが使用していた共有メモリセグメントに対してキャッシュフラッシュを実行する（ステップＳ６７）。
【００８０】
そして、メモリアクセストークン設定部７５が、異常ノードが使用していた共有メモリセグメントに対応するメモリトークンレジスタ２７に新しいトークンを設定する（ステップＳ６８）。その後、異常ノードが異常発生前に使用していた共有メモリセグメントにアクセスしようとすると、アクセスが失敗し（ステップＳ６９）、異常ノードは異常終了する（ステップＳ７０）。
【００８１】
ホームノードのメモリアクセストークン設定部７５は、正常な各リモートノードに新しいトークンを通知し（ステップＳ７１）、ホームノードのアクセス再開部７６が、正常な各リモートノードにアクセス再開を通知する（ステップＳ７２）。そして、正常な各リモートノードのメモリアクセストークン設定部７５が、アクセストークンレジスタ２８に新しいトークンを設定する（ステップＳ７３）。そして、正常な各リモートノードのアクセス再開部７６が、異常ノードが使用していた共有メモリセグメントへのアクセスを再開する（ステップＳ７４）。
【００８２】
このように、ホームノードが、異常ノードが使用していた共有メモリセグメントに新たなメモリトークンを設定し、正常な各リモートノードに通知することによって、正常ノードからのアクセスを許可するとともに、異常ノードからのアクセスを防ぐことができる。
【００８３】
次に、アプリ異常発生時の処理のフローについて説明する。図１０は、アプリ異常発生時の処理のフローを示すフローチャートである。図１０に示すように、リモートアプリで異常が発生し（ステップＳ８１）、ホームノードがリモートアプリの異常を検出する（ステップＳ８２）。そして、ホームノードのセグメント情報通知部７２が、各リモートノードに、異常アプリが使用していた共有メモリ４３のセグメント番号を通知する（ステップＳ８３）。
【００８４】
そして、各リモートノードのアクセス停止部７３が、異常アプリが使用していたセグメントを使用している全アプリに、異常アプリが使用していたセグメント番号を通知して、セグメント単位で一時的にアクセスの停止を指示する（ステップＳ８４）。そして、アクセス停止部７３は、ホームノードに一時停止したことを通知する（ステップＳ８５）。
【００８５】
そして、ホームノードは、各リモートノードから一時停止通知を受信したか否かを判定し（ステップＳ８６）、受信していないリモートノードがある場合には、一時停止通知を受信したか否かの判定を繰り返す。一方、各リモートノードから一時停止通知を受信した場合には、キャッシュフラッシュ部７４が、異常アプリが使用していた共有メモリセグメントに対してキャッシュフラッシュを実行する（ステップＳ８７）。
【００８６】
そして、メモリアクセストークン設定部７５が、異常アプリが使用していた共有メモリセグメントに対応するメモリトークンレジスタ２７に新しいトークンを設定する（ステップＳ８８）。その後、異常アプリが異常発生前に使用していた共有メモリセグメントにアクセスしようとすると、アクセスが失敗し（ステップＳ８９）、異常アプリは異常終了する（ステップＳ９０）。
【００８７】
ホームノードのメモリアクセストークン設定部７５は、各リモートノードに新しいトークンを通知し（ステップＳ９１）、ホームノードのアクセス再開部７６が、各リモートノードにアクセス再開を通知する（ステップＳ９２）。そして、各リモートノードのメモリアクセストークン設定部７５が、アクセストークンレジスタ２８に新しいトークンを設定する（ステップＳ９３）。そして、各リモートノードのアクセス再開部７６が、異常アプリが使用していた共有メモリセグメントへのアクセスを再開する（ステップＳ９４）。
【００８８】
このように、ホームノードが、異常アプリが使用していた共有メモリセグメントに新たなメモリトークンを設定し、各リモートノードに通知することにより、異常アプリ以外のアプリからのアクセスを許可するとともに、異常アプリからのアクセスを防ぐことができる。
【００８９】
上述してきたように、実施例では、ホームノードのセグメント情報通知部７２が、正常な各リモートノードに、異常ノードが使用していた共有メモリ４３のセグメント番号を通知して、セグメント単位で一時的にアクセスの停止を指示する。そして、メモリアクセストークン設定部７５が、異常ノードが使用していた共有メモリセグメントに対応するメモリトークンレジスタ２７に新しいトークンを設定し、正常な各リモートノードに新しいトークンを通知する。そして、アクセス再開部７６が、正常な各リモートノードにアクセス再開を通知する。したがって、正常なノード１は、異常ノードが使用していた共有メモリセグメント以外のセグメントは一時的にアクセスを停止することなく継続してアクセスすることができ、正常なノード１への障害の影響をなくすことができる。
【００９０】
また、実施例では、キャッシュフラッシュ部７４が、新しいトークンが設定される前に、異常ノードが使用していた共有メモリセグメントに対してキャッシュフラッシュを実行する。したがって、ホームノードは、キャッシュコヒーレンスを維持した状態で、異常ノードが使用していた共有メモリセグメントへのアクセスを再開させることができる。
【００９１】
また、実施例では、各リモートノードのアクセス停止部７３が、異常ノードが使用していたセグメントを使用している全アプリに、異常ノードが使用していたセグメント番号を通知して、セグメント単位で一時的にアクセスの停止を指示する。したがって、情報処理システム２は、異常ノードが使用していたセグメントを使用しないアプリがノード異常の影響を受けることを防ぐことができる。
【００９２】
なお、実施例では、管理テーブル７０に使用を許可したノード１の番号を登録する場合について説明したが、管理テーブル７０に使用を許可したＣＰＵチップ１１、コア１４又はストランド１６を登録してもよい。この場合、ＣＰＵチップ１１、コア１４又はストランド１６が情報処理装置として機能する。
【００９３】
また、実施例では、アプリがセグメントを獲得する毎に使用を許可する場合について説明したが、アプリに一定の範囲の共有メモリ４３が割り当てられた際に、割り当てられた共有メモリ４３に含まれるセグメントについて使用を許可してもよい。
【符号の説明】
【００９４】
１    ノード
２    情報処理システム
３    サービスプロセッサ
４    クロスバーネットワーク
１１    ＣＰＵチップ
１２    ディスクユニット
１３    通信インターフェイス
１４    コア
１５    メモリ
１６    ストランド
１７    ＨＤＤ
１８    二次キャッシュ
１９    一次キャッシュ
２０    命令キャッシュ
２１    データキャッシュ
２２    命令制御部
２３    命令バッファ
２４    演算部
２５    レジスタ部
２６    メモリ
２７    メモリトークンレジスタ
２８    アクセストークンレジスタ
２９    チェック部
３１    ＣＰＵ
３２    メモリ
３３    通信インターフェイス
４１    ＶＣＰＵ
４２    ローカルメモリ
４３    共有メモリ
４４    ディスク装置
５０    ハイパーバイザ
６０    ＯＳ
６１    共有メモリ管理部
７０    管理テーブル
７１    ノード・プロセス管理部
７２    セグメント情報通知部
７３    アクセス停止部
７４    キャッシュフラッシュ部
７５    メモリアクセストークン設定部
７６    アクセス再開部
８０    アプリケーション
８１    アクセストークン
８２    セグメント
【図１】
2017111750.tif 000003
【図２】
2017111750.tif 000004
【図３】
2017111750.tif 000005
【図４】
2017111750.tif 000006
【図５】
2017111750.tif 000007
【図６Ａ】
2017111750.tif 000008
【図６Ｂ】
2017111750.tif 000009
【図７】
2017111750.tif 000010
【図８Ａ】
2017111750.tif 000011
【図８Ｂ】
2017111750.tif 000012
【図９】
2017111750.tif 000013
【図１０】
2017111750.tif 000014