(57)【要約】【課題】対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を仮想モデルを用いて再現する情報処理装置における仮想モデルの性能低下を抑制する。【解決手段】複数の対象処理部に対応する複数の仮想処理部１０，２０の各々から発行される、対象記憶部に対応する仮想記憶部３０への書き込み要求を、処理される処理順に格納する格納部４１と、前記仮想処理部１０，２０から発行される前記仮想記憶部３０への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部４１の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、重ならない場合、前記読み出し要求に係る読み出し処理を実行する読出制御部４２，４３と、をそなえる。【選択図】図６
2015215641.tif 000002
【特許請求の範囲】
【請求項１】
対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現する情報処理装置であって、
前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納する格納部と、
前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、重ならない場合、前記読み出し要求に係る読み出し処理を実行する読出制御部と、をそなえる
ことを特徴とする、情報処理装置。
【請求項２】
前記読出制御部は、読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求を前記格納部に格納する
ことを特徴とする、請求項１記載の情報処理装置。
【請求項３】
前記読出制御部は、読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求の処理順序が前記読み出し要求とアクセス範囲の重なる書き込み要求の直後になるように前記読み出し要求を前記格納部に格納する
ことを特徴とする、請求項２記載の情報処理装置。
【請求項４】
前記格納部の格納する一以上の要求を処理順に読み出し所定の処理を実行する実行部をさらにそなえ、
前記実行部は、前記格納部から読み出した書き込み要求に係るアクセス範囲が、読み出し処理実行中の読み出し要求に係るアクセス範囲と重なると判断した場合、当該読み出し処理が完了するまで前記格納部から読み出した書き込み要求に対する所定の処理の実行を待機する
ことを特徴とする、請求項１〜３のいずれか１項記載の情報処理装置。
【請求項５】
前記読出制御部は、前記格納部の格納する一以上の書き込み要求について、処理順とは逆の順序で検索し、前記読み出し要求のアクセス範囲と重なるか否かを判定する
ことを特徴とする、請求項１〜４のいずれか１項記載の情報処理装置。
【請求項６】
対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現するコンピュータに、
前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納部に格納し、
前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、
判定の結果、重ならない場合、前記読み出し要求に係る読み出し処理を実行する
処理を実行させることを特徴とする、エミュレーションプログラム。
【請求項７】
対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現する情報処理装置におけるエミュレーション方法であって、
前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納部に格納し、
前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、
判定の結果、重ならない場合、前記読み出し要求に係る読み出し処理を実行する
ことを特徴とする、エミュレーション方法。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、情報処理装置，エミュレーションプログラム，及びエミュレーション方法に関する。
【背景技術】
【０００２】
近年、ＤＶＤ（Digital Versatile Disc）／ＨＤＤ（Hard Disk Drive）レコーダやＮＡＳ（Network Area Storage）装置をはじめとする各種装置のライフサイクルが短くなり、ベンダが自社のみで装置の全ての部品を製造することが減少している。代わりに、ベンダが部品を各社から調達して組み立て、ソフトウェア（Firmware；ＦＷ等）を組み込むことで、１つの装置を製造することが多くなっている。
【０００３】
大規模な装置は多くの細かなソフトウェア（モジュール等）を組み込まれることが多い。これらのソフトウェアの多くは、装置が完成してからデバッグが行なわれるため、ソフトウェアの数が多くなるのに伴ってデバッグに時間がかかる。
【０００４】
このため、試作としての装置（試作装置）を多く作成して同時に（並行して）デバッグを行ない、デバッグ期間を短縮する手法等が考えられる。しかし、この手法では、試作装置を多く作成するため、コストがかかる。また、装置の修正（改版）等があった場合、再度複数の試作装置を作成することになるため、工数が増加し、ライフサイクルに合わなくなったり、装置のコストアップに繋がる場合もある。
【０００５】
上記の不都合を回避する手法として、装置の全体若しくは一部をソフトウェア的にサーバやＰＣ（Personal Computer）等のコンピュータ（情報処理装置）上でエミュレート（再現）することが考えられる。
【０００６】
上述したエミュレーションでは、装置を実際に製造せずに、コンピュータ上で、装置（ハードウェア）をエミュレートするソフトウェア（エミュレータ）により仮想的に装置を構成し、仮想的な装置（仮想装置）上で実際のソフトウェアを実行させる。これにより、装置を実際に製造した際の問題点を洗い出すことができる。
【先行技術文献】
【特許文献】
【０００７】
【特許文献１】特開２００１−１７５６３２号公報
【特許文献２】特開２００１−３１８８２５号公報
【発明の概要】
【発明が解決しようとする課題】
【０００８】
しかし、エミュレータでは、再現対象の対象装置（ハードウェア）とは異なり、情報処理装置のプロセッサ（ＣＰＵ等）が、ソフトウェアで再現した仮想ＣＰＵ（Central Processing Unit）及び仮想デバイスから仮想メモリへのアクセスを行なう。このため、仮想装置では、対象装置とは異なり、エミュレータ特有で起こる性能（動作速度）の低下が生じ得る。
【０００９】
１つの側面では、本発明は、対象装置を仮想モデルを用いて再現する情報処理装置における仮想モデルの性能低下を抑制することを目的とする。
【００１０】
なお、前記目的に限らず、後述する発明を実施するための形態に示す各構成により導かれる作用効果であって、従来の技術によっては得られない作用効果を奏することも本発明の他の目的の１つとして位置付けることができる。
【課題を解決するための手段】
【００１１】
本件の情報処理装置は、対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現する情報処理装置であり、格納部と読出制御部とをそなえる。前記格納部は、前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納する。前記読出制御部は、前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定する。重ならない場合、前記読出制御部は、前記読み出し要求に係る読み出し処理を実行する。
【発明の効果】
【００１２】
一実施形態によれば、対象装置を仮想モデルを用いて再現する情報処理装置における仮想モデルの性能低下を抑制することができる。
【図面の簡単な説明】
【００１３】
【図１】再現対象の装置（対象装置）をエミュレータにより再現した仮想装置の構成例を示す図である。
【図２】再現対象の装置（対象装置）をエミュレータにより再現した仮想装置の構成例を示す図である。
【図３】一実施形態に係るエミュレーションサーバの構成例を示す図である。
【図４】図３に示すエミュレーションサーバのハードウェア構成例を示す図である。
【図５】一実施形態に係るエミュレータの構成例を示す図である。
【図６】図５に示すキュー処理部の動作例を説明する図である。
【図７】図５に示すキュー処理部によるキューイング（追加）の動作例を説明する図である。
【図８】図５に示すキュー処理部によるキューイング（削除）の動作例を説明する図である。
【図９】図５に示すキュー処理部によるキュー格納部へのキューの挿入の動作例を説明する図である。
【図１０】図５に示すキュー処理部によるキュー格納部へのキューの挿入の動作例を説明する図である。
【図１１】一実施形態に係るエミュレータ（仮想装置）の動作例を示すシーケンス図である。
【図１２】一実施形態に係るエミュレータ（仮想装置）の動作例を示すシーケンス図である。
【図１３】一実施形態に係るエミュレータにおけるWrite関数の処理手順の一例を説明するフローチャートである。
【図１４】一実施形態に係るエミュレータにおけるQueue登録関数の処理手順の一例を説明するフローチャートである。
【図１５】一実施形態に係るエミュレータにおけるRead関数の処理手順の一例を説明するフローチャートである。
【図１６】一実施形態に係るエミュレータにおけるRead関数の処理手順の一例を説明するフローチャートである。
【図１７】一実施形態に係るエミュレータにおけるアクセス処理（スレッド）の処理手順の一例を説明するフローチャートである。
【図１８】一実施形態に係るエミュレータにおけるRead関数の処理及びアクセス処理（スレッド）の一例を説明する図である。
【図１９】一実施形態に係るエミュレータにおけるEXECフラグの設定の処理手順の一例を説明するフローチャートである。
【図２０】再現対象の装置（対象装置）をエミュレータにより再現した仮想装置の構成例を示す図である。
【図２１】一実施形態に係るエミュレータを適用した仮想装置の構成例を示す図である。
【図２２】一実施形態に係る対象装置の構成例を示す図である。
【発明を実施するための形態】
【００１４】
以下、図面を参照して本発明の実施の形態を説明する。ただし、以下に説明する実施形態は、あくまでも例示であり、以下に明示しない種々の変形や技術の適用を排除する意図はない。すなわち、本実施形態を、その趣旨を逸脱しない範囲で種々変形して実施することができる。なお、以下の実施形態で用いる図面において、同一符号を付した部分は、特に断らない限り、同一若しくは同様の部分を表す。
【００１５】
〔１〕一実施形態
〔１−１〕対比例
はじめに、図１及び図２に示す対比例を説明する。図１及び図２は、それぞれ、再現対象の装置（対象装置）１０００（図２２参照）をエミュレータにより再現した仮想装置１００及び２００の構成例を示す図である。なお、対象装置１０００の構成例を図２２に示す。対象装置１０００は、図２２に示すように、ＣＰＵ１１００及び複数のデバイス１２００−１〜１２００−３が、内部バス１４００を介してメモリ１３００にアクセスすることができる。
【００１６】
エミュレータは、装置（対象装置）１０００のエミュレートを行なうソフトウェアであり、図示しないＣＰＵ及びＲＡＭ（Random Access Memory）等のメモリをそなえるサーバやＰＣ等のコンピュータ（情報処理装置）上で実行される。エミュレータは、コンピュータにおいてＣＰＵによりメモリ上に展開されたエミュレーションプログラムが実行されることで実現される。エミュレータは、図１に示すようにソフトウェア的に仮想装置１００を構成することができる。
【００１７】
仮想装置１００は、エミュレーションの対象装置１０００を再現したものであり、図１に示すように仮想（疑似）ＣＰＵ（Pseudo CPU）１１０，複数（例えば３つ）の仮想（疑似）デバイス（Pseudo Device）１２０−１〜１２０−３，及び仮想メモリ１３０をそなえる。
【００１８】
仮想ＣＰＵ１１０は、実際のプログラム（ＦＷ）を実行する仮想的なＣＰＵである。仮想デバイス１２０−１〜１２０−３（以下の説明において仮想デバイス１２０−１〜１２０−３を区別しない場合には単に仮想デバイス１２０という）は、対象装置１０００（仮想装置１００）内部の各デバイスの動作を疑似的に再現する仮想的なデバイスである。以下、仮想ＣＰＵ１１０及び複数の仮想デバイス１２０をまとめて仮想処理部という場合がある。
【００１９】
仮想メモリ１３０は、コンピュータのメモリのリソースを用いて実現される仮想的なメモリである。仮想ＣＰＵ１１０及び仮想デバイス１２０は、仮想メモリ１３０に対してアクセス、つまりデータの読み出しや書き込みを行なうことができる。
【００２０】
ところで、図１に示すエミュレータでは、各仮想処理部は互いに独立して仮想装置１００内の仮想メモリ１３０に対しアクセスを発生させる。すなわち、図１に示すエミュレータは、仮想処理部間にて排他処理を行なう機能をそなえていない。
【００２１】
仮想装置１００では、仮想ＣＰＵ１１０が仮想デバイス１２０から仮想メモリ１３０への書き込みの値を監視し、状態が変化したときに次の処理に移行するようなプログラムが実行されることがある。このとき、仮想ＣＰＵ１１０は、仮想デバイス１２０から仮想メモリ１３０への書き込みが中途半端な状態でも次の動作に移行してしまう場合がある。
【００２２】
一例として、仮想ＣＰＵ１１０と仮想デバイス１２０とが仮想メモリ１３０の同一の空間（記憶領域）をアクセスするような処理を考える。このような処理としては、割り込み等を使用して仮想デバイス１２０が複数のデータを仮想メモリ１３０に書き込み、そのデータを仮想ＣＰＵ１１０が読み出すような処理が挙げられる。この場合、仮想デバイス１２０が仮想メモリ１３０へのデータの書き込みを完了しないうちに、仮想ＣＰＵ１１０が同一の記憶領域からの読み出しを実行し、仮想デバイス１２０からのデータが途中までしか書き込まれない事態が生じ得る。
【００２３】
また、Ｌｉｎｕｘ（登録商標）を実行するコンピュータ上で動作するエミュレータにおいて、仮想ＣＰＵ１１０が仮想メモリ１３０にアクセスすると、ページ概念により４Ｋバイト単位でスレッドが切り替わる可能性がある。このため、データが途中までしか書き込まれない状態と同様に、転送途中で次の処理が実行され処理の追い越しが発生する可能性があり、予期しない誤動作を生じる場合もある。
【００２４】
このように、仮想装置１００が対象装置１０００の仕様とは異なる動作をする場合、エミュレータの使用者等は、このような不都合が発生する都度、対処方法を検討し修正することになる。
【００２５】
上述した不都合を解消する手法として、図２に示すエミュレータを用いることも考えられる。このエミュレータは、図２に示すようにソフトウェア的に仮想装置２００を構成（再現）することができる。
【００２６】
仮想装置２００は、基本的に図１に示す仮想装置１００と同様の構成をそなえるが、図２に示すように、仮想装置１００の構成に加えて、アービタ１４０及びセレクタ１５０をそなえる点が異なる。
【００２７】
アービタ１４０は、ハードウェアの装置で用いられるアービタと同様に、仮想処理部間で仮想メモリ１３０へのメモリアクセスに対し調停（排他処理）を行ない、メモリアクセスを調整する。例えば、アービタ１４０は、入力される複数のリクエスト信号の送信元の仮想処理部について調停を行ない、選択した仮想処理部から完了信号を入力されるまで当該仮想処理部にメモリアクセスを行なわせる。
【００２８】
セレクタ１５０は、アービタ１４０から入力される選択信号に応じた仮想処理部を選択し、仮想メモリ１３０へのアクセスを許可すべく入力側の切り替えを行なう。このとき、セレクタ１５０は、選択信号に応じた仮想処理部へ、選択されていることを示す信号（被セレクト信号）を出力することで、仮想処理部は自身が選択されていることを検出する。
【００２９】
このように、仮想装置２００では、全仮想処理部（仮想ＣＰＵ１１０及び仮想デバイス１２０）による仮想メモリ１３０への全てのリード及びライトに対し、調停（排他処理）を行なうことになる。
【００３０】
しかし、図２に示す仮想装置２００において、アービタ１４０及びセレクタ１５０を含む調停処理部分は、仮想デバイス１２０が増加するにつれ複雑化し、規模が大きくなるため、仮想装置２００の処理速度の低下が発生し得る。例えば、ＣＰＵから見たプログラム領域は読出専用（Read Only）であり、実際には調停は不要であるが、仮想装置２００では当該領域まで調停することになるため、不要な調停が発生して処理速度の低下を招くことになる。
【００３１】
以上のように、エミュレータにより対象装置１０００を再現し調停処理部分を含む仮想装置２００を構成すると、エミュレータ特有で起こる、仮想装置２００（エミュレータひいてはコンピュータ）の動作速度の低下が生じ得る。
【００３２】
〔１−２〕エミュレーションサーバについて
上述した点に鑑み、本実施形態に係るエミュレーションサーバ１（図３参照）によれば、以下に詳述するように、仮想装置３（図５参照）がキュー処理部４０をそなえる。このキュー処理部４０は、複数の仮想処理部の各々から発行される仮想記憶部への書き込み要求を、処理される処理順に格納する。また、キュー処理部４０は、仮想処理部から発行される仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が、格納する１以上の書き込み要求に係るアクセス範囲と重なるか否かを判定する。そして、キュー処理部４０は、重ならない場合、読み出し要求に係るリード処理を実行する。
【００３３】
上述のように、図２に示す仮想装置２００では、書き込み要求及び読み出し要求のアクセス範囲が重ならない場合にもアービタ１４０による調停が画一的に行なわれ、処理速度の低下が生じ得る。
【００３４】
これに対し、エミュレーションサーバ１によれば、各仮想処理部のメモリ調停（排他処理）を最小限に留め、単純化することができるため、速度低下を抑制でき、高速にエミュレートを行なうことができる。従って、対象装置１０００を仮想モデルを用いて再現する情報処理装置における仮想モデルの性能低下を抑制することができる。
【００３５】
〔１−３〕エミュレーションサーバの構成
以下、図３及び図４を参照しながら、本実施形態に係るエミュレーションサーバ１の構成について説明する。図３は、一実施形態に係るエミュレーションサーバ１の構成例を示す図であり、図４は、図３に示すエミュレーションサーバ１のハードウェア構成例を示す図である。
【００３６】
エミュレーションサーバ１は、メモリ（対象記憶部）と当該メモリの記憶領域を共用する複数のデバイス及び１以上のＣＰＵ（複数の対象処理部）とをそなえるエミュレーション対象の対象装置１０００を、仮想装置（仮想モデル）を用いてエミュレート（再現）する。エミュレーションサーバ１としては、例えばサーバやＰＣ等の情報処理装置が挙げられる。
【００３７】
図３及び図４に示すように、エミュレーションサーバ１は、ＣＰＵ１ａ，メモリ１ｂ，記憶部１ｃ，インタフェース部１ｄ，入出力部１ｅ，記録媒体１ｆ，及び読取部１ｇをそなえることができる。
【００３８】
ＣＰＵ１ａは、種々の制御や演算を行なう演算処理装置（プロセッサ）の一例である。ＣＰＵ１ａは、対応する各ブロック１ｂ〜１ｇと接続され、メモリ１ｂ，記憶部１ｃ，記録媒体１ｆや１ｈ，又は図示しないＲＯＭ（Read Only Memory）等に格納されたプログラムを実行することにより、種々の機能を実現することができる。例えばＣＰＵ１ａは、メモリ１ｂに格納されたエミュレーションプログラム５（図３参照）を実行することにより、仮想装置３をエミュレートするエミュレータ２としての機能を実現することができる。
【００３９】
メモリ１ｂは、種々のデータやプログラムを格納する記憶装置である。ＣＰＵ１ａは、プログラムを実行する際に、メモリ１ｂにデータやプログラムを格納し展開する。メモリ１ｂは、上記エミュレーションプログラム５を保存するほか、エミュレータ２によるエミュレーションで用いられるエミュレーション領域４を確保する。なお、メモリ１ｂとしては、例えばＲＡＭ等の揮発性メモリが挙げられる。記憶部１ｃは、種々のデータやプログラム等を格納するハードウェアである。記憶部１ｃとしては、例えばＨＤＤ等の磁気ディスク装置，ＳＳＤ（Solid State Drive）等の半導体ドライブ装置，フラッシュメモリ等の不揮発性メモリ等の各種装置が挙げられる。
【００４０】
インタフェース部１ｄは、有線又は無線による、ネットワーク（図示省略）や他の情報処理装置との間の接続及び通信の制御等を行なうものである。インタフェース部１ｄとしては、例えば、ＬＡＮ（Local Area Network），ファイバチャネル（Fibre Channel；ＦＣ），インフィニバンド（InfiniBand）等に準拠したアダプタが挙げられる。入出力部１ｅは、マウスやキーボード等の入力装置及びディスプレイやプリンタ等の出力装置の少なくとも一方を含むことができる。例えば、入力装置は使用者等によるエミュレーションサーバ１（仮想装置３）の条件やデータの入力等の作業に用いられ、出力装置はエミュレーションサーバ１（仮想装置３）による動作状態や処理結果等の出力に用いられる。
【００４１】
記録媒体１ｆは、例えばフラッシュメモリやＲＯＭ等の記憶装置であり、種々のデータやプログラムを記録することができる。読取部１ｇは、コンピュータ読取可能な記録媒体１ｈに記録されたデータやプログラムを読み出す装置である。記録媒体１ｆ及び１ｈの少なくとも一方には、本実施形態に係るエミュレーションサーバ１の各種機能の全部もしくは一部を実現するエミュレーションプログラム５が格納されてもよい。例えば、ＣＰＵ１ａは、記録媒体１ｆから読み出したプログラム、又は、読取部１ｇを介して記録媒体１ｈから読み出したプログラムを、メモリ１ｂ等の記憶装置に展開して実行してもよい。
【００４２】
なお、記録媒体１ｈとしては、例えばフレキシブルディスク、ＣＤ（Compact Disc）、ＤＶＤ（Digital Versatile Disc）、ブルーレイディスク等の光ディスクや、ＵＳＢ（Universal Serial Bus）メモリやＳＤカード等のフラッシュメモリが挙げられる。なお、ＣＤとしては、ＣＤ−ＲＯＭ、ＣＤ−Ｒ（CD-Recordable）、ＣＤ−ＲＷ（CD-Rewritable）等が挙げられる。また、ＤＶＤとしては、ＤＶＤ−ＲＯＭ、ＤＶＤ−ＲＡＭ、ＤＶＤ−Ｒ、ＤＶＤ−ＲＷ、ＤＶＤ＋Ｒ、ＤＶＤ＋ＲＷ等が挙げられる。
【００４３】
上述した各ブロック１ａ〜１ｇ間はバスで相互に通信可能に接続される。また、エミュレーションサーバ１の上述したハードウェア構成は例示である。従って、エミュレーションサーバ１内でのハードウェアの増減（例えば任意のブロックの追加や省略），分割，任意の組み合わせでの統合，バスの追加又は省略等は適宜行なわれてもよい。
【００４４】
〔１−４〕エミュレータの構成
次に、図５〜図１９を参照しながら、本実施形態に係るエミュレーションサーバ１の構成について説明する。図５は、一実施形態に係るエミュレータ２により再現される仮想装置３の構成例を示す図であり、図６は、図５に示すキュー処理部４０の動作例を説明する図である。
【００４５】
仮想装置３は、エミュレーションの対象装置１０００を再現したものである。仮想装置３は、図５に示すように、１以上（例えば１つ）の仮想（疑似）ＣＰＵ１０，複数（例えば３つ）の仮想（疑似）デバイス２０−１〜２０−３，仮想メモリ３０，及びキュー処理部４０をそなえる。
【００４６】
仮想ＣＰＵ１０は、実際のプログラム（ＦＷ）を実行する仮想的なＣＰＵである。仮想デバイス２０−１〜２０−３（以下の説明において仮想デバイス２０−１〜２０−３を区別しない場合には単に仮想デバイス２０という）は、対象装置１０００（仮想装置３）内部の各デバイスの動作を疑似的に再現する仮想的なデバイスである。仮想ＣＰＵ１０及び仮想デバイス２０は、対象装置１０００に実装されるＣＰＵ及びデバイスと同様の機能や性能を持つように設定され、エミュレーションサーバ１のＣＰＵ１ａのリソースを用いて実現される。
【００４７】
仮想メモリ３０は、エミュレーションサーバ１のメモリ１ｂのリソース（例えばエミュレーション領域４（図３参照））を用いて実現される仮想的なメモリである。仮想ＣＰＵ１０及び仮想デバイス２０は、仮想メモリ３０に対してアクセス、つまりデータの読み出しや書き込みを行なうことができる。このように、仮想ＣＰＵ１０及び仮想デバイス２０は、仮想メモリ３０の記憶領域を共用する複数の仮想処理部の一例である。なお、これら複数の仮想処理部は対象装置１０００がそなえる複数の対象処理部に対応するものである。
【００４８】
キュー処理部４０は、各仮想ＣＰＵ１０及び仮想デバイス２０から仮想メモリ３０へのリード／ライトアクセスを制御するものであり、リード／ライトアクセスはキュー処理部４０を経由して処理が行なわれる。
【００４９】
キュー処理部４０は、例示的に、キュー格納部４１，キュー制御部４２，読出判定部４３，及びアクセス制御部４４をそなえる。
【００５０】
キュー格納部４１は、仮想ＣＰＵ１０及び複数の仮想デバイス２０の各々から発行された書き込み要求及び読み出し要求を、処理される処理順（例えば発行順）に格納（キューイング）する。キュー格納部４１は、例えばＣＰＵ１ａの図示しないキャッシュメモリの一部やメモリ１ｂの一部（例えばエミュレーション領域４）等の記憶領域により実現される。
【００５１】
キュー格納部４１は、例えば図６に示すように、キュー４１ａ及びメッセージキュー４１ｂを複数格納することができる。キュー４１ａは仮想メモリ３０にアクセスするアドレス（先頭アドレス）（addr），データサイズ（size），及びリード／ライトのいずれかを示すＲ／Ｗフラグ（R_FLG）を含む管理用（制御用）の情報を保持する。また、このキュー４１ａは、図７に示すように前後のキュー４１ａの書き込みポインタ（write pointer）を示すBefore_wp及びNext_wpをさらに含む。メッセージキュー４１ｂは書き込み要求のライトデータ（W_data）を保持する。
【００５２】
キュー制御部４２は、キュー格納部４１（キュー４１ａ及びメッセージキュー４１ｂ）へのアクセス要求の登録，削除，更新等の管理（キューイング）を行なうものであり、アクセス要求をキュー格納部４１に登録するQueue登録関数の一例である。
【００５３】
ここで、仮想ＣＰＵ１０及び複数の仮想デバイス２０は、共通するフォーマットを用いて書き込み要求及び読み出し要求を発行することができる。一例として、書き込み要求はキュー処理部４０のWrite関数を呼び出す（call）ための以下のフォーマット（メッセージ）とし、読み出し要求はキュー処理部４０のRead関数を呼び出すための以下のフォーマット（メッセージ）とすることができる。
・ライト：アドレス（W_addr），データサイズ（W_size），ライトデータ（W_data）
・リード：アドレス（R_addr），データサイズ（R_size），データ格納用ポインタ
【００５４】
例えば、キュー制御部４２は、仮想ＣＰＵ１０及び複数の仮想デバイス２０の各々から書き込み要求を入力されると、ライトアドレス（W_addr），ライトのデータサイズ（Byte)（W_size）を管理用のキュー４１ａに登録する。このとき、キュー制御部４２はキュー４１ａにライトフラグ（例えばR_FLG（リードフラグ） = 0）を設定する。また、キュー制御部４２は、ライトデータ（W_data）をライトデータ用のメッセージキュー４１ｂに格納する。
【００５５】
ここで、キュー制御部４２によるキューイング（追加及び削除）の動作例を、図７及び図８を参照して説明する。
【００５６】
はじめに、図７において、キュー格納部４１に先頭のリクエスト（Que_REQ0）のみが登録されている（Que_WP（キュー４１ａからの読み出しポインタ） = Que_REQ0）場合のキューイング（追加）例を説明する。この場合、次のアクセス要求が入力されると、キュー制御部４２は、Que_REQ0のNext_wpに次のアクセスによって獲得されたポインタ（キュー４１ａのアドレス（addr））であるQue_REQ1のポインタを登録する。また、キュー制御部４２は、Que_REQ1のBefore_wpに直前のアクセスのポインタであるQue_REQ0のポインタを登録する。そして、さらに次のアクセス要求が入力されると、キュー制御部４２は、Que_REQ1のNext_wpに次のアクセスによって獲得されたポインタであるQue_REQ2のポインタを登録し、Que_REQ2のBefore_wpに直前のアクセスのポインタであるQue_REQ1のポインタを登録する。
【００５７】
次に、図８において、キュー格納部４１にQue_REQ0〜Que_REQ2が登録されており、読み出しポインタがQue_REQ1である場合のキューイング（Que_REQ0の削除）例を説明する。この場合、キュー制御部４２は、Que_REQ0に係るアクセス要求（情報）を削除し（freeとし）、Before_wpにQue_REQ0のポインタを設定されたQue_REQ1について、直前の情報が削除されたためBefore_wpに“0”を設定する（Que_WP -> Before_wp = 0）。なお、読み出しポインタが示すアクセス要求に次のエントリ（Next_wp）が無い場合、Que_WP -> Before_wp= 0且つQue_WP -> Next_wp = 0の状態であるアクセス要求が先頭になる。
【００５８】
なお、キュー制御部４２による読み出し要求のキュー格納部４１への登録処理については、キュー格納部４１への格納判断を読出判定部４３が行なうため、後述する。
【００５９】
読出判定部４３は、仮想ＣＰＵ１０及び複数の仮想デバイス２０の各々から読み出し要求を入力されると、当該読み出し要求をキュー格納部４１に格納するか否かを判定し、判定結果に応じたリード処理を行なう。読出判定部４３は、リード処理を行なうRead関数の一例である。
【００６０】
例えば、読出判定部４３は、入力された読み出し要求で指示された仮想メモリ３０のアドレス（R_addr）及びリードデータサイズ（R_size)から得られるエリアと、管理用のキュー４１ａに格納されているライトデータのエリアとが重なっているか否かを判定する。一例として、読出判定部４３は、以下の判定を行ない、いずれかの条件を満たす場合に、読み出し要求のアクセス範囲がキュー格納部４１内のライトデータのアクセス範囲と重なっている（Ｈｉｔする）と判定する。
・(W_addr>= R_addr) && (W_addr<= R_addr + R_size)
（読み出し要求のアクセス範囲内に書き込み要求の先頭アドレスが含まれるか否か）
・(R_addr>= W_addr) && (R_addr<= W_addr + W_size)
（書き込み要求のアクセス範囲内に読み出し要求の先頭アドレスが含まれるか否か）
【００６１】
このとき、読出判定部４３は、キュー格納部４１内のキュー４１ａから、書き込み要求のエントリつまりR_FLGが“0”であるエントリ（リクエスト）のアドレス（addr）及びサイズ（size）を、それぞれW_addr及びW_sizeとして取得する。
【００６２】
なお、読出判定部４３は、キュー格納部４１の格納する一以上のアクセス要求（書き込み要求）について、格納順序（処理順序）とは逆の順序、つまり最後尾のアクセス要求からBefore_wpを辿る順序で、読み出し要求のアクセス範囲と重なるか否かを判定することが好ましい。これにより、読み出し要求のアクセス範囲と重なる書き込み要求がキュー格納部４１内に複数存在する場合でも、リード処理に影響を与える（最後にライト処理が行なわれる）書き込み要求を確実に特定することができる。従って、リード／ライトのアクセス競合が発生した場合でも、仮想メモリ３０のデータの整合性を保つことができる。
【００６３】
次いで、読出判定部４３は、判定の結果、重なっていない（Ｈｉｔしていない）場合、読み出し要求で要求されたデータを、仮想メモリ３０のアドレス（R_addr）からリードデータサイズ（R_size）分読み出し、Read関数の戻り値とする。この戻り値は、読み出し要求への応答として、要求元の仮想ＣＰＵ１０又は仮想デバイス２０の読み出し要求で指定されたデータ格納用ポインタに格納（送信）される。なお、読出判定部４３は、仮想メモリ３０からのデータの読み出しを、例えばmemcpyコマンドを用いて、仮想メモリ３０空間から要求元の仮想ＣＰＵ１０又は仮想デバイス２０へのダイレクトコピーを実施することにより行なってもよい。
【００６４】
なお、アクセス範囲が重なっていない場合の仮想メモリ３０からのリード処理は、アクセス競合が生じないため、後述するアクセス制御部４４による仮想メモリ３０へのライト処理と並行して行なうことができる。
【００６５】
一方、読出判定部４３は、判定の結果、重なっている（Ｈｉｔする）場合、読み出し要求をキュー格納部４１内の管理用のキュー４１ａに登録する。例えば読出判定部４３は、入力された読み出し要求に係るリードアドレス（R_addr）及びリードデータサイズ（Byte)（R_size）を管理用のキュー４１ａに登録すべく、キュー制御部４２に渡す。
【００６６】
このとき、読出判定部４３は、読み出し要求の処理順が読み出し要求とアクセス範囲の重なる書き込み要求の直後になるように、アクセス範囲が重なると判定した書き込み要求のポインタをキュー制御部４２に通知することができる。
【００６７】
次いで、読出判定部４３は、キュー格納部４１に登録した読み出し要求のエントリの登録ポインタ（アドレス，QueueBuffポインタ）を戻り値としてキュー制御部４２から受け取り、読み出し要求に係るリード処理を待機する。読出判定部４３は、キュー格納部４１からアクセス制御部４４によりデータ（addr，size）が読み出された際の、キュー４１ａのポインタをチェックする。そして、読出判定部４３は、待機しているリード処理が、読み出されたキュー４１ａのポインタにヒットしたことを契機に、待機を解除してリード処理を実行する。なお、リード処理は、既述のように読出判定部４３により仮想メモリ３０からリードデータが読み出され、Read関数の戻り値として要求元に返される。
【００６８】
なお、アクセス範囲が重なっている場合、仮想メモリ３０からのリード処理においてアクセス競合が生じる可能性があるため、リード処理中はアクセス制御部４４による仮想メモリ３０へのライト処理が抑止される。例えば読出判定部４３は、キュー制御部４２からの戻り値の登録ポインタについて、リード処理実行中を示すフラグ（R_EXEC）を有効にし、R_EXECが有効の間、アクセス制御部４４によるライト処理を待機させることができる。
【００６９】
読出判定部４３による処理の詳細及び動作例については、図１５，図１６，図１８，及び図１９を参照しながら後述する。
【００７０】
ここで、キュー制御部４２の説明に戻る。キュー制御部４２は、上述のように読出判定部４３において読み出し要求のアクセス範囲がキュー格納部４１内の書き込み要求のアクセス範囲と重なると判定されると、読み出し要求をキュー格納部４１に格納する。これにより、仮想メモリ３０の重複するエリアへのライト処理が完了してからリード処理が実行されるため、リードデータの整合性を保つことができる。
【００７１】
例えば、キュー制御部４２は、読出判定部４３から渡されるリードアドレス（R_addr）及びリードデータサイズ（Byte)（R_size）と、リードフラグ（例えばR_FLG（リードフラグ） = 1）とを管理用のキュー４１ａに登録する。このとき、キュー制御部４２は、読出判定部４３から読み出し要求に係るデータとともにキュー４１ａのポインタを通知されると、通知されたポインタのアクセス要求とその次のアクセス要求との間に、読み出し要求に係るエントリ（リクエスト）を挿入することができる。
【００７２】
以下、キュー制御部４２によるキュー格納部４１（キュー４１ａ）への読み出し要求の挿入動作例を、図９及び図１０を参照して説明する。
【００７３】
図９において、リードのリクエスト（Que_REQ3）のアクセス要求が、キュー格納部４１内のキュー４１ａにおけるQue_REQ1のアクセス範囲にＨｉｔしている場合の、Que_REQ3のアクセス要求の挿入例を説明する。なお、キュー制御部４２は、読出判定部４３からQue_REQ1のポインタを通知されているものとする。この場合、例えばキュー制御部４２は、図１０に示すように、Que_REQ1とその次のQue_REQ2との間に読み出し要求に係るQue_REQ3を挿入する。
【００７４】
具体的には、キュー制御部４２は、ＨｉｔしたQue_REQ1のNext_wpに読み出し要求に係るQue_REQ3のポインタを登録する。また、キュー制御部４２は、Que_REQ3のBefore_wpにＨｉｔしたQue_REQ1のポインタを登録し、Que_REQ3のNext_wpにQue_REQ1の直後（Que_REQ1のNext_wpに登録されていた）Que_REQ2のポインタを登録する。さらに、キュー制御部４２は、Que_REQ2のBefore_wpに読み出し要求に係るQue_REQ3のポインタを登録する。
【００７５】
このように、キュー制御部４２は、アクセス範囲が重なると判定された書き込み要求の直後に読み出し要求を格納（挿入）することで、リード処理の待機時間を最小限に留めることができ、リード処理の高速化を図ることができる。
【００７６】
キュー制御部４２による処理の詳細及び動作例については、図１３及び図１４を参照しながら後述する。
【００７７】
以上のように、キュー制御部４２及び読出判定部４３は、読み出し要求について、当該読み出し要求に係るアクセス範囲がキュー格納部４１の格納する１以上の書き込み要求に係るアクセス範囲と重なるか否かを判定する読出制御部の一例であるといえる。具体的には、この読出制御部は、判定の結果、重ならない場合、読み出し要求に係る読み出し処理を実行するのである。
【００７８】
このように、一実施形態に係るエミュレーションサーバ１によれば、キュー格納部４１に読み出し要求のエリアにＨｉｔする書き込み要求が無い場合、読み出し要求をキュー格納部４１に格納せずにリード処理を行なうことができる。従って、リード処理の高速化を図ることができ、仮想装置３の性能低下を抑制することができる。
【００７９】
なお、キュー格納部４１への読み出し要求の挿入位置の判断は、読出判定部４３が行なってもよいしキュー制御部４２が行なってもよい。
【００８０】
アクセス制御部４４は、キュー格納部４１に格納されたキューについて、処理順（例えばアクセス要求の発行順）にキュー４１ａ及びメッセージキュー４１ｂ（W_addr，W_size，W_data）から情報を読み出しライト処理を実行する。例えば、アクセス制御部４４は、キュー格納部４１から先頭のエントリ（アクセス要求）を読み出し、ライトフラグが有効（例えばR_FLG（リードフラグ） = 0）である場合、先頭のメッセージキュー４１ｂを読み出す。そして、アクセス制御部４４は、メッセージキュー４１ｂ内のライトデータサイズ（W_size）分のライトデータを仮想メモリ３０のアドレス（W_addr）に転送する。
【００８１】
このように、アクセス制御部４４は、キュー格納部４１の格納順に書き込み要求を読み出し、ライト処理を行なうことで、１つのライト処理が完了しない限り、他のスレッド（Thread）が仮想メモリ３０にアクセスできないように排他制御することができる。なお、仮想ＣＰＵ１０や仮想デバイス２０から書き込み要求の送信によって呼び出されるWrite関数は、キュー格納部４１へ書き込むだけの突き放し型である。従って、読み出し完了（return）を待つRead関数とは異なり、書き込み要求がキュー格納部４１にキューイングされても、仮想装置３の性能（動作速度）の低下には影響を与えない。
【００８２】
なお、キュー格納部４１から読み出された情報については、例えばキュー格納部４１又はアクセス制御部４４によりキュー４１ａ及びメッセージキュー４１ｂから削除される。或いは、メッセージキュー４１ｂ内のライトアドレスについては、キュー格納部４１から読み出されたデータがメッセージキュー４１ｂから自動で削除されるようにしてもよい。
【００８３】
また、キュー格納部４１のキュー４１ａにアクセス要求が格納されていない状態で、リード処理実行中の読み出し要求がある場合、リード処理のアクセス範囲と重なる書き込み要求が入力されると、キュー制御部４２により、当該書き込み要求はキュー４１ａに格納される。この場合においても、この書き込み要求はアクセス制御部４４により読み出されライト処理が実行される。しかし、ライト処理の実行の際に、書き込み要求に係るアクセス範囲がリード処理実行中のアクセス範囲にＨｉｔした場合は、アクセス制御部４４は、リード処理の完了後にライト処理を実行する。
【００８４】
さらに、アクセス制御部４４は、キュー４１ａから読み出した要求が読み出し要求である場合、当該読み出し要求に係るリード処理を実行させるため、キュー４１ａのポインタを読出判定部４３に渡す。
【００８５】
以上のように、キュー制御部４２及びアクセス制御部４４は、キュー格納部４１の格納する１以上の要求（書き込み要求／読み出し要求）を処理順に読み出し所定の処理を実行する実行部の一例であるといえる。具体的には、この実行部は、キュー格納部４１から読み出した書き込み要求に係るアクセス範囲が、読み出し処理実行中の読み出し要求に係るアクセス範囲と重なると判断した場合、当該読み出し処理が完了するまで当該書き込み要求に対する所定の処理の実行を待機するのである。
【００８６】
このように、キュー制御部４２及びアクセス制御部４４によれば、リード処理の完了後にキュー格納部４１から読み出したライト処理が実行されるため、リード／ライトの排他処理を適切に行なうことができる。従って、仮想メモリ３０におけるリード／ライトデータの整合性を保つことができる。
【００８７】
アクセス制御部４４による処理の詳細及び動作例については、図１７，図１８を参照しながら後述する。
【００８８】
〔１−５〕エミュレーションサーバの動作例
次に、上述の如く構成されたエミュレーションサーバ１の動作例を、図１１〜図１９を参照して説明する。
【００８９】
はじめに、図１１及び図１２に示すシーケンス図を参照して、エミュレーションサーバ１によるエミュレータ２（仮想装置３）の全体の動作例について説明する。なお、前提として、キュー格納部４１にはアクセス要求が存在しない（実行待ちのアクセス要求が無い）場合を想定する。
【００９０】
まず、図１１に示すように、仮想デバイス２０によるライトアクセスと同じ範囲に対して仮想ＣＰＵ１０がリードアクセスを行なった場合を説明する。
【００９１】
図１１に示すように、仮想デバイス２０によるWrite関数CALLにより、キュー制御部４２が書き込み要求をキュー格納部４１（キュー４１ａ及びメッセージキュー４１ｂ）に積む（登録する）（処理Ｔ１）。次いで、アクセス制御部４４（スレッド）は、キュー格納部４１のキュー４１ａからアクセス要求（この場合書き込み要求）を読み出し（処理Ｔ２）、R_EXEC等のチェックを行なう。そして、アクセス制御部４４は、読み出した書き込み要求と同じ範囲に対するリード処理が実行されていないか否かを判断する。R_EXEC等のチェックがＯＫであれば（競合するリード処理が無ければ）、アクセス制御部４４は、仮想デバイス２０のライト処理を実行する（処理Ｔ３）。また、キュー制御部４２は、仮想デバイス２０にキュー４１ａへの書き込み要求の登録が完了したことを通知する（処理Ｔ４）。
【００９２】
一方、仮想ＣＰＵ１０によるRead関数CALLが発生すると、読出判定部４３は、キュー格納部４１を確認する（処理Ｔ５）。確認の結果、キュー４１ａにおけるライト処理中の書き込み要求のアクセス範囲がリードアクセスと重なる場合、読出判定部４３は、キュー制御部４２を介して、読み出し要求をキュー格納部４１のライト処理に係るエントリの直後に挿入する（処理Ｔ６）。
【００９３】
アクセス制御部４４では、ライト処理が完了すると（処理Ｔ７）、キュー制御部４２を介して、キュー４１ａ内のライト処理に係るエントリが削除されて更新され（処理Ｔ８）、次のエントリ（アクセス要求）が読み出される（処理Ｔ９）。アクセス制御部４４は、次のアクセス要求が読み出し要求である（R_FLGが立っている）場合、読出判定部４３に読み出したエントリが読み出し要求であることを通知する（処理Ｔ１０）。なお、アクセス要求が読み出し要求である（R_FLGが立っている）ため、アクセス制御部４４は、リード処理の完了を待たずに、キュー制御部４２を介してキュー４１ａ内のリード処理に係るエントリを削除して更新し（処理Ｔ１１）、次のエントリを読み出す。
【００９４】
読出判定部４３は、アクセス制御部４４から通知された読み出し要求について、EXECフラグをセットし（処理Ｔ１２）、リード処理を実行する（処理Ｔ１３）。リード処理が完了すると（処理Ｔ１４）、読出判定部４３は、EXECフラグをクリアし（処理Ｔ１５）、処理が終了する。
【００９５】
次に、図１２に示すように、仮想デバイス２０によるリードアクセスと同じ範囲に対して仮想ＣＰＵ１０がライトアクセスを行なった場合を説明する。
【００９６】
図１２に示すように、仮想デバイス２０によるRead関数CALLが発生すると、読出判定部４３は、キュー格納部４１を確認する（処理Ｔ２１）。確認の結果、キュー４１ａ内にアクセス要求が存在しない（リードアクセスのアクセス範囲と重なるライトアクセスが無い）ため、読出判定部４３は、EXECフラグをセットし（処理Ｔ２２）、リード処理を実行する（処理Ｔ２３）。
【００９７】
一方、仮想ＣＰＵ１０によるWrite関数CALLにより、キュー制御部４２が書き込み要求のキューをキュー格納部４１に積む（登録する）（処理Ｔ２４）。次いで、アクセス制御部４４（スレッド）は、キュー格納部４１からキューを読み出し（処理Ｔ２５）、R_EXEC等のチェックを行ない、読み出したキューと同じ範囲に対するリード処理が実行されていないか否かを判断する。しかし、処理Ｔ２２において、ライトアクセスと同じ範囲に対するリードアクセスについてR_EXECフラグがセットされているため、R_EXEC等のチェックはＮＧとなる（競合するリード処理がある）（処理Ｔ２６）。なお、キュー制御部４２は、仮想ＣＰＵ１０にキュー４１ａへの書き込み要求の登録が完了したことを通知する（処理Ｔ２７）。
【００９８】
リード処理が完了すると（処理Ｔ２８）、読出判定部４３は、EXECフラグをクリアする（処理Ｔ２９）。R_EXECフラグがクリアされたため、アクセス制御部４４（スレッド）は、R_EXEC等のチェックを行ない、チェックがＯＫとなれば（競合するリード処理が無ければ）、仮想ＣＰＵ１０のライト処理を実行する（処理Ｔ３０）。アクセス制御部４４では、ライト処理が完了すると（処理Ｔ３１）、キュー制御部４２を介して、キュー格納部４１内のライト処理に係るエントリが削除されて更新され（処理Ｔ３２）、処理が終了する。
【００９９】
〔１−５−１〕Write関数の動作例
次に、図１３に示すフローチャートに従って、Write関数の動作例を説明する。
【０１００】
仮想ＣＰＵ１０又は仮想デバイス２０は、仮想メモリ３０に書き込むデータとして、上述したWrite関数を呼び出すためのフォーマットの書き込み要求（メッセージ）を生成し、キュー処理部４０へ送信する。キュー処理部４０は、受信した書き込み要求に基づき以下に示すWrite関数を実行し（ステップＳ１）、キュー制御部４２によるキュー格納部４１へのライトアクセスのQueue登録関数を呼び出す。
【０１０１】
Write_p = Que登録(W_addr, W_size, *W_data, 0, 0)
但し、Que登録の引数は、左から順にライトアドレス，ライトデータサイズ，ライトデータ，ポインタ，リードフラグ（R_FLG）である。
【０１０２】
〔１−５−２〕Queue登録関数の動作例
次に、図１４に示すフローチャートに従って、Queue登録関数の動作例を説明する。
【０１０３】
Queue登録関数は、Write関数又はRead関数の実行により、キュー格納部４１への書き込み要求又は読み出し要求の追加や挿入の際に、キュー制御部４２により実行される。Queue登録関数が起動されると、キュー制御部４２は、呼出元から値を入力される（ステップＳ１１）。例えばキュー制御部４２は、キュー４１ａ及びメッセージキュー４１ｂに設定される、先頭アドレス，データサイズ，ライトデータ，読み出し要求を挿入するポインタ，及びＲ／Ｗフラグの値を取得する。
【０１０４】
次いで、キュー制御部４２は、登録するアクセス要求がリード／ライトのいずれかを判断するため、R_FLG == 0であるか否かを判断する（ステップＳ１２）。R_FLG == 0である場合、つまり書き込み要求である場合（ステップＳ１２のＹｅｓルート）、キュー制御部４２は、Global変数であるwp（書き込みポインタ）が示す領域に、書き込み要求の情報を設定してキュー４１ａに登録する（ステップＳ１３）。具体的には、キュー制御部４２は、wpが示すエントリのaddr，size，R_FLGに、それぞれ書き込み要求に係るアドレス，サイズ，Ｒ／Ｗフラグを設定する。
【０１０５】
また、キュー制御部４２は、メッセージキュー４１ｂにライトデータサイズ分のライトデータ（W_data）を格納し（ステップＳ１４）、Next_wpの領域を確保、つまりキュー４１ａの次の領域を確保する（ステップＳ１５）。キュー制御部４２は、Next_wp != 0でなくなるまでステップＳ１５の処理を繰り返し（ステップＳ１６及びステップＳ１６のＮｏルート）、Next_wpの領域を確保できたら（ステップＳ１６のＹｅｓルート）、ステップＳ１７に移行する。
【０１０６】
ステップＳ１７では、キュー制御部４２は、wpが示すエントリのNext_wpに確保したNext_wpを設定し、当該Next_wpが示すエントリのBefore_wpに現在のwpを設定し、現在のwpの値をNext_wpの値に更新する（次のキュー４１ａに切り替える）。そして、キュー制御部４２は、戻りとしてwpを返し、Queue登録関数の処理が終了する。
【０１０７】
一方、ステップＳ１２において、R_FLG == 0ではない場合、つまり読み出し要求である場合（ステップＳ１２のＮｏルート）、キュー制御部４２は、Read_p（読み出しポインタ）の領域を確保、つまり読み出し要求に係る情報を格納（挿入）する領域を確保する（ステップＳ１８）。キュー制御部４２は、Read_p != 0でなくなるまでステップＳ１８の処理を繰り返し（ステップＳ１９及びステップＳ１９のＮｏルート）、Read_pの領域を確保できたら（ステップＳ１９のＹｅｓルート）、ステップＳ２０に移行する。
【０１０８】
ステップＳ２０では、キュー制御部４２は、Read_pが示す領域に読み出し要求の情報を設定してキュー４１ａに登録（挿入）するとともに、キュー４１ａに登録したことによる前後のアクセス要求のNext_wp及びBefore_wpを変更する。具体的には、キュー制御部４２は、Read_pが示すエントリのaddr，size，R_FLGに、それぞれ読み出し要求に係るアドレス，サイズ，Ｒ／Ｗフラグを設定する。また、キュー制御部４２は、Read_pが示すエントリのNext_wp，Before_wpと、挿入したアクセス要求の前後のエントリNext_wp，Before_wpを変更する（図９及び図１０参照）。そして、キュー制御部４２は、戻り値としてRead_pを返し、Queue登録関数の処理が終了する。
【０１０９】
〔１−５−３〕Read関数の動作例
次に、図１５及び図１６に示すフローチャート、並びに図１８に示す図に従って、Read関数の動作例を説明する。
【０１１０】
仮想ＣＰＵ１０又は仮想デバイス２０は、仮想メモリ３０からデータを読み出す際に、上述したRead関数を呼び出すためのフォーマットの読み出し要求（メッセージ）を生成し、キュー処理部４０へ送信する。キュー処理部４０は、主に読出判定部４３により以下に示すRead関数の処理を実行する。
【０１１１】
はじめに、読出判定部４３は、読み出し要求から読み出しの先頭アドレス及びデータサイズを取得する（ステップＳ２１）。そして、読出判定部４３は、リード処理を要求した仮想ＣＰＵ１０又は仮想デバイス２０（Device(Read_Req_DEV)）のリード処理を、対応するデバイスのReadExecに登録する（ステップＳ２２，図１８の符号４３ａ及びＡ１の“１”参照）。
【０１１２】
次いで、読出判定部４３は、Global変数であるwp（ライトポインタ）（この場合、キュー４１ａの最後尾のエントリを示すポインタ）の値をrp（読み出しポインタ）に設定し（ステップＳ２３）、rp != 0であるか否かを判定する（ステップＳ２４）。rp != 0である場合（ステップＳ２４のＹｅｓルート）、読出判定部４３は、rpが示すエントリについてR_FLG == 1であるか否かを判定する（ステップＳ２５）。R_FLG == 1である場合（リード処理）（ステップＳ２５のＹｅｓルート）、読出判定部４３は、rpを直前のエントリのポインタに変更し（キュー４１ａを遡り）（ステップＳ２７）、処理がステップＳ２４に移行する。
【０１１３】
一方、R_FLG == 1ではない場合（ライト処理）（ステップＳ２５のＮｏルート）、読出判定部４３は、リード処理のアクセス範囲がライト処理のアクセス範囲と重なるか否かを判定する（ステップＳ２６，図１８の符号Ａ１の“２”参照）。アクセス範囲が重ならない場合（ステップＳ２６のＮｏルート）、処理がステップＳ２７に移行する。一方、アクセス範囲が重なる場合（ステップＳ２６のＹｅｓルート）、読出判定部４３は、当該リード処理について、キュー制御部４２によるキュー格納部４１へのリードアクセスのQueue登録関数を呼び出す（ステップＳ２８，図１８の符号Ａ２参照）。
【０１１４】
次いで、読出判定部４３は、実行するリード処理のポインタを、対応するデバイスのR_EXECに登録する（ステップＳ２９，図１８の符号４３ｂの“rp”及びＡ１の“２．１”参照）。このように、実行するリード処理のポインタを登録することで、読出判定部４３は、リード処理がキュー格納部４１から読み出され処理が完了したことをアクセス制御部４４を介して検出することができる。なお、ReadExec４３ａ及びR_EXEC４３ｂは、それぞれ仮想ＣＰＵ１０及び仮想デバイス２０の各デバイスごとに存在する。読出判定部４３は、ReadExec４３ａ及びR_EXEC４３ｂをＣＰＵ１ａのキャッシュメモリや仮想メモリ３０等の記憶領域の一部に記憶することができる。
【０１１５】
そして、読出判定部４３は、アクセス制御部４４によるキュー４１ａからの読み出し待ちを行なう（ステップＳ３０及びステップＳ３０のＹｅｓルート）。リード処理のアクセス要求が読み出されると（ステップＳ３０のＮｏルート）、処理が図１６のステップＳ３１に移行する。
【０１１６】
図１６のステップＳ３１では、読出判定部４３は、読み出し要求を発行したデバイスに対応するR_EXEC４３ｂに対して、リード処理実行中であることを示すEXECフラグを設定する（図１８の符号４３ｂの“EXEC”，Ａ１の“２．１”，及びＡ３参照）。そして、読出判定部４３は、R_EXEC内のリード処理のポインタをクリア（例えば“0”を設定）し（ステップＳ３２）、リード処理を実行する（ステップＳ３３，図１８の符号Ａ４参照）。なお、リード処理は、例えばmemcpyコマンドにより実行し、戻り値としてリードデータをデバイスに返すことができる。
【０１１７】
最後に、読出判定部４３は、ReadExec４３ａ及びR_EXEC４３ｂをそれぞれリセット（例えば“0”を設定）し（ステップＳ３４及びＳ３５，図１８の符号Ａ１の“３”及びＡ５参照）、処理を終了する。なお、図１５のステップＳ２４において、rp != 0ではない場合、つまりキュー格納部４１の先頭のエントリまで検索を行なった場合（ステップＳ２４のＮｏルート）、読出判定部４３は、リード処理とアクセス範囲が重なるライト処理は無いと判定する。そして、処理が図１６のステップＳ３１に移行する（図１８の符号Ａ１の“２．２”参照）。
【０１１８】
〔１−５−４〕アクセス処理（スレッド）の動作例
次に、図１７に示すフローチャート及び図１８に示す図に従って、アクセス処理（スレッド）の動作例を説明する。
【０１１９】
アクセス制御部４４は、キュー格納部４１（キュー４１ａ）から格納順にアクセス要求を読み出し、読み出したアクセス要求に対して所定の処理を実行する。
【０１２０】
はじめに、アクセス制御部４４は、Global変数であるquerp（キュー４１ａからの読み出しポインタ）が示すアクセス要求のアドレス，サイズ及びＲ／Ｗフラグを変数に登録する（ステップＳ４１，図１８の符号Ｂ１参照）。そして、アクセス制御部４４は、アクセス要求の中身が空であるか否かを判定し（ステップＳ４２）、空である場合（ステップＳ４２のＹｅｓルート）、処理がステップＳ４１に移行する。一方、空ではない場合（ステップＳ４２のＮｏルート）、アクセス制御部４４は、アクセス要求の中身がリード処理であるか否かをR_FLGを参照して判定する（ステップＳ４３）。
【０１２１】
一方、リード処理ではない（ライト処理である）場合（ステップＳ４３のＮｏルート）、処理がステップＳ４４に移行する。ステップＳ４４〜４８では、アクセス制御部４４は、ライト処理を行なう前に、読出判定部４３に対して、ライト処理のアクセス範囲と重なるリード処理が実行されているか否かを判定させる（図１８の符号Ｂ２参照）。
【０１２２】
一例として、読出判定部４３は、リード処理登録（ReadExec）しているリード処理が実行中（R_EXEC == 1）か否かを判定することができる。そして、読出判定部４３は、実行中である登録情報（例えば対応するReadExec４３ａ）と、アクセス制御部４４から取得するライト処理に関する情報とを比較し、ライト処理を待機させるか否かを判定する。
【０１２３】
例えば、読出判定部４３は、ステップＳ４４において、R_EXEC４３ｂを確認するデバイスを仮想ＣＰＵ１０として、仮想ＣＰＵ１０のEXECフラグが有効（例えば“1”）であるか否かを判定する（ステップＳ４５）。
【０１２４】
EXECフラグが有効である場合（ステップＳ４５のＹｅｓルート）、読出判定部４３は、Read関数の処理と同様の手法で、ライト処理のアクセス範囲がリード処理のアクセス範囲と重なるか否かを判定する（ステップＳ４６，図１８の符号Ａ１の“２”参照）。アクセス範囲が重ならない場合（ステップＳ４６のＮｏルート）、又は、ステップＳ４５でEXECフラグが無効である場合（ステップＳ４５のＮｏルート）、読出判定部４３は、仮想ＣＰＵ１０を他の仮想デバイス２０に変更する（ステップ４７）。そして、読出判定部４３は、全てのデバイスについて判定を行なうまで処理を繰り返す（ステップＳ４８及びステップＳ４８のＮｏルート）。
【０１２５】
なお、ステップＳ４６においてアクセス範囲が重なる場合（ステップＳ４６のＹｅｓルート）、EXECフラグが有効である間（リード処理中）の処理は、ステップＳ４５のＹｅｓルート〜ステップＳ４６のＹｅｓルートのループに入る。これにより、読出判定部４３は、ライト処理を待機させることができる。
【０１２６】
全てのデバイスについて判定を行なうと（ステップＳ４８のＹｅｓルート）、処理が読出判定部４３からアクセス制御部４４に戻され、アクセス制御部４４は、ライト処理を実行する（ステップＳ４９，図１８の符号Ｂ３参照）。例えばアクセス制御部４４は、memcpyコマンドを用いて、メッセージキュー４１ｂ（バッファ）からライトサイズ分のライトデータを読み出して、仮想メモリ３０へコピーすることができる。
【０１２７】
次いで、アクセス制御部４４は、キュー制御部４２に対して、ライト処理が完了したアクセス要求の削除を指示し、キュー制御部４２は、当該アクセス要求をキュー格納部４１から削除する（ステップＳ５０，図８，図１８の符号Ｂ４参照）。なお、ステップＳ４３において、アクセス要求の中身がリード処理である場合（ステップＳ４３のＹｅｓルート）、処理がステップＳ５０に移行する。この場合、アクセス制御部４４は、リード処理に係るキュー４１ａのポインタを読出判定部４３に通知し、キュー制御部４２に対して、リード処理に係るアクセス要求の削除を指示する。
【０１２８】
次に、アクセス制御部４４は、ステップＳ５０でQuerpがNext_wpに更新され、Que_WPも更新されたため、新たにアクセス要求を取得する。このとき、スレッドの切り替わりが遅い場合があり得るため、アクセス制御部４４は、読み出したアクセス要求のデータがリードであるならば、リード実行中を示すEXECフラグをセットする（ステップＳ５１，Ｓ５１のＹｅｓルート及びＳ５２）。そして、ステップＳ５２の処理が完了した場合、又は、読み出したアクセス要求のデータがライトである場合（ステップＳ５１のＮｏルート）、処理がステップＳ４１に移行する。
【０１２９】
〔１−５−５〕EXECフラグ設定処理の動作例
次に、図１９に示すフローチャートに従って、EXECフラグ設定処理の動作例を説明する。
【０１３０】
図１７のステップＳ５２において、アクセス制御部４４によりEXECフラグ設定処理が実行されると、読出判定部４３が起動される。読出判定部４３は、R_EXEC４３ｂを確認するデバイスを仮想ＣＰＵ１０として（ステップＳ６１）、仮想ＣＰＵ１０のrpがQue_WPと一致し、且つ“0”ではないか否かを判定する（ステップＳ６２）。条件を満たさない場合（ステップＳ６２のＮｏルート）、読出判定部４３は、仮想ＣＰＵ１０を他の仮想デバイス２０に変更し（ステップ６３）、全てのデバイスについて判定を行なうまで処理を繰り返す（ステップＳ６４及びステップＳ６４のＮｏルート）。全てのデバイスについて判定を行なうと、処理が終了する。
【０１３１】
一方、ステップＳ６２において、条件を満たす場合（ステップＳ６２のＹｅｓルート）、読出判定部４３は、EXECフラグが有効か否かを判定し（ステップＳ６５）、有効である場合（ステップＳ６５のＹｅｓルート）、処理が終了する。また、EXECフラグが無効である場合には（ステップＳ６５のＮｏルート）、読出判定部４３は、当該EXECフラグを有効にし（ステップＳ６６）、処理が終了する。
【０１３２】
なお、上述したEXECフラグの設定処理は、アクセス制御部４４が行なってもよい。
【０１３３】
〔１−６〕本実施形態の効果
本実施形態に係るエミュレーションサーバ１によれば、ハードウェアと同等の調停機能（アービタ）を設けた図２に示す仮想装置２００よりも、仮想装置３の性能（処理速度）の悪化を抑えることができる。
【０１３４】
ここで、アービタはバス調停を行なう回路であるため、仮想ＣＰＵや仮想デバイスのいずれかのデバイスが仮想メモリへアクセスする間は、他のデバイスは仮想メモリにアクセスできず、処理が待たされる（応答速度が低下する)。ハードウェアでの調停は、１つのデバイス（ＣＰＵを含む）がバスを使用していた場合、他のデバイスはバスを使用できないように調停が行なわれる。
【０１３５】
しかし、ソフトウェアでは、複数のプロセス（スレッド）が仮想メモリにアクセス可能である。このため、ハードウェアをソフトウェアで実現（再現）するエミュレータには、ハードウェアのような排他処理をさせることが、エミュレータによる対象装置１０００の再現性の観点から好ましい。この場合、図２を用いて説明したように、仮想装置の速度低下が著しい。
【０１３６】
これに対し、本実施形態に係るエミュレーションサーバ１によれば、各仮想処理部のメモリ調停（排他処理）を最小限に留め、単純化することができるため、速度低下を抑制でき、高速にエミュレートを行なうことができる。従って、対象装置１０００を仮想モデルを用いて再現する情報処理装置における仮想モデルの性能低下を抑制することができる。また、仮想メモリ３０へのアクセスの排他性が保たれるため、仮想ＣＰＵ１０及び仮想デバイス２０のマルチスレッド化を容易に行なうことができる。
【０１３７】
さらに、エミュレーションサーバ１は、仮想装置３に書き込み要求を処理順に格納するキュー格納部４１をそなえるため、仮想メモリ３０へのアクセスの順序性が保証される。従って、仮想ＣＰＵ１０の部分についてもメモリバリアを実装することができる。
【０１３８】
さらに、仮想ＣＰＵ１０及び仮想デバイス２０による仮想メモリ３０へのアクセスの順序性が一定になるため、ＤＭＡ（Direct Memory Access）等に起因する、メモリのデータ破壊等のバグの発見を容易にすることができる。 
【０１３９】
〔１−７〕適用例
上述のように、エミュレーションサーバ１は、１以上の仮想ＣＰＵ１０及び複数の仮想デバイス２０が仮想メモリ３０の同一のメモリ空間をアクセスする際の排他制御を実現することができる。このような排他制御は、例えば仮想デバイス２０が仮想メモリ３０を用いて仮想ＣＰＵ１０に割り込みを発生させる割り込み処理に用いて好適である。
【０１４０】
以下、図２０に示す仮想装置３００及び図２１に示す仮想装置６を参照しながら、本実施形態に係るエミュレーションサーバ１の適用例について説明する。なお、仮想装置３００は図１に示す仮想装置１００と基本的に同様な構成であるものとし、仮想装置６は図５及び図６等に示す仮想装置３と基本的に同様な構成であるものとする。
【０１４１】
図２０において、符号（１）〜（６）は以下の処理である。
（１）  仮想デバイス１２０−１から仮想メモリ１３０へのライト処理
（２）  仮想デバイス１２０−１が仮想メモリ１３０からのリード処理
（３）  仮想デバイス１２０−２から仮想メモリ１３０へのライト処理
（４）  仮想デバイス１２０−２が仮想メモリ１３０からのリード処理
（５）  仮想ＣＰＵ１１０から仮想メモリ１３０へのライト処理
（６）  仮想ＣＰＵ１１０が仮想メモリ１３０からのリード処理
【０１４２】
以下、仮想装置３００が、（※１）〜（※４）の処理を行なうものとして説明する。
（※１）  仮想デバイス１２０−１が仮想メモリ１３０の“0x0F80”に“0x100 Byte”のデータを書き込むライト処理を行なう。
（※２）  仮想デバイス１２０−２が仮想メモリ１３０の“0x2000”から“0x200 Byte”のデータを読み出すリード処理を行なう。
（※３）  仮想デバイス１２０−１が仮想メモリ１３０の“0x1080”に“0x100 Byte”のデータを書き込むライト処理を行なう。
（※４）  仮想ＣＰＵ１１０が仮想デバイス１２０−１によるデータ書き込みの完了を確認し処理する。
【０１４３】
（※４）の処理のように、仮想ＣＰＵ１１０が仮想デバイス１２０−１による書き込みの完了を待つ場合、仮想ＣＰＵ１１０は、仮想デバイス１２０−１からの書き込み完了の割り込みを待つ。そして、仮想ＣＰＵ１１０は、その割り込みにより割り込みハンドラに実行が移り、書き込みの完了を認識することが考えられる。
【０１４４】
しかし、仮想デバイス１２０−１は（※１）及び（※３）の処理を行なうため、例えば（※１）の処理に係る割り込みハンドラ処理中に、（※３）の処理が完了する場合がある。この場合、仮想ＣＰＵ１１０の（※１）に係る割り込み処理完了直後に（※３）に係る割り込みが発生し、再度割り込みハンドラに処理が移るということも起こり得るため、効率が悪い。
【０１４５】
近年のシステムでは、仮想デバイスが仮想ＣＰＵへの割り込みを発生させる前にメモリ空間に割り込み情報を書き込み、割り込み通知としてＭＳＩ（Message Signaled Interrupt）やＭＳＩ−Ｘ（MSI-eXtended）を用いるといった手法が知られている。なお、割り込み情報としては、エラーStatusやデータ転送アドレス（Scatgather等のテーブルを用いた転送等があり得るため）等が挙げられる。
【０１４６】
この手法では、メモリ空間に割り込み情報を書き込むため、仮想ＣＰＵは、一回の割り込みハンドラ処理の際に、或る領域にデータが書かれていたら処理が完了していると判断することで、極力、割り込み処理によるオーバヘッドを減らしている。実際のハードウェアでは、この割り込み情報のメモリ空間への書き込み中にＣＰＵが当該データを読み出すことは、排他制御により抑止されるが、既述のように、ソフトウェアエミュレータでは可能となってしまう。
【０１４７】
例として、一回の割り込みごとに仮想デバイス１２０−１が割り込み情報として“8 Byte”のデータをメモリ空間Ａに書き込むこととする（図２０参照）。メモリ空間Ａは仮想デバイス１２０−１に書き込み可能なメモリとして登録されており、割り込み発生ごとにメモリ空間Ａにデータを書き込んだ後、Ａは“8 Byte”ずつ増加するものとする。また、メモリ空間Ａへのライトデータは、先頭の“2 Byte”が何の割り込みかを示す情報，次の“2 Byte”がエラー等のStatus情報，最後の“4 Byte”がデータの格納先アドレスであるとする。
【０１４８】
通常の処理では、仮想装置３００は例えば以下の手順で動作する。
【０１４９】
・（１）の経路にて、仮想デバイス１２０−１が仮想メモリ１３０の“0x0F80”に“0x100 Byte”のライト処理を行なう。そして、仮想デバイス１２０−１は、書き込み完了時にメモリ空間Ａに対し、“8 Byte”のデータを書き込み、仮想ＣＰＵ１１０に対して割り込みを発生させた後、次のライトアドレスとして“A=A+8”を実施する。
【０１５０】
・（６）の経路にて、仮想ＣＰＵ１１０が割り込み処理を行なう。仮想ＣＰＵ１１０は、更新前の空間（A+0）のデータを読み出し、更新前の空間（A+4）で示されるアドレスのデータを確認する。そして、仮想ＣＰＵ１１０は、問題がないことを確認し処理を継続（return）する。
【０１５１】
・（４）の経路にて、仮想デバイス１２０−２が仮想メモリ１３０の“0x2000”から“0x200 Byte”のリード処理を行なう。
【０１５２】
・（１）の経路にて、仮想デバイス１２０−１が仮想メモリ１３０の“0x1080”に“0x100 Byte”のライト処理を行なう。そして、仮想デバイス１２０−１は、書き込み完了時にメモリ空間Ａに対し、“8 Byte”のデータを書き込み、仮想ＣＰＵ１１０に対して割り込みを発生させた後、次のライトアドレスとして“A=A+8”を実施する。
【０１５３】
・（６）の経路にて、仮想ＣＰＵ１１０が割り込み処理を行なう。仮想ＣＰＵ１１０は、更新前の空間（A+0）のデータを読み出し、更新前の空間（A+4）で示されるアドレスのデータを確認する。そして、仮想ＣＰＵ１１０は、問題がないことを確認し処理を継続（return）する。
【０１５４】
上述した手順を、一回の割り込みで複数の割り込み処理を実行するような割り込みハンドラの動作で説明すると、以下のようになる。
【０１５５】
・（１）の経路にて、仮想デバイス１２０−１が仮想メモリ１３０の“0x0F80”に“0x100 Byte”のライト処理を行なう。そして、仮想デバイス１２０−１は、書き込み完了時にメモリ空間Ａに対し、“8 Byte”のデータを書き込み、仮想ＣＰＵ１１０に対して割り込みを発生させた後、次のライトアドレスとして“A=A+8”を実施する。
【０１５６】
・（６）の経路にて、仮想ＣＰＵ１１０が割り込み処理を行なう。仮想ＣＰＵ１１０は、更新前の空間（A+0）のデータを読み出し、更新前の空間（A+4）で示されるアドレスのデータを確認する。
【０１５７】
また、仮想ＣＰＵ１１０は、更新前の空間（A+8）のデータを読み出し、データが書かれているか否かを確認し、書かれていなければ処理を継続（return）する一方、書かれていれば更新前の空間（A+12）で示されるアドレスのデータを確認する。そして、仮想ＣＰＵ１１０は、更新前の空間（A+16）のデータを読み、データが書かれているか確認し、書かれていなければ処理を継続（return）する一方、書かれていれば更新前の空間（A+20）で示されるアドレスのデータを確認する。以降、仮想ＣＰＵ１１０は、空間（A+x（xは４の倍数））にデータ書かれている場合、同様に処理を進める。
【０１５８】
・（４）の経路にて、仮想デバイス１２０−２が仮想メモリ１３０の“0x2000”から“0x200 Byte”のリード処理を行なう。
【０１５９】
・（１）の経路にて、仮想デバイス１２０−１が仮想メモリ１３０の“0x1080”に“0x100 Byte”のライト処理を行なう。そして、仮想デバイス１２０−１は、書き込み完了時にメモリ空間Ａに対し、“8 Byte”のデータを書き込み、仮想ＣＰＵ１１０に対して割り込みを発生させた後、次のライトアドレスとして“A=A+8”を実施する。
【０１６０】
・（６）の経路にて、仮想ＣＰＵ１１０が割り込み処理を行なう。仮想ＣＰＵ１１０は、更新前の空間（A+0）のデータを読み出し、更新前の空間（A+4）で示されるアドレスのデータを確認する。
【０１６１】
また、仮想ＣＰＵ１１０は、更新前の空間（A+8）のデータを読み出し、データが書かれているか否かを確認し、書かれていなければ処理を継続（return）する一方、書かれていれば更新前の空間（A+12）で示されるアドレスのデータを確認する。そして、仮想ＣＰＵ１１０は、更新前の空間（A+16）のデータを読み、データが書かれているか確認し、書かれていなければ処理を継続（return）する一方、書かれていれば更新前の空間（A+20）で示されるアドレスのデータを確認する。以降、仮想ＣＰＵ１１０は、空間（A+x（xは４の倍数））にデータ書かれている場合、同様に処理を進める。
【０１６２】
このように、（※１）の処理が完了後、割り込みハンドラに処理が移る前に（※２），（※３）の処理が実行されると、（※１）の処理の割り込みで（※３）の割り込み処理も行なわれてしまう。
【０１６３】
ソフトエミュレータでは、各仮想デバイス１２０が別スレッド（プロセス）で動作している。従って、（※１），（※２），（※３）と処理を進めていく際に、（※３）でA+0〜A+7まで書き込めずに、A+0，A+1辺りまで書き込んだところで仮想デバイス１２０−１が別のスレッド（例えば仮想デバイス１２０−２）に切り替わることが起こり得る。
【０１６４】
こうなった場合、仮想ＣＰＵ１１０のスレッドの順番の際に、割り込みハンドラで処理する（※３）のアドレスが違うエリアのアドレスを示すことになり、誤動作が発生することになる。
【０１６５】
これに対し、本実施形態の適用例に係る仮想装置６は、例えば以下の手順で動作する。
【０１６６】
・（１）の経路にて、仮想デバイス２０−１が仮想メモリ３０の“0x0F80”に“0x100 Byte”のライト処理を行なうため、キュー処理部４０にライトアドレス，サイズ，及びサイズ分のライトデータを書き込む（キュー格納部４１に格納する）。
【０１６７】
書き込みが完了すると、仮想デバイス２０は、メモリ空間Ａに対し、“8 Byte”のデータを書くため、キュー処理部４０にメモリ空間Ａのアドレス（A），サイズ（8 Byte），及びデータ（8 Byte分）を書きこむ（キュー格納部４１に格納する）。そして、仮想デバイス２０は、仮想ＣＰＵ１０に対して割り込みを発生させ、次のライトアドレスとして“A=A+8”を実施する。
【０１６８】
・（６）の経路にて、仮想ＣＰＵ１１０が割り込み処理を行なう。仮想ＣＰＵ１１０は、更新前の空間（A+0）のデータを読み出すため、キュー処理部４０にリードアドレス（A+0），サイズ（1 Byte），及び仮想ＣＰＵ１０のリードデータを格納するポインタを指示し、アクセスする。
【０１６９】
その際、キュー処理部４０では、仮想メモリ３０にアクセスするアドレス（リードアドレス）とキュー格納部４１に積まれているアドレス（ライトアドレス）からアクセス範囲が重なっていないかを確認する。重なっている場合、キュー処理部４０では、リード処理がキュー格納部４１に積まれ、仮想ＣＰＵ１０はリードの応答を待たされ、次の処理に進めなくなる。この場合、メモリ空間Ａの書き込みと読み出しとが重なっている。
【０１７０】
キュー処理部４０からリード処理が読み出されると、仮想ＣＰＵ１０は、仮想メモリ３０のメモリ空間Ａからリードを行なう。そして、仮想ＣＰＵ１０は、次の処理としての更新前の空間（A+4）で示されるアドレスのデータを確認するため、キュー処理部４０にアドレス（A+4），サイズ（4 Byte），仮想ＣＰＵ１０のリードデータを格納するポインタを指示し、アクセスする。その際、仮想ＣＰＵ１０は、同様にキュー格納部４１に積まれていないかを確認し処理を進める。このような処理手法により、仮想装置６では、仮想ＣＰＵ１０等により仮想メモリ３０から中途半端なデータが読み出されることを抑止し、誤動作を防止することができる。
【０１７１】
・（４）の経路にて、仮想デバイス１２０−２が仮想メモリ１３０の“0x2000”から“0x200 Byte”のリード処理を行なため、キュー処理部４０にアドレス（0x2000），サイズ（0x200），及び仮想デバイス２０−２がデータを格納するポインタを指示しアクセスする。キュー処理部４０では、仮想メモリ３０に対しアクセスするアドレス（リードアドレス）及びキュー格納部４１に積まれているアドレス（ライトアドレス）からアクセス範囲が重なっていないかを確認する。重なっている場合は、キュー格納部４１に仮想デバイス２０−２のリード処理が積まれリードの応答を待たされ、次の処理には進めなくなる。この場合、重なっていないため処理が進む。
【０１７２】
その際、キュー処理部４０での処理が仮想ＣＰＵ１０の処理を追い越す場合があるが、重なっていないエリアの状況であるため、特に問題は生じない。むしろ、キュー処理部４０では、このような追い越しが発生することで、仮想装置６の全体的な速度低下を防止することができるのである。なお、以降の処理は、同様に進むため割愛する。
【０１７３】
以上のように、本実施形態の適用例においても、一実施形態と同様の効果を奏することができるほか、仮想ＣＰＵ１０及び仮想デバイス２０の各々が別スレッドで動作するような場合において、仮想装置６全体の性能低下を抑止することができる。
【０１７４】
〔２〕その他
以上、本発明の好ましい実施形態について詳述したが、本発明は、係る特定の実施形態に限定されるものではなく、本発明の趣旨を逸脱しない範囲内において、種々の変形、変更して実施することができる。
【０１７５】
例えば、仮想装置３及び６において、キュー制御部４２，読出判定部４３，及びアクセス制御部４４の機能は、任意の組み合わせで併合してもよく、分割してもよい。
【０１７６】
〔３〕付記
以上の実施形態に関し、更に以下の付記を開示する。
【０１７７】
（付記１）
対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現する情報処理装置であって、
前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納する格納部と、
前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、重ならない場合、前記読み出し要求に係る読み出し処理を実行する読出制御部と、をそなえる
ことを特徴とする、情報処理装置。
【０１７８】
（付記２）
前記読出制御部は、読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求を前記格納部に格納する
ことを特徴とする、付記１記載の情報処理装置。
【０１７９】
（付記３）
前記読出制御部は、読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求の処理順序が前記読み出し要求とアクセス範囲の重なる書き込み要求の直後になるように前記読み出し要求を前記格納部に格納する
ことを特徴とする、付記２記載の情報処理装置。
【０１８０】
（付記４）
前記格納部の格納する一以上の要求を処理順に読み出し所定の処理を実行する実行部をさらにそなえ、
前記実行部は、前記格納部から読み出した書き込み要求に係るアクセス範囲が、読み出し処理実行中の読み出し要求に係るアクセス範囲と重なると判断した場合、当該読み出し処理が完了するまで前記格納部から読み出した書き込み要求に対する所定の処理の実行を待機する
ことを特徴とする、付記１〜３のいずれか１項記載の情報処理装置。
【０１８１】
（付記５）
前記読出制御部は、前記格納部の格納する一以上の書き込み要求について、処理順とは逆の順序で検索し、前記読み出し要求のアクセス範囲と重なるか否かを判定する
ことを特徴とする、付記１〜４のいずれか１項記載の情報処理装置。
【０１８２】
（付記６）
対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現するコンピュータに、
前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納部に格納し、
前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、
判定の結果、重ならない場合、前記読み出し要求に係る読み出し処理を実行する
処理を実行させることを特徴とする、エミュレーションプログラム。
【０１８３】
（付記７）
前記コンピュータに、
読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求を前記格納部に格納する
処理を実行させることを特徴とする、付記６記載のエミュレーションプログラム。
【０１８４】
（付記８）
前記読み出し要求を格納する処理において、読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求の処理順序が前記読み出し要求とアクセス範囲の重なる書き込み要求の直後になるように前記読み出し要求を前記格納部に格納する
ことを特徴とする、付記７記載のエミュレーションプログラム。
【０１８５】
（付記９）
前記コンピュータに、
前記格納部の格納する一以上の要求を処理順に読み出し所定の処理を実行し、
前記格納部から読み出した書き込み要求に係るアクセス範囲が、読み出し処理実行中の読み出し要求に係るアクセス範囲と重なるか否かを判断し、
判断の結果、重なる場合、当該読み出し処理が完了するまで前記格納部から読み出した書き込み要求に対する所定の処理の実行を待機する
処理をさらに実行させることを特徴とする、付記６〜８のいずれか１項記載のエミュレーションプログラム。
【０１８６】
（付記１０）
前記判定する処理において、前記格納部の格納する一以上の書き込み要求について、処理順とは逆の順序で検索し、前記読み出し要求のアクセス範囲と重なるか否かを判定する
ことを特徴とする、付記６〜９のいずれか１項記載のエミュレーションプログラム。
【０１８７】
（付記１１）
対象記憶部と前記対象記憶部の記憶領域を共用する複数の対象処理部とをそなえる対象装置を再現する情報処理装置におけるエミュレーション方法であって、
前記複数の対象処理部に対応する複数の仮想処理部の各々から発行される、前記対象記憶部に対応する仮想記憶部への書き込み要求を、処理される処理順に格納部に格納し、
前記仮想処理部から発行される前記仮想記憶部への読み出し要求について、当該読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なるか否かを判定し、
判定の結果、重ならない場合、前記読み出し要求に係る読み出し処理を実行する
ことを特徴とする、エミュレーション方法。
【０１８８】
（付記１２）
読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求を前記格納部に格納する
ことを特徴とする、付記１１記載のエミュレーション方法。
【０１８９】
（付記１３）
前記読み出し要求を格納する処理において、読み出し要求に係るアクセス範囲が前記格納部の格納する一以上の書き込み要求に係るアクセス範囲と重なると判定した場合、前記読み出し要求の処理順序が前記読み出し要求とアクセス範囲の重なる書き込み要求の直後になるように前記読み出し要求を前記格納部に格納する
ことを特徴とする、付記１２記載のエミュレーション方法。
【０１９０】
（付記１４）
前記格納部の格納する一以上の要求を処理順に読み出し所定の処理を実行し、
前記格納部から読み出した書き込み要求に係るアクセス範囲が、読み出し処理実行中の読み出し要求に係るアクセス範囲と重なるか否かを判断し、
判断の結果、重なる場合、当該読み出し処理が完了するまで前記格納部から読み出した書き込み要求に対する所定の処理の実行を待機する
ことを特徴とする、付記１１〜１３のいずれか１項記載のエミュレーション方法。
【０１９１】
（付記１５）
前記判定する処理において、前記格納部の格納する一以上の書き込み要求について、処理順とは逆の順序で検索し、前記読み出し要求のアクセス範囲と重なるか否かを判定する
ことを特徴とする、付記１１〜１４のいずれか１項記載のエミュレーション方法。
【符号の説明】
【０１９２】
１  エミュレーションサーバ（情報処理装置）
１ａ，１１００  ＣＰＵ
１ｂ，１３００  メモリ
１ｃ  記憶部
１ｄ  インタフェース部
１ｅ  入出力部
１ｆ，１ｈ  記録媒体
１ｇ  読取部
２  エミュレータ
３，６，１００，２００，３００  仮想装置
４  エミュレーション領域
５  エミュレーションプログラム
１０，１１０  仮想ＣＰＵ
２０，２０−１〜２０−３，１２０，１２０−１〜１２０−３  仮想デバイス
３０，１３０  仮想メモリ
４０  キュー処理部
４１  キュー格納部（格納部）
４１ａ  キュー
４１ｂ  メッセージキュー
４２  キュー制御部
４３  読出判定部
４４  アクセス制御部
１４０  アービタ
１５０  セレクタ
１０００  対象装置（装置）
１２００−１〜１２００−３  デバイス
１４００  内部バス
【図１】
2015215641.tif 000003
【図２】
2015215641.tif 000004
【図３】
2015215641.tif 000005
【図４】
2015215641.tif 000006
【図５】
2015215641.tif 000007
【図６】
2015215641.tif 000008
【図７】
2015215641.tif 000009
【図８】
2015215641.tif 000010
【図９】
2015215641.tif 000011
【図１０】
2015215641.tif 000012
【図１１】
2015215641.tif 000013
【図１２】
2015215641.tif 000014
【図１３】
2015215641.tif 000015
【図１４】
2015215641.tif 000016
【図１５】
2015215641.tif 000017
【図１６】
2015215641.tif 000018
【図１７】
2015215641.tif 000019
【図１８】
2015215641.tif 000020
【図１９】
2015215641.tif 000021
【図２０】
2015215641.tif 000022
【図２１】
2015215641.tif 000023
【図２２】
2015215641.tif 000024