以下、本発明の実施形態について、図1〜図20を参照して具体的に説明する。
(実施例1)
図1は、実施例1に係る情報処理システム100の構成例を示す図である。図1に示すように、情報処理システム100は、複数のノード1と、共有メモリ部2とを含む。各ノード1は、CPUチップ11とローカルメモリ15とを含む。CPUチップ11は、演算処理を行うCPUコア12と、アクセストークン記憶部13と、送信部14とを含むハードウェアである。ローカルメモリ15は、CPUコア12が実行する処理に用いられるデータおよびプログラムを格納するハードウェアである。各ノード1のCPUチップ11を用いて、1つ以上のオペレーティングシステム(OS)が動作する。各ノード1はクロスバスイッチ等のインターコネクト3を介して接続される。インターコネクト3は、クロスバスイッチに限られず、LAN(Local Area Network)や、インフィニバンド等を用いてもよい。
図1において、共有メモリ部2は破線で示されているが、各ノード1に備えられて、各ノード1内の共有メモリ部2を複数のノード1からアクセスできるノード間共有メモリの構成とすることができる。ここで、「ノード間共有メモリ」とは、複数のノードからアクセス(リード/ライト)可能な共有メモリをいう。例えば、NUMA(Non-Uniformed Memory Access)のようなシステム構成とし、各共有メモリ部2を仮想的なメモリマップに含まれる複数の領域の1つ1つにアサインすることで、全体として大きな共有メモリとして扱うことができる。また、本発明の一態様を実施するためのシステム構成として、共有メモリ部2を複数のノードからアクセス可能な共有ストレージ装置のような構成にすることもできる。
共有メモリ部2は、共有メモリ21と、メモリトークン記憶部22と、判定部23と、メモリインタフェース(I/F)回路24とを含む。共有メモリ21は、複数のセグメントを含み、複数のノード1で共有されるメモリである。ここで、「セグメント」とは、共有メモリを管理する単位であり、セグメントごとに、アクセス許可の制御に用いる識別情報であるメモリトークンを設定することができる。セグメントのサイズとしては、例えば4MB、32MB、256MB、2GB等、共有メモリの管理を行うための任意のサイズとすることができる。
メモリトークン記憶部22は、共有メモリに含まれるセグメント毎のアクセス許可の制御に用いるメモリトークンを格納する。図1の例では、メモリトークン記憶部22は、例えば共有メモリに含まれるセグメント(A)、(B)のそれぞれに対応するメモリトークン(A)、(B)を格納する。判定部23は、共有メモリ21に含まれるセグメントをアクセスするリクエストについて、リクエストに含まれる情報とメモリトークンとを用いて共有メモリへのアクセスの可否を判定する回路である。メモリインタフェース(I/F)回路24は、判定部23がリクエストのアクセスを許可する場合に、共有メモリをアクセスするリクエストのアクセス制御を行う回路である。
CPUチップ11のアクセストークン記憶部13は、CPUコア12が、共有メモリ21に含まれる特定のセグメントをアクセスするための特定のアクセス識別情報であるアクセストークンを記憶する記憶部である。アクセストークン記憶部13は、CPUコア12がアクセスを予定している、共有メモリ21の複数のセグメントに対応する複数のアクセストークンを記憶する。
送信部14は、CPUコア12から発行される共有メモリ21をアクセスするリクエストに、アクセストークン記憶部13に格納された複数のアクセストークンを付加して送信する。アクセストークン記憶部13に格納する各アクセストークンは、CPUコア12上で実行するアプリケーションプログラムがアクセスすることを予定している共有メモリのセグメントに対応するアクセストークンである。これらのアクセストークンは、予めアプリケーションプログラム又はオペレーティングシステム(OS)により、アクセストークン記憶部13に格納される。
本実施態様では、CPUコア12が異なるメモリトークンが設定された複数のセグメントにアクセスを行う際、各リクエストについて、予めアクセストークン記憶部に格納しておいた複数のアクセストークンを付加して送信する。そして、リクエストのアクセス先の共有メモリ部2の判定部23は、リクエストに含まれる複数のアクセストークンと、リクエストのアクセス先のセグメントに対応するメモリトークンとを比較する。判定部23は、リクエストのアクセス先に応じてメモリトークン記憶部22から読み出したメモリトークンが、リクエストに含まれる複数のアクセストークンのいずれか1つと一致すると、そのリクエストのアクセスを許可する。
共有メモリの複数の領域をアクセスする各リクエストに対して、予めアクセストークン記憶部13に格納しておいた複数のアクセストークンを付加して送信し、判定部23でメモリトークンと比較することで、図22に示されるアクセストークンの再設定が不要となる。すなわち、異なるメモリトークンが設定された複数のメモリ領域にアクセスを行う際の、アクセストークンの再設定のオーバーヘッドを低減することができる。
図2は、実施例1における、情報処理システム200のハードウェア構成例を示す図である。情報処理システム200は、3つのノード1と、サービスプロセッサ4とがインターコネクト3を介して接続される。各ノード1は、2つのCPUチップ11と、4つのメモリ17と、ディスクユニット18と、通信インターフェイス20とを有する。
各CPUチップ11は、2つのCPUコア12を有し、各CPUコア12は、2つのストランド16を有する。ノード1に含まれる4つのメモリ17は、ノード1に含まれる4つのCPUコア12に対応する。ストランド16は、CPUコア12上で実行されるアプリケーションプログラムのプロセスの単位で実行するハードウェアスレッドである。
メモリ17は、CPUコア12が実行するプログラムや、CPUコア12が使用するデータを記憶するRAM(Random Access Memory)である。メモリ17は、例えば、DIMM(Dual Inline Memory Module)等の複数のメモリを含み、その一部を他のノードからもアクセス可能な共有メモリ21として使用し、他の一部を対応するCPUコア12がローカルにアクセスするローカルメモリ15として使用することができる。以下、各メモリ17は、ローカルメモリ15と共有メモリ21とを有することを前提として説明する。
ディスクユニット18は、例えば2つのハードディスクドライブ(HDD)19を有する記憶装置である。HDD19は、磁気ディスク装置である。また、通信インターフェイス20は、クロスバスイッチ等のインターコネクト3を介して他のノード1やサービスプロセッサ4と通信を行うためのインターフェイス回路である。
サービスプロセッサ4は、各ノード1の制御を行う装置であり、CPU41、メモリ42、通信インターフェイス43を有する。CPU41は、サービスプロセッサ4が行う各種処理を、メモリ42に記憶したプログラムを実行することにより行う。メモリ42は、CPU41によって実行されるプログラムやCPU41が使用するデータを記憶するRAMである。通信インターフェイス43は、サービスプロセッサ4が、インターコネクト3を介してノード1と通信を行うためのインターフェイス回路である。
なお、図2では図示していないが、アプリケーションプログラムの各プロセスを実行するストランド16毎に、図1で説明したアクセストークン記憶部13や送信部14を有する。また、各メモリ17に含まれる共有メモリ21ごとに、図1で説明したメモリトークン記憶部22、判定部23、メモリI/F回路24を有する。なお、アクセストークン記憶部13は、アプリケーションプログラムの処理が各CPUコア12の単位で実行される場合には、CPUコア12毎に設けることもできる。ストランド16毎又はCPUコア12毎にアクセストークン記憶部13を設けることで、アプリケーションプログラムのプロセス毎にメモリアクセス制御を行うことができる。
情報処理システム200では、各ノード1のメモリ17が共有メモリ21を含み、各ノード1の共有メモリ21は他のノードのCPUチップ11からもアクセスできるノード間共有メモリの構成となっている。情報処理システム200の各ノード1は、ビルディングブロックといった名称で呼ばれる場合もある。
ノード間共有メモリを有する情報処理システム200において、ノード間の共有メモリ領域として設定した物理メモリを有するノードを「ホームノード」といい、ホームノードの共有メモリを参照する他のノードを「リモートノード」という。
情報処理システム200の各ノード1は、他のノード1から自ノード(ホームノード)内の共有メモリへのアクセスを制御するためのメモリトークンを、自ノード内のメモリトークン記憶部22に記憶する。また、ホームノードは、自ノード内の共有メモリのセグメントをアクセスする他のノードに対して、セグメントのメモリトークンに対応するトークンを通知する。リモートノードは、ホームノードから受信したトークンを保持し、トークンに対応するホームノードのセグメントをアクセスする際に、アクセストークンとして使用する。
情報処理システム200は、ノード間共有メモリのメモリ構成を有するため、各ノードに含まれるストランド16は、自ノード内の共有メモリだけでなく、他のノード1内の共有メモリにもアクセスすることができる。ストランド16は、共有メモリをアクセスする際には、アクセス先の共有メモリのセグメントに対応するアクセストークンを含む複数のアクセストークンを各リクエストに付加して送信することで、共有メモリのアクセスを行う。
ホームノードの共有メモリ21毎に設けられた判定部23では、リクエストに付加された複数のアクセストークンのいずれかが、リクエストがアクセスしようとするセグメントのメモリトークンに対応するかどうかに応じて、リクエストのアクセスの許可を制御する。
なお、説明の便宜上、図2では3つのノード1を有するシステム構成となっているが、任意の個数のノードを有するシステムとすることができる。また、CPUチップ11に含まれるCPUコア12の個数や、CPUコア12に含まれるストランド16の個数についても任意の数とすることができる。また、メモリ17や、ディスクユニット18に含まれるHDD19の数についても任意の個数とすることができる。
図3は、図2におけるCPUチップ11のブロック図の一例を示す図である。CPUチップ11は、2個のCPUコア12と、メモリトークン記憶部22と、二次キャッシュメモリ39とを有する。また、図3には図示されていないが、CPUチップ11は、各CPUコア12がメモリ17をアクセスするための判定部23や、共有メモリ21のリード/ライトを制御するメモリI/F回路24も備える。各CPUコア12は、一次キャッシュメモリ36と、ストランド16とを有する。
メモリトークン記憶部22は、メモリ17に含まれる共有メモリ21に含まれるセグメントに対応するメモリトークンを記憶する。メモリトークン記憶部22に記憶される複数のメモリトークンは、CPUコア12上で実行されるアプリケーションプログラムが使用する予定の複数のセグメントのそれぞれに対応する。
二次キャッシュメモリ39は、CPUコア12内の一次キャッシュメモリ36と比較して低速で大容量のキャッシュメモリである。一次キャッシュメモリ36は、二次キャッシュメモリ39と比較して高速で小容量のキャッシュメモリである。一次キャッシュメモリ36は、命令キャッシュメモリ37と、データキャッシュメモリ38とを有する。命令キャッシュメモリ37は、メモリ17又はディスクユニット18から読み出された命令コードを一時的に記憶する。データキャッシュメモリ38は、メモリ17又はディスクユニット18から読み出されたデータを一時的に記憶する。
ストランド16は、命令制御部31と、命令バッファ32と、演算部33と、レジスタ部34と、アクセストークン記憶部35とを有する。図3に示すように、命令制御部31及び演算部33は、複数のストランド16で共通のハードウェア資源として実装することもできる。
命令制御部31は、命令バッファ32から命令を読み出し、読み出した命令の実行を制御する。命令バッファ32は、命令キャッシュメモリ37から読み出された命令を記憶する。演算部33は、四則演算等の演算を実行する。レジスタ部34は、命令の実行に用いられるデータを記憶する汎用レジスタや、種々のステータスレジスタ等を有する。
アクセストークン記憶部35は、ストランド16に対応付けられ、メモリトークンが設定された共有メモリ21のセグメントをアクセスするためのアクセストークンを複数個記憶する。なお、図3において、各ストランド16が発行するリクエストについて、アクセストークン記憶部35に記憶された複数のアクセストークンを付加して送信する送信部は図示を省略している。
図4(A)、(B)、(C)は、アクセストークン記憶部13のいくつかの構成例を示す図である。図4(A)に示すアクセストークン記憶部13は、64ビットの1つのアクセストークンレジスタ131を有し、31〜0ビットにアクセストークン1を格納し、63〜32ビットにアクセストークン2を格納する例を示した図である。図4(A)では、2個のアクセストークンを1つのアクセストークンレジスタ131に格納する例を示しているが、さらに多くのアクセストークンを1つのレジスタに格納してもよい。
図4(B)に示すアクセストークン記憶部13は、それぞれ1つのアクセストークンを格納する複数のアクセストークンレジスタ132を有する例を示した図である。図4(B)の例では、予め格納することを予定するアクセストークンの数だけ、アクセストークンレジスタ132を設ける。ソフトウェアプログラムで更新可能なアクセストークンを格納するレジスタを複数設けておくことで、ソフトウェアプログラムによって任意のルールでアクセストークンを更新する処理を行うことができる。
図4(C)に示すアクセストークン記憶部13は、FIFO(First−In−First−Out)バッファ133を用いて複数のアクセストークンを格納する例を示した図である。FIFOバッファ133でアクセストークンを格納することにより、アクセストークンの更新の際に、自動的に最も古いアクセストークンを削除するとともに、新しいアクセストークンを追加することができる。
図5は、レジスタ部34の構成例を示す図である。レジスタ部34は、複数の汎用レジスタ341と、フォルトステータスレジスタ342と、フォルトアドレスレジスタ343と、トラップPC(TPC)レジスタ344とを含む。
汎用レジスタ341は、ストランド16においてロード命令やストア命令、各種演算命令を実行する際に使用される汎用レジスタである。フォルトステータスレジスタ342は、例外が発生した場合のステータスを記憶するレジスタである。フォルトアドレスレジスタ343は、メモリアクセスにおいて例外が発生した場合に、例外が発生したメモリアクセスのアクセス先のアドレスを記憶するレジスタである。TPCレジスタ344は、例外が発生した際のプログラムカウンタ(PC)を記憶するレジスタである。
図6は、判定部23の構成例を示す図である。判定部23は、共有メモリをアクセスするリクエストに含まれる複数のアクセストークンのいずれかが、リクエストのアクセス先に対応するメモリトークンに対応するかどうかに応じて、リクエストのメモリアクセスを許可するかどうかを判定する。
判定部23は、比較器231、232と、OR回路233と、インバータ回路234とを含む。比較器231は、リクエストに含まれるアクセストークン1と、メモリトークン記憶部22から読み出されたメモリトークンとを比較し、両者が一致すれば、Highレベルの信号を出力する回路である。比較器232は、リクエストに含まれるアクセストークン2と、メモリトークン記憶部22から読み出されたメモリトークンとを比較し、両者が一致すれば、Highレベルの信号を出力する回路である。
OR回路233は、比較器231と比較器232のいずれかの出力信号がHighレベルであれば、Highレベルを出力するOR回路である。OR回路233の出力は、アクセス許可信号としてメモリI/F回路24に出力される。メモリI/F回路24は、アクセス許可信号がHighレベルであれば、リクエストの共有メモリへのアクセスを実行する。
インバータ回路234は、例えば、OR回路233から出力されたアクセス許可信号を反転させてトークンエラー信号として出力する。このトークンエラー信号は、例えば、リクエストに対するエラー応答や、リクエストを発行したCPUコアへの例外を発生させるための信号として用いられる。
図7は、実施例1における、情報処理システムのハードウェアの論理構成及びソフトウェアの機能構成を示す図である。ここで、ハードウェアの論理構成は、CPUチップ11上で実行されるOSやアプリケーションが使用する論理的なハードウェア構成をいうものとする。図7では、1つのノード1を1つの論理ドメインとした場合の例を示す。また、1つの論理ドメインでは例えば1つのOSが実行される。
図7において、ハードウェアの論理構成は、上部の波線で囲まれた部分に示される。ノード1は、ハードウェアの論理資源として4つの仮想CPU(VCPU)51と、ローカルメモリ52と、共有メモリ53と、ディスク装置54とを有する。VCPU51は、論理的なCPUであり、図2に示される8つのストランド16のいずれかに対応する。
各VCPU51は、論理アドレス(VA)を用いてメモリアクセスを行うが、不図示のアドレス変換機構によって論理アドレス(VA)は実アドレス(RA)又は物理アドレス(PA)に変換されて、共有メモリのアクセスが行われる。ここで、「物理アドレス(PA)」とは、メモリの物理位置によって振り分けられるアドレスをいい、「実アドレス(RA)」とは、仮想化機能を導入したシステムで論理ドメイン毎に振り分けられるアドレスをいう。
ローカルメモリ52は、各ノード内のCPUコア12からのみアクセスされるメモリであり、共有メモリ53は、他のノード1からもアクセス可能なメモリである。ローカルメモリ52と共有メモリ53は、それぞれ図2中に示したメモリ17に含まれるローカルメモリ15と共有メモリ21に対応する。ディスク装置54は、図2中に示したディスクユニット18に対応する。
図7において、ソフトウェアの機能構成としては、ハイパーバイザ60と、オペレーティングシステム(OS)62が含まれる。
ハイパーバイザ60は、情報処理システム200の物理資源を管理してOS62に論理資源を提供する基本ソフトウェアであり、その機能の一つとして例外処理部61を有する。
例外処理部61は、情報処理システム200の物理資源を用いた処理等において発生した例外を、処理の実行を行ったノード1のOS62に通知する。その際、例外処理部61は、例外が発生した処理に関連する情報も合わせて通知を行う。例えば、共有メモリをアクセスする処理においてトークン不一致の例外が発生した場合には、例外処理部61は、その例外の種類がトークン不一致の例外であることと共に、例外が発生したアドレス等の情報も通知する。
OS62は、論理資源を用いてアプリケーションプログラムの実行を制御する。OS62は、共有メモリ管理部70を含む。共有メモリ管理部70は、共有メモリ53を管理し、トークン通知API71と、アクセストークン設定部72と、管理テーブル記録部73と、コンテキストスイッチ処理部74と、例外トラップハンドラ75と、トークン比較部76と、トークンエラー通知部77と、アクセストークン再設定部78と、アクセス再実行部79と、管理テーブル80とを有する。
ハイパーバイザ60の各機能およびOS62や共有メモリ管理部70に含まれるトークン通知API71と、アクセストークン設定部72と、管理テーブル記録部73と、コンテキストスイッチ処理部74と、例外トラップハンドラ75と、トークン比較部76と、トークンエラー通知部77と、アクセストークン再設定部78と、アクセス再実行部79の各機能は、情報処理システム200の各ノードが有するCPUチップ11やメモリ17等のハードウェア資源を用いて実行される。
トークン通知API71は、アプリケーションプログラムが、自プログラムが使用することを予定している共有メモリのセグメントに対応するトークン(以降、単に「トークン」という)をOS62に通知するAPI(Application Programming interface)手段である。VCPU51により実行されるアプリケーションプログラムは、自プログラムがアクセスすることを予定している共有メモリのセグメントに対応するトークンを、トークン通知API71を用いて予めOS62に通知する。アプリケーションプログラムがアクセスしようとしている共有メモリの各セグメントに対応するアクセストークンをOS62に通知するタイミングは、図10を用いて後述する。
アクセストークン設定部72は、アプリケーションプログラムからトークン通知API71を用いて通知されたアクセストークンを、アクセストークン記憶部35に設定する。アクセストークン設定部72は、アクセストークンの設定を行う際に、すでにアクセストークン記憶部35に複数のアクセストークンが設定されている場合、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部35の設定を行う。アクセストークン設定部72によるアクセストークンの設定処理は、図11〜図13を用いて後述する。
管理テーブル記録部73は、アプリケーションプログラムからトークン通知API71を用いて通知されたアクセストークンを、管理テーブル80に格納する。ここで、管理テーブル80は、ノード1毎に設けられ、他のノード1が有する共有メモリ53を含めて情報処理システム200が有する全ての共有メモリ53について、セグメント毎に共有メモリ53の情報を記憶するテーブルである。管理テーブル80は、例えばローカルメモリ52内の特定の領域に格納される。
アプリケーションプログラムが、アクセストークン記憶部35に設定できるアクセストークンの数よりも多いアクセストークンの設定を要求する場合がある。このような場合に備えて、管理テーブル記録部73は、ノード1毎に設けられる管理テーブル80に、トークン通知API71で通知されたアクセストークンを全て記録していく。
管理テーブル80の例は、図8を用いて後述する。また、管理テーブル記録部73によるアクセストークンの管理テーブルへの格納処理は図11〜図13を用いて後述する
コンテキストスイッチ処理部74は、CPUコア12のストランド16上で実行されるアプリケーションプログラムのプロセスを変更するコンテキストスイッチにおけるレジスタ等に記憶された情報の退避及び復元の処理を行う。具体的には、コンテキストスイッチ処理部74は、プロセスのスレッド毎に予め設けられた退避領域を使用して、アクセストークン記憶部35やレジスタ部34に記憶した情報の退避及び復元を行う。コンテキストスイッチ処理部74が、アクセストークン記憶部35に記憶されたアクセストークンの情報も含めてコンテキストスイッチの処理を行うことにより、コンテキストスイッチが発生しても、プロセスのスレッド毎に設定した最も新しいアクセストークンの設定値を引き継ぐことができる。コンテキストスイッチ処理部74による処理の詳細については、図14を用いて後述する。
例外トラップハンドラ75は、ストランド16上で実行されるアプリケーションプログラムの処理において例外が発生した場合の例外処理を行う。例外トラップハンドラ75は、発生した例外の内容に応じて、各例外に対する例外処理を行う処理部に処理を渡して必要な例外処理を実行させる。
例えば、アプリケーションプログラムが、共有メモリ53に対してアクセス(ロード又はストア)しようとした場合に、そのアクセスを行うリクエストに含まれる複数のアクセストークンとメモリトークンが対応しなければ、トークン不一致の例外トラップが発生する。
より具体的には、アクセス先の共有メモリ53のアクセスの判定を行う判定部23は、リクエストのアクセス先のセグメントに対応するメモリトークンが、リクエストに含まれる複数のアクセストークンのいずれとも一致しない場合、そのリクエストに対してトークン不一致によるエラー応答を行う。
リクエストの発行元のノード1の通信インターフェイス20等のハードウェア資源は、リクエストに対するエラー応答を受信すると、トークン不一致による例外を発生させる。トークン不一致によるハードウェア資源からの例外が発生すると、ハイパーバイザ60の例外処理部61は、トークン不一致の例外トラップをOS62に通知する。
OS62の例外トラップハンドラ75は、ハイパーバイザ60の例外処理部61から例外トラップを受信すると、まず、フォルトステータスレジスタ342をリードして、トラップ要因がトークン不一致によるものかどうかを判定する。トラップ要因がトークン不一致によるものであれば、例外トラップハンドラ75は、後述のトークン不一致の例外処理を行うトークン比較部76、アクセストークン再設定部78、アクセス再実行部79等に例外処理を実行させる。
なお、トークン不一致の例外トラップが発生した場合、その例外処理を行うストランド16のレジスタ部34に含まれるレジスタに例外トラップに関連する各種情報が記録される。トークン不一致の例外トラップが発生した場合にレジスタ部34に記録される情報としては、例えば、トークン不一致の例外トラップ発生に関する要因を示す情報がフォルトステータスレジスタ342に記録される。また、トークン不一致の例外トラップを発生させたリクエストがアクセス(ロード又はストア)しようとしていたアドレスであるフォルトアドレスの情報がフォルトアドレスレジスタ343に記録される。さらに、トークン不一致の例外トラップ発生の契機となったリクエストを実行しようとした命令のプログラムカウンタ(PC)の値が、TCPレジスタ344に記録される。
後述のトークン比較部76、アクセストークン再設定部78等は、レジスタ部34に記録された情報を参照して、例外トラップが発生した際の要因やアクセス先のアドレス、例外トラップを発生させたリクエストを実行した命令のPC値等の情報を取得する。これらの処理の詳細については図15〜17を用いて後述する。
トークン比較部76は、トークン通知API71でアプリケーションプログラムから指定されたトークンと、アクセストークン記憶部35に記憶した複数のアクセストークンとの比較を行う。例外トラップハンドラ75から呼び出されたトークン比較部76は、以下の処理を行う。
トークン比較部76は、まず、フォルトアドレスレジスタ343をリードして、トークン不一致の例外トラップが発生したフォルトアドレスの情報を取得する。トークン比較部76は、取得したフォルトアドレスの情報と管理テーブル80に格納された情報から、アプリケーションがアクセスしようとした共有メモリのセグメントを特定し、特定したセグメントのトークンの値を管理テーブル80から取得する。管理テーブル80から取得したトークンの値は、トークン通知API71でアプリケーションプログラムから指定されたトークンの値であり、共有メモリのアクセスをする際に、アクセストークン記憶部35に記憶しておく必要があるトークンである。
先にも述べたとおり、アクセストークン記憶部35に記憶したアクセストークンの数よりも、アプリケーションプログラムからトークン通知API71を介して通知されるトークンの数の方が多い場合がある。その場合、共有メモリをアクセスするリクエストに付加して送信すべきアクセストークンがアクセストークン記憶部35に記憶されていない場合がある。
従って、トークン比較部76は、例外を発生させたリクエストがアクセスしようとしていた共有メモリのセグメントに対応する、管理テーブル80に格納されたトークンと、アクセストークン記憶部35に記憶されている複数のアクセストークンとを比較する。そして、比較の結果に応じて、後述のトークンエラー通知部77又はアクセストークン再設定部78の処理を実行させる。トークン比較部76の処理の詳細については図15〜17を用いて後述する。
トークンエラー通知部77は、アプリケーションプログラムに対して、トークンの設定エラーがあることを示すシグナルを通知するAPIである。トークンエラー通知部77は、管理テーブル80から読み出された特定のセグメントに対するトークンが「0」である場合、すなわち、そのセグメントに対するトークンが未設定の場合、アプリケーションプログラムにトークン未設定のシグナルを通知する。
トークンエラー通知部77は、トークン比較部76の比較の結果、管理テーブル80から取得したトークンがアクセストークン記憶部35に記憶した複数のアクセストークンのいずれかに一致した場合、アプリケーションプログラムにトークン不一致のシグナルを通知する。
アクセストークン記憶部35に記憶した複数のアクセストークンのいずれかと、アプリケーションプログラムがトークン通知API71で通知したトークンとが一致した状態でトークン不一致の例外トラップを受信した場合、トークンの設定エラーがあることになる。すなわち、トークン通知API71で通知されたトークンがアクセストークン記憶部35に正しく設定されているにもかかわらず、トークン不一致の例外トラップが発生しているので、トークン通知API71で通知されたトークンに問題があることになる。
この場合、ホームノードのメモリトークンと、ホームノード又はリモートノードでアプリケーションプログラムが設定したトークンとが対応していないので、トークンエラー通知部77は、アプリケーションプログラムにトークン不一致のシグナルを通知する。トークン不一致のシグナルには、例えば、トークン不一致の例外トラップが発生したフォルトアドレスや、トラップPCの情報を含めることができる。
アクセストークン再設定部78は、トークン比較部76の比較の結果、管理テーブル80から取得したトークンがアクセストークン記憶部35に記憶した複数のアクセストークンのいずれにも一致しない場合、アクセストークン記憶部35の再設定を行う。再設定に際して、アクセストークン再設定部78は、トークン不一致の例外トラップを発生させたリクエストがアクセスしようとしていた共有メモリのセグメントに対応するトークンを管理テーブル80から読み出して、アクセストークン記憶部35に再設定する。
アクセストークン記憶部35の再設定を行う際、アクセストークン再設定部78は、すでにアクセストークン記憶部35に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部35の設定を行う。アクセストークン再設定部78によるアクセストークンの再設定処理は、図15〜17を用いて後述する。
アクセス再実行部79は、アクセストークン再設定部78によるアクセストークンの再設定を行った後、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する。再設定されたアクセストークンは、トークンの設定ミスがない限りアクセス先のセグメントに対応するメモリトークンと一致するので、再実行されたメモリアクセスは正常にアクセスされることになる。アクセス再実行部79の処理についても、図15〜17を用いて後述する。
図8は、ノード毎に作成する共有メモリのセグメントの管理テーブル80の一例を示す図である。図8は、ノード番号が「0」であるノード0の管理テーブル80−0の例と、ノード番号が「1」であるノード1の管理テーブル80−1の例と、ノード番号が「2」であるノード2の管理テーブル80−2の例を示す。ここで、ノード0とノード1はホームノードであり、ノード2はリモートノードであるものとする。
図8において、セグメント番号が「0」〜「4」のセグメントは、ノード0がホームノードとして物理メモリを有するセグメントであり、セグメント番号が「16」〜「20」のセグメントは、ノード1がホームノードとして物理メモリを有するセグメントである。この場合、図8に示す管理テーブル80−0は、ノード0の共有メモリ53のセグメントの管理テーブルであり、管理テーブル80−1は、ノード1の共有メモリ53のセグメントの管理テーブルである。また、管理テーブル80−2は、リモートノードであるノード2が有する、セグメント「0」〜「4」、「16」〜「20」の管理テーブルである。
図8に示すように、管理テーブル80は、セグメント番号と、アドレスと、セグメントサイズと、使用許可ノード番号と、使用中アプリのPIDと、トークンとを記憶する。
セグメント番号は、共有メモリ53に含まれるセグメントを識別する識別番号である。アドレスは、セグメントの物理アドレス(PA)の先頭番地を示す。なお、情報処理システムにおいて実アドレス(RA)を使用する場合、RAをアドレスとしてもよい。
セグメントサイズは、セグメントのサイズである。使用許可ノード番号は、ホームノードの管理テーブル80でのみ用いられ、セグメントの使用が許可されたノード1の番号である。使用中アプリのPIDは、自ノードにおいてセグメントを使用するアプリケーションプログラムのプロセスIDである。
トークンは、ホームノードのセグメントの場合にはメモリトークンであり、リモートノードのセグメントの場合にはアクセストークンである。すなわち、図8における管理テーブル80−0、80−1のセグメント「0」〜「4」、「16」〜「20」のトークンはメモリトークンであり、管理テーブル80−2の対応するセグメントのトークンはアクセストークンである。
例えば、ノード0の管理テーブル80−0では、識別番号が「0」であるセグメントは、PAが16進数で「000000000」であり、サイズが「256MB」であり、使用が許可されたノードの番号は「0」及び「2」である。また、セグメント番号が「0」であるセグメントは、ホームノードであるノード0においてプロセスIDが「123」、「456」などのプロセスで使用されており、メモリトークンが16進数で「123」である。
一方、ノード2の管理テーブル80−2では、セグメント番号が「0」であるセグメントは、アドレスとセグメントサイズは管理テーブル80−0と同じ情報が記憶されている。しかし、ノード2はホームノードではないため、セグメント番号が「0」の使用許可ノード番号はなく、リモートノードであるノード2においてプロセスIDが「321」、「654」などのプロセスでセグメント「0」が使用されている。また、ノード2はリモートノードであることから、トークンとしては、アクセストークンが16進数で「123」として記憶されている。
なお、図8においては、説明上必要なセグメント番号の例しか示していないが、各ノードにおける管理テーブル80のそれぞれに、すべてのノードの共有メモリのセグメント番号に対応する情報を格納するようにしても良い。
次に、図9、図10を参照しながら、情報処理システム200による情報処理方法の概要について説明する。
図9は、実施例1に係る複数のアクセストークンを用いた共有メモリアクセス時の処理の概要を示すフローチャートである。まず、アプリケーションプログラムが、トークン通知API71を使用して、アプリケーションプログラムが使用を予定している共有メモリの各セグメントのトークンをOS62に通知する(S101)。
OS62は、トークン通知API71によって通知されたトークンを、管理テーブル80に記録する(S102)。また、OS62は、トークン通知API71によって通知されたトークンを、アクセストークン記憶部35に複数設定する(S103)。
その後、アプリケーションプログラムのプロセスが、共有メモリを使用しながら、処理を行う。その際、プロセスの変更を行うコンテキストスイッチが発生した場合(S104YES)、アクセストークン記憶部35のレジスタを含むプロセスの処理で必要となるレジスタの値を退避し、切り替え先のプロセスのレジスタの情報を復元する(S105)。コンテキストスイッチが発生しない限り(S104 NO)、アプリケーションプログラムが、共有メモリにアクセスしながら処理を行う(S106)。アプリケーションプログラムの共有メモリを利用した処理は、例外トラップが発生しない限り継続して行われる(S107 NO)。
アプリケーションプログラムによる共有メモリのアクセスで例外トラップが発生した場合(S107 YES)、OS62は、例外トラップを発生させた例外の要因の情報を取得する(S108)。例外トラップを発生させた例外の要因がトークンの不一致によるものであれば、ステップS110の処理に進み、要因がトークンの不一致でなければ、他の例外処理が行われる(S109)。
ステップS110では、OS62が、トークン不一致の例外トラップを発生させた共有メモリアクセスを行うリクエストのアクセス先のアドレスに対応するセグメントを特定する。そして、OS62は、特定したセグメントに対して設定されたトークンを、管理テーブル80から取得する。なお、管理テーブル80には、トークン通知API71により通知された全てのトークンの値が格納されている。
OS62は、管理テーブル80から取得したトークンの値と、アクセストークン記憶部35に記憶された複数のアクセストークンのそれぞれの値とを比較する(S110)。管理テーブル80から取得したトークンの値が、アクセストークン記憶部35に記憶された複数のアクセストークンの一つとでも一致する場合(S111 YES)には、アプリケーションプログラムによるトークンの設定に問題があることになる。すなわち、アクセストークンが正しく設定されている状態で、トークン不一致による例外トラップが発生すれば、アクセス先のセグメントに設定されているメモリトークンと、アプリケーションプログラムが設定したトークンとが対応していないことになる。この場合、OS62は、アプリケーションプログラムにトークン通知API71を用いて通知されたトークンがメモリトークンに一致していないことを通知する(S112)。
管理テーブル80から取得したトークンと、アクセストークン記憶部35に記憶された複数のアクセストークンとが一致しない場合(S111 NO)、OS62は、管理テーブル80から取得したトークンをアクセストークン記憶部35に設定する(S113)。アクセストークン記憶部35の再設定を行う際、OS62は、最も古いアクセストークンを削除するとともに、管理テーブル80から取得したトークンを設定する(S113)。
そして、OS62は、トークン不一致の例外トラップが発生した共有メモリのアクセスを再実行する(S114)。この場合、アクセス先の共有メモリのセグメントに対応するトークンがアクセストークンとしてリクエストに付加されて送信されるので、共有メモリをアクセスするリクエストは正常に実行される。
本実施形態では、リクエストに2個以上のアクセストークンを付加して送信し、複数のアクセストークンとメモリトークンとを比較してアクセスを許可することで効率的にアクセス制御を行うことが可能となる。例えば、図22のようにセグメントAからセグメントBへのデータ転送を行う場合でも、図9のトークン不一致の例外トラップ処理(S110〜S114)を行えば、最大2回のアクセストークンの再設定をするだけで、それ以降は正常にメモリをアクセスできる。
図10は、ノード間共有メモリのメモリ構成を有する情報処理システム200において、複数のノードにおいてアプリケーションプログラムがアクセストークンを用いて共有メモリのアクセスを行う場合の処理の一例を示すフローチャートである。図10の例では、ホームノードにおいては、共有メモリを使用するアプリケーションプログラムHを起動し、リモートノードNにおいては、共有メモリを使用するアプリケーションプログラムRを起動することとする。
まず、ホームノードで起動されたアプリケーションプログラムH(以下、「プログラムH」と記載)は、プログラムH自身が使用する共有メモリのセグメントAを獲得する(S121)。そして、プログラムHがセグメントAを獲得すると、OS62は、管理テーブル80にセグメントAを使用するプログラムHのプロセスID(PID)を追加する(S122)。
プログラムHが、リモートノードNで実行されるアプリケーションプログラムR(以下、「プログラムR」と記載)にもセグメントAの使用を許可する場合、リモートノードNにセグメントAの使用を許可し、リモートノードNに通知する(S123)。
ホームノードのセグメントAの使用の許可の通知を受けたリモートノードNは、プログラムRに共有メモリのセグメントAを割り当てる(S141)。そして、リモートノードNのOS62は、リモートノードNの管理テーブル80のセグメントAの情報に、セグメントAを使用するプログラムRのPIDを追加する(S142)。
プログラムHがプログラムRによるセグメントAの使用を許可したことを受けて、ホームノードのOS62は、管理テーブル80にセグメントAを使用するリモートノードNのノードIDを追加する(S124)。また、ホームノードのOS62は、セグメントAのメモリトークンをメモリトークン記憶部22に設定する(S125)。その後、ホームノードのプログラムHは、リモートノードNで動作するプログラムRに対して、セグメントAに対して設定されたメモリトークンに対応するトークンを通知する(S126)。
リモートノードNのプログラムRは、プログラムHからのトークンの通知を受信して、セグメントA用のトークンを認識する(S143)。そして、プログラムRは、セグメントA用のトークンをリモートノードNのOS62に通知する(S144)。リモートノードNのOS62は、プログラムRから通知されたセグメントAのトークンを、リモートノードNの管理テーブル80に追加し(S145)、セグメントAのトークンをリモートノードNのアクセストークン記憶部35に設定する(S146)。
一方、ホームノードのプログラムHは、セグメントAのメモリトークンに対応するトークンをホームノードのOS62に通知する(S127)。ホームノードのOS62は、プログラムHから通知されたセグメントAのトークンを、ホームノードの管理テーブル80に追加し(S128)、セグメントAのトークンをホームノードのアクセストークン記憶部35に設定する(S129)。
その後、ホームノードのプログラムHは、プログラムHが行う処理においてセグメントAのデータを参照又は更新して処理を行う(S130)。また、リモートノードNにおいても、プログラムRは、プログラムRが行う処理においてセグメントAのデータを参照又は更新して処理を行う(S147)。
なお、図10の例では、ホームノードのプログラムHとリモートノードNのプログラムRのそれぞれが共有メモリのセグメントAを使用する場合を説明しているが、一般に、プログラムHとプログラムRとが複数のセグメントを使用する場合がある。そして、プログラムHやプログラムRが使用するセグメントの数が、それぞれのノードのアクセストークン記憶部35に設定できるアクセストークンの数よりも多い場合、プログラムH、Rのアクセス先によってはトークン不一致の例外トラップが発生する。つまり、ステップS129、S146で設定したアクセストークンと、プログラムH、Rがアクセスするセグメントに対応するメモリトークンとが一致しない場合、トークン不一致の例外トラップが発生する。その場合、トークン不一致の例外トラップが発生したノードのOS62が、後述の例外トラップの例外処理を実行して、アクセストークンの更新を行う(S130、S147)。
ホームノードのプログラムH及びリモートノードNのプログラムRが、セグメントAを使用した処理を完了して、セグメントAを使用しなくなった場合、各ノードのプログラムH、Rは、各ノードのOS62にセグメントAのアクセストークンの解除を指示する(S131、S148)。そして、リモートノードNのプログラムRは、セグメントAの使用終了をホームノードに通知する(S149)。
ホームノードは、リモートノードNからの通知を受けて、リモートノードNによるセグメントAの使用終了を認識する(S132)。ホームノードのOS62は、管理テーブル80からセグメントAの使用を終了したリモートノードNのノードIDを削除する(S133)。また、ホームノードのOS62は、ホームノードのメモリトークン記憶部22に記録されたセグメントAのメモリトークンの設定を解除する(S134)。
その後、ホームノードのOS62は、ホームノードの管理テーブル80からセグメントAのトークンとプログラムHのPIDを削除し(S135)、プログラムHを終了する。また、リモートノードNのOS62は、リモートノードの管理テーブル80からセグメントAのトークンとプログラムRのPIDを削除し(S150)、プログラムRを終了する。
先にも説明したとおり、アプリケーションプログラムが使用を予定している共有メモリのセグメントの数が、アクセストークン記憶部35に設定できるアクセストークンの数よりも多い場合が十分あり得る。そのような場合、アプリケーションプログラムが共有メモリをアクセスする度にトークンの設定を行うことは、プログラムを作成する上で効率的であるとは言えない。そのため、アプリケーションプログラムが最初に使用する複数のトークンをOS62に通知した後は、アプリケーションプログラムがトークンを意識せずに共有メモリをアクセスすることが望ましい。
本実施形態では、アプリケーションプログラムが最初にトークンをOS62に通知した後は、OS62の共有メモリ管理部70が自動的にアクセストークンの再設定等の処理を行うことで、アプリケーションプログラムがトークンを意識せずに共有メモリをアクセスできる。
図11は、アクセストークン設定部72及び管理テーブル記録部73によって2個のアクセストークンを設定する処理の一例を示すフローチャートである。まず、アプリケーションプログラムは、自プログラムがアクセスすることを予定している共有メモリのセグメント(A)に対応するトークン(T)を、トークン通知API71を用いてOS62に通知する(S151)。OS62の管理テーブル記録部73は、トークン通知API71から通知されたセグメント(A)のトークン(T)を、管理テーブル80のセグメント(A)のトークンの情報として記録する(S152)。
また、OS62のアクセストークン設定部72は、トークン通知API71から通知されたセグメント(A)のトークン(T)を、アクセストークン記憶部35に設定する。その際、すでにアクセストークン記憶部35に複数のアクセストークンが設定されている場合、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部35の設定を行う。
具体的には、アクセストークン設定部72は、アクセストークン記憶部35をリードして、アクセストークン1の値(A1)を得る(S153)。そして、アクセストークン記憶部35のアクセストークン2に、ステップS153で取得したアクセストークン1の値(A1)を設定する(S154)。その後、ステップS151でトークン通知API71から通知されたセグメント(A)のトークン(T)をアクセストークン記憶部35のアクセストークン1に設定する(S155)。
このようなステップS153〜S155の手順によりアクセストークン記憶部35の設定を行うことにより、トークンの設定を行った時間がより新しいトークンの設定値がアクセストークン記憶部35に残るように制御することができる。
なお、アクセストークン記憶部35に対して最初に設定を行う場合のように、アクセストークン1とアクセストークン2を一度に設定できる場合には、S153、S154の処理を省略して、アクセストークン1とアクセストークン2とを一度に設定してもよい。
図12は、アクセストークン設定部72及び管理テーブル記録部73によって4個のアクセストークンを設定する処理の一例を示すフローチャートである。図12のS161、S162は、それぞれ図11のS151、S152に対応するため、説明を省略する。
アクセストークン記憶部35に4つのアクセストークンを設定する場合、まず、アクセストークン記憶部35をリードしてアクセストークン3、2、1の値(A3、A2、A1)を得る(S163)。次に、アクセストークン4にアクセストークン3の値(A3)を設定し(S164)、アクセストークン3にアクセストークン2の値(A2)を設定し(S165)、アクセストークン2にアクセストークン1の値(A1)を設定する(S166)。
その後、S161でトークン通知API71から通知されたセグメント(A)のトークン(T)をアクセストークン記憶部35のアクセストークン1に設定する(S167)。なお、アクセストークン1〜アクセストークン4を一度に設定できる場合には、S163〜S166の処理を省略して、アクセストークン1〜アクセストークン4を一度に設定してもよい。
図13は、アクセストークン設定部72及び管理テーブル記録部73によってN個のアクセストークンを設定する処理の一例を示すフローチャートである。図13のS171、S172は、それぞれ図11のS151、S152に対応するため、説明を省略する。
アクセストークン記憶部35にN個のアクセストークンを設定する場合、まず、アクセストークン記憶部35をリードしてN個のアクセストークンの値(A(N)、A(N−1)、・・・、A2、A1)を得る(S173)。次に、アクセストークン(N)にアクセストークン(N−1)の値(A(N−1))を設定し(S174)、アクセストークン(N−1)にアクセストークン(N−2)の値(A(N−2))を設定する(S175)。同様の処理を繰り返し、アクセストークン2にアクセストークン1の値(A1)を設定する(S176)。
その後、S171でトークン通知API71から通知されたセグメント(A)のトークン(T)をアクセストークン記憶部35のアクセストークン1に設定する(S177)。なお、アクセストークン1〜アクセストークンNを一度に設定できる場合には、S173〜S176の処理を省略して、アクセストークン1〜アクセストークンNを一度に設定してもよい。
図14は、コンテキストスイッチの処理におけるアクセストークンの退避及び復元を行う処理の一例を示すフローチャートである。
コンテキストスイッチ処理部74は、OS62からの指示を受けて、CPUコア12のストランド16上で実行されるアプリケーションプログラムのプロセスを変更するコンテキストスイッチにおけるレジスタ等に記憶された情報の退避及び復元の処理を行う。ここでは、ストランド16上で実行されているプロセスのスレッドAをスレッドBに変更するコンテキストスイッチを行う場合を例に説明する。
コンテキストスイッチ処理部74は、OS62からスレッドAをスレッドBに変更するコンテキストスイッチの指示を受けると、まずスレッドAの実行を停止させる(S181)。次に、コンテキストスイッチ処理部74は、アクセストークン記憶部35をリードしてアクセストークン1、アクセストークン2、・・・、アクセストークンNの値を得る(S182)。そして、取得したN個のアクセストークンを、ローカルメモリ52等に設けられるスレッドAの退避領域に保存する(S183)。その際、レジスタ部34に含まれるレジスタのうち、スレッドAの処理に関する情報を保持しているレジスタの値もスレッドAの退避領域に保存する。
スレッドAに関するレジスタの情報の退避を行った後、コンテキストスイッチ処理部74は、スレッドBの退避領域から、保存しておいたスレッドBのN個のアクセストークンを読み出し(S184)、読み出したN個のアクセストークンを、アクセストークン記憶部35に設定する(S185)。その際、スレッドBの実行に必要な他のレジスタの値についてもスレッドBの退避領域から読み出して設定を行う。
スレッドBに関するレジスタの情報の復元を行ったあと、コンテキストスイッチ処理部74は、スレッドBを起動し(S186)、コンテキストスイッチの処理を完了する。
図15は、2個のアクセストークンを用いて共有メモリをアクセスしてトークン不一致の例外トラップが発生した場合の処理の一例を示すフローチャートである。
アクセストークンを用いて共有メモリをアクセスする処理において、例外トラップが発生しなければアクセスは実行される(S201 NO)。共有メモリをアクセスする際に、アクセスを行うリクエストに含まれる複数のアクセストークンとメモリトークンが一致しなければ、トークン不一致の例外トラップが発生する。トークン不一致の例外トラップが発生すると(S201 YES)、例外トラップを受信した例外トラップハンドラ75は、フォルトステータスレジスタ342をリードして、トラップ要因の情報を得る(S202)。
フォルトステータスレジスタ342から取得したトラップ要因がトークン不一致によるものであれば(S203 YES)、処理はステップS205へ進み、例外トラップハンドラ75は、トークン比較部76によるトークンの比較処理を実行させる。フォルトステータスレジスタ342から取得したトラップ要因がトークン不一致によるものでなければ(S203 NO)、例外トラップハンドラ75は、他の例外処理を実行する(S204)。
ステップS205において、トークン比較部76は、フォルトアドレスレジスタ343をリードして、トークン不一致の例外トラップが発生したフォルトアドレスの情報を取得する。トークン比較部76は、取得したフォルトアドレスの情報と管理テーブル80に格納された情報から、アプリケーションがアクセスしようとした共有メモリのセグメントを特定し、特定したセグメントのトークンの値(T)を管理テーブル80から取得する(S206)。
管理テーブル80から取得したトークンの値(T)が「0」の場合(S207 YES)、トークン比較部76は、トークンエラー通知部77に、トークン未設定のシグナルをアプリケーションプログラムに対して通知させる(S208)。管理テーブル80から取得したトークンの値(T)が「0」でない場合、処理はステップS209に進み、トークン比較部76はトークンの比較処理を行う。なお、本実施例において、トークンの値(T)が「0」の場合をトークンが未設定の状態であるとしているが、トークン未設定の定義は任意に行うことができ、例えば16進数で「FFF」をトークン未設定と定義してもよい。
ステップS209では、トークン比較部76は、まず、アクセストークン記憶部をリードして、アクセストークン1の値(A1)及びアクセストークン2の値(A2)を取得する。
管理テーブル80から取得したトークンの値(T)が、アクセストークン1の値(A1)と一致する場合(S210 YES)、処理はS211に進む。この場合、TとA1が一致しているにもかかわらずメモリトークンとのトークン不一致の例外トラップが発生しているので、トークンの設定に問題があることになる。そのため、トークン比較部76は、トークンエラー通知部77に、アプリケーションプログラムに対してトークン不一致のシグナルを送信させる(S211)。
トークン(T)とアクセストークン(A1)が一致していない場合(S210 NO)、次にトークン(T)とアクセストークン(A2)の比較を行う(S212)。トークン(T)とアクセストークン(A2)とが一致する場合(S212 YES)、ステップS211と同様に、トークン比較部76は、トークンエラー通知部77にトークン不一致のシグナルを送信させる(S213)。
トークン(T)とアクセストークン(A2)が一致せず、すべてのアクセストークンについてトークン(T)と一致していないことを確認すると(S212 NO)、処理はステップS214に進む。
ステップS214では、アクセストークン再設定部78がアクセストークンの再設定を行う。アクセストークン記憶部35の再設定を行う際、アクセストークン再設定部78は、すでにアクセストークン記憶部35に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部35の設定を行う。
具体的には、アクセストークン再設定部78は、アクセストークン記憶部35のアクセストークン2に対して、アクセストークン1の設定値(A1)を設定する(S214)。次に、アクセストークン1に対して、管理テーブル80から取得したトークン(T)の値を設定する(S215)。
アクセストークン再設定部78によるアクセストークンの再設定を行った後、アクセス再実行部79が、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する(S216)。再設定されたアクセストークンは、トークンの設定ミスがない限りアクセス先のセグメントに対応するメモリトークンと一致するので、再実行されたメモリアクセスは正常にアクセスされることになる。その後、処理はステップS201に戻り、後続の処理を実行する。
図16は、4個のアクセストークンを用いて共有メモリをアクセスしてトークン不一致の例外トラップが発生した場合の処理の一例を示すフローチャートである。ステップS221〜ステップS228の処理は、図15のステップS201〜ステップS208の処理と同じであるので説明を省略する。
図16では、4個のアクセストークンを用いる場合を示しているので、ステップS229では、トークン比較部76は、アクセストークン記憶部をリードして、4個のアクセストークンの値(A1、A2、A3、A4)を取得する。そして、管理テーブル80から取得したトークン(T)と4個のアクセストークン(A1、A2、A3、A4)のそれぞれを比較して、一致するかどうかを判定する(S230、S232、S234、S236)。トークン(T)と4個のアクセストークン(A1、A2、A3、A4)のいずれかが一致すれば、トークン(T)とアクセストークンが一致しているにもかかわらずメモリトークンとの不一致による例外が発生しているので、トークンの設定に問題があることになる。そのため、トークン比較部76は、トークンエラー通知部77に、アプリケーションプログラムに対してトークン不一致のシグナルを送信させる(S231、S233、S235、S237)。
ステップS238では、アクセストークン再設定部78がアクセストークンの再設定を行う。アクセストークン記憶部35の再設定を行う際、アクセストークン再設定部78は、すでにアクセストークン記憶部35に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部35の設定を行う。
図16の場合、4個のアクセストークンを使用しているので、アクセストークン4にアクセストークン3の値(A3)を設定し(S238)、アクセストークン3にアクセストークン2の値(A2)を設定する(S239)。そして、アクセストークン2にアクセストークン1の値(A1)を設定し(S240)、アクセストークン1に対して、管理テーブル80から取得したトークン(T)の値を設定する(S241)。
アクセストークン再設定部78によるアクセストークンの再設定を行った後、アクセス再実行部79が、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する(S242)。
図17は、N個のアクセストークンを用いて共有メモリをアクセスしてトークン不一致の例外トラップが発生した場合の処理の一例を示すフローチャートである。ステップS251〜ステップS258の処理は、図15のステップ201〜ステップS208の処理と同じであるので説明を省略する。
図17では、N個のアクセストークンを用いる場合を示しているので、ステップS259では、トークン比較部76は、アクセストークン記憶部をリードして、N個のアクセストークンの値(A1、A2、・・・、A(N))を取得する。そして、管理テーブル80から取得したトークン(T)とN個のアクセストークン(A1、A2、・・・、A(N))のそれぞれを比較して、一致するかどうかを判定する(S260、S262、S234)。トークン(T)とN個のアクセストークン(A1、A2、・・・、A(N))のいずれかが一致すれば、トークン(T)とアクセストークンが一致しているにもかかわらずメモリトークンとの不一致による例外が発生しているので、トークンの設定に問題があることになる。そのため、トークン比較部76は、トークンエラー通知部77に、アプリケーションプログラムに対してトークン不一致のシグナルを送信させる(S261、S263、S265)。
ステップS266では、アクセストークン再設定部78がアクセストークンの再設定を行う。アクセストークン記憶部35の再設定を行う際、アクセストークン再設定部78は、すでにアクセストークン記憶部35に設定されている複数のアクセストークンのうち、最も古いアクセストークンよりも新しいアクセストークンの設定値が残るようにアクセストークン記憶部35の設定を行う。
図17の場合、N個のアクセストークンを使用しているので、アクセストークン(N)にアクセストークン(N−1)の値(A(N−1))を設定し(S266)、アクセストークン(N−1)以下のアクセストークンについても同様に設定していく。そして、アクセストークン2にアクセストークン1の値(A1)を設定し(S267)、アクセストークン1に対して、管理テーブル80から取得したトークン(T)の値を設定する(S268)。
アクセストークン再設定部78によるアクセストークンの再設定を行った後、アクセス再実行部79が、再設定されたアクセストークンを用いてトークン不一致の例外トラップが発生したアクセス先に対して再度アクセスを実行する(S269)。
図18は、2個のアクセストークンを使用して共有メモリ間のデータのコピーをする場合の処理の一例を示すフローチャートである。元々アプリケーションプログラムが2個のセグメントしか使用しない場合、あるいは、データのコピーを行う際の転送元のセグメントAと転送先のセグメントBのトークン(a、b)を把握している場合、予め適切なアクセストークンを設定できる。
この例の場合、アクセストークン設定部72は、例えばアクセストークン記憶部35のアクセストークン1に「a」を設定し(S271)、アクセストークン2に「b」を設定する(S272)。そして、N回分、セグメントAの領域からデータを汎用レジスタ341に含まれるレジスタXにデータをロードし(S273)、次に、レジスタXのデータをセグメントBの領域へストアする(S274)。
ステップS273とステップS274のロードとストアのそれぞれの処理において、セグメントA、Bをアクセスする各リクエストは、アクセストークン記憶部35に記憶された2つのアクセストークン(a、b)を付加して送信される。各リクエストに付加される2つのアクセストークンの値「a」、「b」は、セグメントAのメモリトークン(a)、セグメントBのメモリトークン(b)と一致するので、トークン不一致の例外を発生させることなく正常にアクセスすることができる。
本実施形態では、共有メモリの複数のセグメントをアクセスする各リクエストに対して、予めアクセストークン記憶部35に格納しておいた複数のアクセストークンを付加して送信する。そして、判定部23でメモリトークンと、リクエストに付加された複数のアクセストークンのそれぞれとを比較するようにすることで、図22に示されるような、アプリケーションプログラムがメモリアクセスする度にトークンを設定しなおす処理を省略できる。従って、異なるメモリトークンが設定された複数のメモリ領域にアクセスを行う際の、アクセストークンの再設定のオーバーヘッドを低減することができ、共有メモリのアクセス性能を向上することができる。
図19は、2個のアクセストークンを使用して共有メモリ間のデータ(N×8バイト)のコピーをする場合であって、アプリケーションプログラムが4つの共有メモリのセグメントを使用することを予定している場合の処理の一例を示すフローチャートである。図19の例では、説明のために、データの転送元のセグメントAのトークン「a」と、データ転送先のセグメントBのトークン「b」の各トークンと異なるトークン「c」及び「d」を、アクセストークン記憶部35に設定してからデータのコピー処理をするものとする。
まず、アクセストークン設定部72が、アクセストークン記憶部35のアクセストークン1にトークン「c」を設定し(S281)、アクセストークン2にトークン「d」を設定する(S282)。この状態でアプリケーションプログラムがセグメントAの領域のデータを8バイトロードすると、リクエストに付加されるアクセストークンは「c」と「d」であり、セグメントAのトークン「a」とは一致しないので、例外トラップが発生する(S283)。
トークン不一致による例外トラップが発生すると、図15に示すような例外トラップ処理が行われ、図19のステップS284,S285において、アクセストークン1にセグメントAのトークン「a」が、アクセストークン2にトークン「c」が設定される。その後、セグメントAの領域のデータをレジスタXに8バイトロードする命令を再実行すると、リクエストにはアクセストークン「a」が含まれているので、トークン不一致のエラーは発生せず、セグメントAから正常にデータをロードできる(S286)。
ステップS286でセグメントAのデータを8バイトロードしてレジスタXに格納した後、アプリケーションプログラムが、レジスタXのデータをセグメントBに8バイトストアする(S287)。ここで、セグメントBへのストアを行うリクエストにはアクセストークン「c」と「a」が含まれているが、セグメントBのトークン「b」は含まれていない。そのため、セグメントBへのストアに対してはトークン不一致の例外トラップが発生する(S287)。
セグメントBへのストアで例外トラップが発生した場合にも、図15に示すような例外トラップ処理が行われ、図19のステップS288、S289において、アクセストークンの再設定処理が行われる。この場合、アクセストークン2には、アクセストークン1の値「a」が設定され(S288)、アクセストークン1には、セグメントBに対応するトークン「b」が設定されることになる(S289)。その後、セグメントBへの8バイトストアを再実行すると、リクエストにはアクセストークン「b」が含まれているので、トークン不一致のエラーは発生せず、セグメントBに正常にデータをストアできる(S290)。
その後のアクセスにおいては、アクセストークン記憶部35にはアクセストークンとして「a」と「b」とが記憶されているので、セグメントAとセグメントBの各領域をアクセスするリクエストにはアクセストークン「a」と「b」とが付加されて送信される。そのため、アプリケーションプログラムが継続してセグメントAとセグメントBとを交互にアクセスしてもトークン不一致による例外トラップは発生せず、正常に共有メモリ間のデータ転送を行うことができる。つまり、ステップS291のロード処理とステップS292のストア処理とをN−1回繰り返すことでN×8バイトのセグメントA、B間のデータ転送を行うことができる。
図19の例では、最初にステップS283〜ステップS290のオーバーヘッドが生じるが、その後の処理においてはトークン不一致の例外トラップは発生しない。そのため、セグメント間で転送するデータの量が大きい場合には、図19におけるオーバーヘッドは無視できる程度となる。
図19の例でも示されるように、本実施形態では、共有メモリの複数のセグメントをアクセスする各リクエストに対して、予めアクセストークン記憶部35に格納しておいた複数のアクセストークンを付加して送信する。そして、判定部23において、リクエストごとにメモリトークンがリクエストに含まれる複数のアクセストークンのいずれかと対応するかに応じてアクセスを判定する。従って、複数のセグメント間でデータのコピーをするような場合でも、データの転送元と転送先のアクセスの度にアクセストークンを設定しなおす必要がなく、アクセストークンの再設定のオーバーヘッドを低減することができる。結果として、共有メモリのアクセス性能を向上することができる。
また、本実施態様では、トークン不一致による例外トラップが発生した場合には、図15に示すような例外トラップ処理をOS62の共有メモリ管理部70が行う。そのため、アプリケーションプログラムが使用を予定しているトークンの数がアクセストークン記憶部35に記憶したアクセストークンの数よりも多い場合でも、アプリケーションプログラムがトークンの再設定処理を意識する必要がない。従って、共有メモリの異なるセグメント間のデータ転送を行うような場合であっても、アプリケーションプログラムによるアクセストークンの再設定処理を行う必要がなく、共有メモリのアクセスを効率的に行うことができる。
(実施例2)
図20は、実施例2に係る情報処理システム300の構成例を示す図である。図20に示すように、情報処理システム300は、複数のノード5と共有メモリ部6とを有する。図1の場合と同様、波線で示されている共有メモリ部6は、複数のノードからアクセス可能な共有ストレージ装置とすることもできるし、各ノード5に備えられるようにして、複数のノード5で共有することもできる。以下の説明では、便宜上、共有メモリ部6が各ノード5に設けられ、図2、図3で示されるようなノード間共有メモリの情報システムにおいて使用されていることを前提に説明する。
各ノード5に設けられるCPU81は、CPUコア12と、アクセストークン記憶部13と、送信部14と、判定部82と、複製メモリトークン記憶部83と、リクエスト発行制御部84とを有する。CPUコア12、アクセストークン記憶部13、送信部14については、図1に示されるものと同じであるため、説明を省略する。
実施例2に係る情報処理システム300では、図20に示されるように、実施例1とは異なり、各リモートノード側のCPU81に判定部82と複製メモリトークン記憶部83とを有する点に特徴がある。判定部23と複製メモリトークン記憶部26とは、CPUコア12毎に設けられる。各CPUコア12が、図2、図3に示される複数のストランド16を有する場合には、判定部23と複製メモリトークン記憶部26とをストランド16毎に設けることができる。
複製メモリトークン記憶部83は、対応するCPUコア12がアクセスすることを予定している共有メモリのセグメントのメモリトークンを複製した複製メモリトークンを記憶する。送信部14は、図1の場合と同様、CPUコア12から出力されるリクエストに、アクセストークン13に記憶されている複数のアクセストークンを付加して出力する。
判定部82は、送信部14が出力するリクエストに含まれる複数のアクセストークンと、複製メモリトークン記憶部83から読み出した複製メモリトークンとを参照してリクエストのアクセス可否を判定する回路である。判定部82は、図6に示す判定部23の回路と同様の構成を有するが、入力されるメモリトークンが、リクエストのアクセス先のセグメントに対応する複製メモリトークンである点が判定部23と異なる。すなわち、判定部82は、複製メモリトークンがリクエストに含まれる複数のアクセストークンのいずれかと一致することに応じてリクエストのアクセスを許可する。
リクエスト発行制御部27は、判定部82がリクエストのアクセスを許可する場合に、送信部14から出力されたリクエストを発行する回路である。具体的には、リクエスト発行制御部27は、判定部82から出力されるアクセス許可信号やトークンエラー信号(図6参照)を用いて、リクエストの発行を制御する。
判定部82がリクエストのアクセスを許可しない場合、リクエスト発行制御部27は、リクエストに対するエラー応答を行うことで、CPU12に対してトークン不一致の例外が発生したことを通知することができる。また、判定部82がリクエストのアクセスを許可しないことを受けて、リクエスト発行制御部27からトークン不一致の例外を発生してCPUコア12に知らせるように実装することもできる。
複製メモリトークン記憶部83への複製メモリトークンの格納は、例えば、CPUコア12上で動作するOS62が、OS62上で動作するアプリケーションプログラムから通知されたトークンを管理テーブル80へ格納するのと合わせて、複製メモリトークン記憶部83へ格納するようにしてもよい。あるいは、ホームノードのCPU12が、メモリトークン記憶部22へ使用するセグメントのメモリトークンを格納するのに合わせて、ホームノードのCPU12が、同じセグメントを使用するリモートノードの複製メモリトークン記憶部83へ格納するようにしてもよい。
共有メモリ部6は、共有メモリ21と、メモリトークン記憶部22と、メモリI/F回路85とを有する。共有メモリ21及びメモリトークン記憶部22については、図1に示すものと同じであるため、説明を省略する。メモリI/F回路85は、共有メモリをアクセスするリクエストのアクセス制御を行う回路であるが、実施例1の場合と異なり、判定部23の判定結果を参照せずにメモリアクセスの制御を行う。メモリトークン記憶部22へのメモリトークンの設定は、例えば図10に示す場合と同様に、ホームノードのCPUコア12上で動作するOS62が、OS62上で動作するアプリケーションプログラムからの通知を受けて設定を行う。
なお、実施例2に係る情報処理装置300上で動作するOS62やOS62上で動作するアプリケーションプログラムの動作については、実施例1における図7や図10で説明される内容と同様の動作が行われる。
実施例2では、判定部82と複製メモリトークン記憶部83とをリモートノード側のCPU81内のCPUコア12毎、又はストランド16毎に設けることによって、より早い段階でリクエストのアクセス可否を判定できるようになる。すなわち、図1や図2の例では、例えばリモートノードのCPUコア12から送信されたリクエストがインターコネクト3を介してホームノードの共有メモリ部の判定部23に届いて初めてリクエストのアクセス可否が分かるのに対し、より早い段階で判定できるようになる。
(他の実施例)
以上、本発明の好ましい実施例について詳述したが、本発明は特定の実施例に限定されるものではなく、種々の変形や変更が可能である。例えば、本実施形態における実施例2では、判定部82と複製メモリトークン83とをリモートノード側のCPUコア12毎に設ける例について説明したが、さらに以下のような変形例とすることもできる。
第1の変形例として、例えば、CPU81が複数のCPUコア12を有する場合や、CPUコア12が複数のストランド16を有する場合において、複数のCPUコア12又は複数のストランド16に対応する共通の複製メモリトークン記憶部83を設けてもよい。この場合、CPUコア12毎に設けられる判定部82は、例えばCPU81内で共通の複製メモリトークン記憶部83からアクセス先のセグメントに対応する複製メモリトークンを読み出してアクセス可否の判定に用いる。複製メモリトークンをRAMなどの記憶回路にまとめて格納しておくことで、効率的に複製メモリトークンを記憶できる。
また、第2の変換例として、CPUコア12毎に設けられる不図示のアドレス変換回路が用いるアドレス変換テーブルの一部を複製メモリトークン記憶部83として利用することもできる。その際、CPUコア12から出力される仮想アドレス(VA)を実アドレス(RA)又は物理アドレス(PA)に変換する回路に判定部82の回路も含めて、アドレス変換とアクセス可否判定を一度に行うような実装としてもよい。アドレス変換テーブルに複製メモリトークン記憶部83を含めることで、効率的に複製メモリトークンを記憶することができる。また、判定部82をアドレス変換回路の一部に実装することで、アドレス変換と合わせてアクセス可否を効率的に判定することができる。
第3の変形例として、判定部82と複製メモリトークン83とをCPUコア12と、一次キャッシュメモリ36又は二次キャッシュメモリ39との間に配置することも可能である。そのようにすることで、一次キャッシュメモリ36又は二次キャッシュメモリ39にキャッシュされたセグメントのデータも含めて、判定部82がアクセス可否の判定を行うことが可能となる。
なお、前述した情報処理システムおよび情報処理方法をコンピュータに実行させるコンピュータプログラム、およびそのプログラムを記録した、非一時的なコンピュータ読み取り可能な記録媒体は、本発明の範囲に含まれる。ここで、非一時的なコンピュータ読み取り可能な記録媒体は、例えばSDメモリカードなどのメモリカードである。なお、前記コンピュータプログラムは、前記記録媒体に記録されたものに限られず、電気通信回線、無線又は有線通信回線、インターネットを代表とするネットワーク等を経由して伝送されるものであってもよい。