(57)【要約】【課題】物理ＣＰＵが一つしかない仮想マルチプロセッサ環境を整備し、物理ＣＰＵを一個しか搭載していなくても、ゲストＯＳ側をマルチプロセッサ環境として動作可能にすることである。【解決手段】プロセッサ間割り込みをトラップするステップと、プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録するステップと、割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定するステップと、特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替えるステップとを有する仮想プロセッサの切り替え方法によって解決する。【選択図】図１
2008123015.tif 000002
【特許請求の範囲】
【請求項１】
プロセッサ間割り込みをトラップするステップと、
プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録するステップと、
割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定するステップと、
特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替えるステップと
を有する仮想プロセッサの切り替え方法。
【請求項２】
仮想計算機システムが有する物理ＣＰＵの数を監視するステップと、
前記物理ＣＰＵの数に応じて、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを示す切り替え許可フラグの内容を書き換えるステップと、
前記切り替え許可フラグの内容を参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定するステップと
を有する仮想プロセッサの切り替え方法。
【請求項３】
仮想プロセッサが物理ＣＰＵからデタッチしたデタッチ時刻を記録するステップと、
ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替える場合において、切り替え先となる他の仮想プロセッサが複数あるときには、それらの仮想プロセッサのデタッチ時刻を参照し、切り替え先となる仮想プロセッサを選択するステップと
を具備する請求項２記載の仮想プロセッサの切り替え方法。
【請求項４】
プロセッサ間割り込みをトラップする手順と、
プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録する手順と、
割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定する手順と、
特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替える手順と
をコンピュータに実行させるためのプログラム。
【請求項５】
仮想計算機システムが有する物理ＣＰＵの数を監視する手順と、
前記物理ＣＰＵの数に応じて、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを示す切り替え許可フラグの内容を書き換える手順と、
前記切り替え許可フラグの内容を参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定する手順と
をコンピュータに実行させるためのプログラム。
【請求項６】
プロセッサ間割り込みをトラップするトラップ部と、
プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録するマーク部と、
割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定する設定部と、
特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替える切替部と
を有する仮想計算機システム。
【請求項７】
ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを示す切り替え許可フラグと、
仮想計算機システムが有する物理ＣＰＵの数を監視する監視部と、
物理ＣＰＵの数に応じて、切り替え許可フラグの内容を書き換える制御部と、
切り替え許可フラグを参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定する切替部と
を有する仮想計算機システム。
【発明の詳細な説明】
【技術分野】
【０００１】
本発明は、仮想プロセッサの切り替え方法、プログラム及び仮想計算機システムに関する。
【背景技術】
【０００２】
仮想マルチプロセッサに関連する先行技術として、特開２００６−０９９１８２号公報（特許文献１参照）に記載された発明が知られる。特許文献１に記載された計算機システムにおいては、仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストＯＳが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる。選択部は、前記仮想計算機マネージャに設けられ、前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する。プロセッサ割り当て部は、前記仮想計算機マネージャに設けられ、前記選択手段によって選択された仮想プロセッサに実プロセッサを割り当てる。
【０００３】
さらに、特許文献１には、複数の仮想プロセッサのうちのいずれかの仮想プロセッサが目的の実行対象に関するスピンロックの取得に失敗したことを検出する検出部を具備する発明が記載されている。すなわち、仮想計算機マネージャが、仮想プロセッサによるスピンロック獲得の失敗を検出したら、そのスピンロックを取得している非実行中の仮想プロセッサを優先的に選択する。ここで、仮想計算機マネージャは、ゲストＯＳ側のカーネルで用いるサブルーチン（ロック取得インタフェース）を用いて、スピンロック獲得の失敗を検知する。
【０００４】
しかし、スピンロック獲得の失敗を、ロック取得インタフェースを用いて検出するとなると、仮想計算機マネージャのプログラムを更新するだけでは足りず、ゲストＯＳ側の修正も必要になってくる。すなわち、従来技術では、ゲストＯＳにおけるカーネルの改造が必須となる。
【０００５】
ゲストＯＳにおけるカーネルの改造を行わずに、仮想プロセッサがスピンロック取得待ちになったか否かを、ＶＭＭが認識する仕組みを実現することは可能である。本願発明者は、スピンロックの状態をＶＭＭが管理するのではなく、スピンロック取得待ちのビジーループ中に発行される特有の機械語命令をＶＭＭがトラップする仕組みを考えた。このトラップに応じて、ＶＭＭが適切に仮想プロセッサを切り替える。実際、スピンロック取得待ちのビジーループでは、特有の機械語命令が発行されている。この機械語命令をトラップすれば、ＶＭＭで、スピンロック取得待ちのビジーループを検出することができ、ゲストＯＳがスピンロック取得待ちになった瞬間に、ＶＭＭに制御を移すことが可能になる。
【０００６】
この手法は、特に、物理ＣＰＵが一つしかない仮想マルチプロセッサにとって有用である。仮想マルチプロセッサ、しかも物理ＣＰＵが一つしかないホストでマルチプロセッサをシミュレートした場合、スピンロック待ちしている仮想プロセッサは、タイムスライスまでビジーループを実行し続けてしまうからである。物理ＣＰＵが二つあれば、第一の仮想プロセッサが第一の物理ＣＰＵでスピンロック待ちしていても、スピンロックを取得している第二の仮想プロセッサが第二の物理ＣＰＵでクリティカルセクションを抜けることが可能である。しかし、物理ＣＰＵが一つしかないと、スピンロックを取得している第二の仮想プロセッサはクリティカルセクションを抜けることができない。
【０００７】
【特許文献１】特開２００６−０９９１８２号公報
【発明の開示】
【発明が解決しようとする課題】
【０００８】
本発明の課題は、物理ＣＰＵが一つしかない仮想マルチプロセッサ環境を整備し、物理ＣＰＵを一個しか搭載していなくても、ゲストＯＳ側をマルチプロセッサ環境として動作可能にすることである。
【課題を解決するための手段】
【０００９】
以下に、［発明を実施するための最良の形態］で使用される番号・符号を用いて、［課題を解決するための手段］を説明する。これらの番号・符号は、［特許請求の範囲］の記載と［発明を実施するための最良の形態］との対応関係を明らかにするために括弧付きで付加されたものである。ただし、それらの番号・符号を、［特許請求の範囲］に記載されている発明の技術的範囲の解釈に用いてはならない。
【００１０】
本発明による仮想プロセッサの切り替え方法においては、トラップするステップで、プロセッサ間割り込みをトラップする。また、記録するステップで、プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録する。また、設定するステップで、割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定する。また、切り替えるステップで、特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替える。
【００１１】
また、本発明による仮想プロセッサの切り替え方法においては、監視するステップで、仮想計算機システムが有する物理ＣＰＵの数を監視する。また、書き換えるステップで、前記物理ＣＰＵの数に応じて、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを示す切り替え許可フラグ（３４，３９，５１，６１，６２，７１，７２，７３）の内容を書き換える。また、決定するステップで、前記切り替え許可フラグ（３４，３９，５１，６１，６２，７１，７２，７３）の内容を参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定する。
【００１２】
また、本発明による仮想プロセッサの切り替え方法においては、記録するステップで、仮想プロセッサが物理ＣＰＵからデタッチしたデタッチ時刻を記録する。また、選択するステップで、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替える場合において、切り替え先となる他の仮想プロセッサが複数あるときには、それらの仮想プロセッサのデタッチ時刻を参照し、切り替え先となる仮想プロセッサを選択する。
【００１３】
また、本発明によるプログラムにおいては、プロセッサ間割り込みをトラップする手順と、プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録する手順と、割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定する手順と、特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替える手順とをコンピュータに実行させる。
【００１４】
また、本発明によるプログラムにおいては、仮想計算機システムが有する物理ＣＰＵの数を監視する手順と、前記物理ＣＰＵの数に応じて、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを示す切り替え許可フラグ（３４，３９，５１，６１，６２，７１，７２，７３）の内容を書き換える手順と、前記切り替え許可フラグ（３４，３９，５１，６１，６２，７１，７２，７３）の内容を参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定する手順とをコンピュータに実行させる。
【００１５】
また、本発明による仮想計算機システムにおいては、トラップ部（４１）が、プロセッサ間割り込みをトラップする。マーク部（４２）は、プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を記録する。設定部（４３）は、割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定する。切替部（４４）は、特権レベル変更命令がトラップされた場合に、当該割り込み配送先の仮想プロセッサに対応させて記録された前記識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替える。
【００１６】
また、本発明による仮想計算機システムにおいては、切り替え許可フラグ（３４，３９）が、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを示す。監視部（４６）は、仮想計算機システム（１１）が有する物理ＣＰＵの数を監視する。制御部（４７）は、物理ＣＰＵの数に応じて、切り替え許可フラグ（３４，３９）の内容を書き換える。切替部（４８）は、切り替え許可フラグ（３４，３９）を参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定する。
【発明の効果】
【００１７】
本発明によれば、物理ＣＰＵが一つしかない仮想マルチプロセッサ環境を整備し、物理ＣＰＵを一個しか搭載していなくても、ゲストＯＳ側をマルチプロセッサ環境として動作可能にすることができる。
【発明を実施するための最良の形態】
【００１８】
図１により、本発明による仮想計算機システムの実施形態の一例を説明する。図１における仮想計算機システム１０は、ハードウェア２０として、複数の物理ＣＰＵ、［物理ＣＰＵ１］２１、［物理ＣＰＵ２］２２と、タイマ２５とを有している。その他の構成要素は、便宜上、図示することを省略した。［物理ＣＰＵ１］２１、［物理ＣＰＵ２］２２には、仮想プロセッサが割り当てられ、命令が実行される。タイマ２５は、タイムスライスなど、時間を計数する。
【００１９】
メモリ上には、管理情報３０が保持される。この管理情報３０により、多数の仮想プロセッサが生成され、動作する。図中、［仮想プロセッサ１］３１、［仮想プロセッサ２］３２は、それぞれ、切替先選択情報３２，３７、切替前マーク３３，３８、切替許可フラグ３４，３９を有している。切替先選択情報３２，３７は、仮想プロセッサがタイムスライスまで動作した後などに必要となる、切替先となる仮想プロセッサを選択するための情報である。切替前マーク３３，３８は、後述するプロセッサ間割り込みで利用される。切替許可フラグ３４，３９は、後述するスケジューリングで利用される。
【００２０】
ソフトウェア４０としては、トラップ部４１と、マーク部４２と、設定部４３と、切替部４４とを有している。トラップ部４１は、プロセッサ間割り込みをトラップする。マーク部４２は、プロセッサ間割り込みの配送先となる仮想プロセッサに対応させて、当該プロセッサ間割り込みによって切り替えられる仮想プロセッサの識別番号を、切替前マーク３３，３８に記録する。設定部４３は、割り込み配送先の仮想プロセッサで実行される特権レベル変更命令に対してトラップを設定する。切替部４４は、特権レベル変更命令がトラップされた場合に、前記切替前マーク３３，３８に記録された識別番号を参照し、実行中の仮想プロセッサを、割り込み配送先の仮想プロセッサから、プロセッサ間割り込みによって切り替えられた仮想プロセッサへ切り替える。
【００２１】
図２により、本発明による仮想計算機システムの実施形態の他の例を説明する。図２の仮想計算機システム１１は、図１に比べ、ソフトウェア４５の構成が異なる。図２において、［仮想プロセッサ１］３１、［仮想プロセッサ２］３６の切替許可フラグ３４，３９は、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えることを許可するか否かを示している。ソフトウェア４５における監視部４６は、仮想計算機システム１１が有する物理ＣＰＵの数を監視する。制御部４７は、物理ＣＰＵの数に応じて、切り替え許可フラグ３４，３９の内容を書き換える。切替部４８は、切り替え許可フラグ３４，３９を参照して、ある仮想プロセッサを、同一の仮想マシンで動作する他の仮想プロセッサに切り替えるか否かを決定する。
【００２２】
ところで、一個の物理ＣＰＵしか搭載されていないホスト上のＶＭを、マルチプロセッサ対応とするためには、従来の一般的なＶＭＭにおいて用いられる仕組みに加えて、スピンロックの問題及び以下の二つの問題に対処する仕組みを新たに考慮する必要がある。
（ａ）プロセッサ間割り込みの問題
（ｂ）スケジューリングの問題
以下、（ａ）プロセッサ間割り込みの問題、及び、（ｂ）スケジューリングの問題と、これらを解決する具体例について、図面を参照して詳細に説明する。
【００２３】
（ａ） プロセッサ間割り込みの問題
マルチプロセッサマシンのＯＳでは、例えばＴＬＢ（Translation Lookaside Buffer：論理アドレス−＞物理アドレス変換のキャッシュ）のクリアや、ＣＰＵローカルタイマの時刻あわせといった処理において、プロセッサ間割り込みを利用している。
【００２４】
割り込みを発行した側のプロセスは、受け取った側の処理が終わるまで、スピンロックで待ち合わせることがある。そのため、プロセッサ間割り込みを単純にトラップして無視してしまうと、デッドロックが生じる。従って、プロセッサ間割り込みの仮想化が必須である。
【００２５】
プロセッサ間割り込みに使われる割り込み番号はマシンのアーキテクチャによって範囲が決められている。ＰＣ／ＡＴ互換機では、割り込みベクタ２５１−２５５である。例として、Ｌｉｎｕｘで用いられているプロセッサ間割込みを表１に示す。
【００２６】
【表１】
2008123015.tif 000003
【００２７】
プロセッサ間割込みでなければ、ＶＭＭは割り込みをトラップして適切な仮想プロセッサに配送するだけでよい。しかし、プロセッサ間割り込みの場合は、受け取り側の仮想プロセッサで必要処理が終わったら直ちに元の仮想プロセッサに物理ＣＰＵを返す必要がある。さもないと、例えば上表の「スケジューリング」の処理においては、プリエンプトされるはずのプロセスＡが仮想プロセッサだけ切り替わってそのまま動き続けてしまうといった現象が発生してしまう。
【００２８】
＜プロセッサ間割り込みに関する仕組みの動作説明＞
プロセッサ間割り込みの問題を解決するため、当実施の形態では、ＶＭＭに以下の仕組みを実装する。まず、プロセッサ間割込みを表す割込みベクタをトラップする設定でＶＭを作成する。次に、ＶＭＭが管理する仮想プロセッサ情報に「プロセッサ間割込み発行元仮想プロセッサ」のエントリを追加する。
【００２９】
ＶＭＭは以下の要領でプロセッサ間割込みのトラップに対してハンドリングする。
１．割込み配送先の仮想プロセッサ情報における「プロセッサ間割込み発行元仮想プロセッサ」のエントリに、仮想プロセッサのＩＤを記録する。
２．割込み配送先の仮想プロセッサに切り替える。
３．ＶＭに割込みを配送する。このとき、特権レベル変更命令にトラップの設定をしておく。
４．ゲストＯＳでプロセッサ間割込みに対する処理が行われる。割込みハンドラ関連の処理が終了して特権レベルがユーザモードに変更されたタイミングでトラップされてＶＭＭに制御が移る。
５．特権レベル変更命令のトラップを解除し、「プロセッサ間割込み発行元仮想プロセッサ」に記録された仮想プロセッサへプロセッサを切り替える。
６．元のゲストＯＳの処理を続行する。
【００３０】
上記の手順５．において、特権レベル変更命令に関して既に何らかのハンドリングを行っているＶＭＭに本手法を追加する場合は、ハンドラの冒頭で「プロセッサ間割込み発行元仮想プロセッサ」に値が入っているか否かによって処理を切り分ければよい。値が入っていれば上記処理を行い、入っていなければ通常のハンドラを実行する。
【００３１】
まず、図３を参照しながら、物理ＣＰＵが一つの場合について説明する。図３に示すように、ＶＭＭは、物理ＣＰＵ情報として、ＣＰＵ１ひとつのみを保持している。ＶＭ１では、仮想プロセッサｖｃｐｕ１と、仮想プロセッサｖｃｐｕ２とが生成されている。初期状態では、物理ＣＰＵ１が仮想プロセッサｖｃｐｕ１にアタッチされてＶＭ１で動作しているとする。
【００３２】
［○１］仮想プロセッサｖｃｐｕ１がプロセッサ間割り込みを発行する。プロセッサ間割り込みは、特権命令の一つである。［○２］この特権命令が捕捉されて、ＶＭＭに処理が移る。［○３］プロセッサ間割り込みの通知先である仮想プロセッサｖｃｐｕ２に対して、物理ＣＰＵを選択する。この場合は物理ＣＰＵが１個なので、ＣＰＵ１を選択する。仮想プロセッサｖｃｐｕ２の仮想プロセッサ情報に、プロセッサ間割り込みの発行元である「仮想プロセッサｖｃｐｕ１」のマークをつけておく。
【００３３】
［○４］仮想プロセッサｖｃｐｕ１を仮想プロセッサｖｃｐｕ２に切り替える。続いて特権レベル変更命令をマスクして、プロセッサ間割り込みをＶＭ１の仮想プロセッサｖｃｐｕ２に配送する。［○５］プロセッサ間割り込みの通知先である仮想プロセッサｖｃｐｕ２では、特権レベル（カーネルモード）で割り込みハンドラが実行される。［○６］仮想プロセッサｖｃｐｕ２で割り込みハンドラ処理が終わると、ユーザプロセスに戻る。このとき、特権レベルがユーザレベルに変更される。
【００３４】
［○７］ユーザレベルへの変更をＶＭＭが捕捉する。［○８］ＶＭＭにおいて、特権レベル変更命令ハンドラが実行されるが、ハンドラは仮想プロセッサｖｃｐｕ２に「仮想プロセッサｖｃｐｕ１」のマークが付いているのを見て、プロセッサ間割り込みのシミュレートから戻ってきた時点であることを認識する。そこで、［○４］で設定したマスクを解除すると共に、当該マークより仮想プロセッサｖｃｐｕ１に戻せばよいことが分かる。そこで、物理ＣＰＵを仮想プロセッサｖｃｐｕ２から仮想プロセッサｖｃｐｕ１へ戻し、マークを削除する。［○９］仮想プロセッサｖｃｐｕ１でプロセッサ間割り込みの後の処理を続行する。
【００３５】
次に、図４を参照しながら、物理ＣＰＵが二つの場合について説明する。図４に示すように、ＶＭＭは、物理ＣＰＵ情報として、ＣＰＵ１及びＣＰＵ２の二つを保持している。ＶＭ１では、仮想プロセッサｖｃｐｕ１と、仮想プロセッサｖｃｐｕ２とが生成され、ＶＭ２では、仮想プロセッサｖｃｐｕ３と、仮想プロセッサｖｃｐｕ４とが生成されている。初期状態では、物理ＣＰＵ１が仮想プロセッサｖｃｐｕ１にアタッチされてＶＭ１で動作し、物理ＣＰＵ２が仮想プロセッサｖｃｐｕ３にアタッチされてＶＭ２で動作しているとする。
【００３６】
［ＣＰＵ１の動作］［○１］物理ＣＰＵ１で動作している仮想プロセッサｖｃｐｕ１が、プロセッサ間割り込みを発行する。プロセッサ間割り込みは、特権命令の一つである。［○２］この特権命令が捕捉されてＶＭＭに処理が移る。［○３］プロセッサ間割り込みの通知先である仮想プロセッサｖｃｐｕ２に対して、物理ＣＰＵを選択する。ここでは、物理ＣＰＵが２個あるので、ＣＰＵ２を選択する。（なお、物理ＣＰＵが３個あって仮想プロセッサｖｃｐｕ２がＣＰＵ３にアタッチされていたらＣＰＵ３を優先する。）
【００３７】
［○４］選択したＣＰＵ２は自身であるＣＰＵ１とは別の物理ＣＰＵなので、プロセッサ間割り込みを実際に発行する。同時に、ＣＰＵ２で動作していた仮想プロセッサｖｃｐｕ３をマークする。仮想プロセッサｖｃｐｕ２の仮想プロセッサ情報に「仮想プロセッサｖｃｐｕ３」のマークをつけておく。［○５］ＶＭ１の仮想プロセッサｖｃｐｕ１に戻って処理を続行する。
【００３８】
［ＣＰＵ２の動作］（Ａ）ＣＰＵ１における処理［○４］によって、プロセッサ間割り込みを受け取る。（Ｂ）この割り込みが捕捉されてＶＭＭに処理が移る。（Ｃ）仮想プロセッサ情報を参照して、自身をアタッチしている「仮想プロセッサｖｃｐｕ３」のマークがついている仮想プロセッサを探す。ここでは、仮想プロセッサｖｃｐｕ２にマークがついているので、仮想プロセッサｖｃｐｕ３を仮想プロセッサｖｃｐｕ２に切り替える。仮想プロセッサｖｃｐｕ２の特権変更命令をマスクしておく。
【００３９】
（Ｄ）仮想プロセッサｖｃｐｕ２は、特権レベルで割り込みハンドラを実行する。（Ｅ）ユーザプロセスに戻るため特権レベルをユーザモードに変更する。（Ｆ）ユーザモードへの変更をＶＭＭでトラップする。（Ｇ）ＶＭＭの特権レベル変更命令のハンドラは、仮想プロセッサｖｃｐｕ２に「仮想プロセッサｖｃｐｕ３」のマークがついているのを見て、プロセッサ間割り込みのシミュレートから戻ってきた時点と判断する。まず、（Ｃ）で設定したマスクを解除する。さらに、マークより、ＣＰＵ２を仮想プロセッサｖｃｐｕ３に戻せばよいことが分かる。そこで、仮想プロセッサｖｃｐｕ２を仮想プロセッサｖｃｐｕ３に戻し、マークを削除する。（Ｈ）仮想プロセッサｖｃｐｕ３の処理を続行する。
【００４０】
（ｂ） スケジューリングの問題
通常ＶＭＭは、ＶＭ毎に仮想プロセッサというデータ構造を用意し、いずれかの仮想プロセッサに物理ＣＰＵをアタッチし、タイムスライスおきにアタッチする仮想プロセッサを切り替える、という仕組みで実装される。各仮想プロセッサはいずれか一つのＶＭに所属する。
【００４１】
ゲストＯＳがマルチプロセッサの場合は、同一ＶＭに所属する２つの仮想プロセッサそれぞれに物理ＣＰＵをアタッチすることになる。ただしタイムスライスが経過して仮想プロセッサの切り替えを行うとき、同じＶＭの仮想プロセッサを切り替え先として選んでしまうと、ＶＭ内で仮想プロセッサの切り替えを行うことになって無駄である。別ＶＭの仮想プロセッサを切り替え先の候補とすべきである。
【００４２】
しかし、物理ＣＰＵ１個でマルチプロセッサ対応のゲストＯＳを動作させるためには、ＶＭ内で仮想プロセッサの切り替えを行うことになる。すなわち、ＶＭ内における仮想プロセッサの切り替えを許可せざるを得ない。例えば、ホスト上にＶＭが一つしかない場合には、そのＶＭに所属する２つの仮想プロセッサを１つの物理ＣＰＵで順次切り替えていく。
【００４３】
そこで、当実施の形態では、仮想プロセッサを切り替える場合において、物理ＣＰＵをアタッチする仮想プロセッサを選ぶときには、別ＶＭの仮想プロセッサから選択するのではなく、同一ＶＭに所属する仮想プロセッサも含めた全仮想プロセッサ（ただし切り替え前の仮想プロセッサは除く）を候補とし、ＶＭ内における仮想プロセッサの切り替えを許可する。
【００４４】
また、ホストにプロセッサ増強を行って物理ＣＰＵの数が２個になった場合には、ＶＭ内における仮想プロセッサの切り替えを禁止できるようにする。仮想プロセッサ切り替えの際、物理ＣＰＵをアタッチする仮想プロセッサを選ぶとき、同一ＶＭに所属する仮想プロセッサを候補からはずし、別ＶＭに属する仮想プロセッサを候補として選択する。
【００４５】
図５に、ＶＭ内切替許可フラグの一例を示す。図５において、ＶＭＭ５０には、ひとつの切替許可フラグ５１が設けられている。左図に示すように、物理ＣＰＵ情報として物理ＣＰＵ１情報５２ひとつが保持されている場合、マルチプロセッサをシミュレートするときには切替許可フラグ５１はＴＲＵＥとなる。切替許可フラグ５１がＴＲＵＥの場合、ＶＭ内では、仮想プロセッサの切り替えが許可される。
【００４６】
右図に示すように、物理ＣＰＵ情報として、物理ＣＰＵ１情報５２及び物理ＣＰＵ２情報５３ふたつが保持されている場合、マルチプロセッサをシミュレートするときには、切替許可フラグ５１はＦＡＬＳＥとなる。切替許可フラグ５１がＦＡＬＳＥの場合、同一ＶＭ内における仮想プロセッサの切り替えが禁止される。従って、ＶＭ内で仮想プロセッサｖｃｐｕ１が物理ＣＰＵ１にアタッチされていた場合には、同一ＶＭ内の仮想プロセッサｖｃｐｕ２は、物理ＣＰＵ１にアタッチされることはなく、物理ＣＰＵ２にアタッチされることになる。
【００４７】
図６に、ＶＭ内切替許可フラグの他の例を示す。図６において、ＶＭＭ６０には、仮想マシンごとに切替許可フラグ６１，６２が設けられている。今、ひとつの物理ＣＰＵが搭載されていて、物理ＣＰＵ情報としては、物理ＣＰＵ１情報６３のみが保持されているとする。図示するように、ＶＭ１では、切替許可フラグ６１がＴＲＵＥになっている。従って、ＶＭ１内では、仮想プロセッサｖｃｐｕ１から仮想プロセッサｖｃｐｕ２への切り替えが許可される。一方、ＶＭ２では、切替許可フラグ６２がＦＡＬＳＥになっている。従って、ＶＭ２内では、仮想プロセッサの切り替えが禁止される。このように、切替許可フラグ６１，６２を、仮想マシンごとに設ければ、仮想計算機システムの柔軟な運用が可能になる。
【００４８】
図７に、ＶＭ内切替許可フラグのその他の例を示す。図７において、ＶＭＭ７０には、仮想プロセッサごとに切替許可フラグ７１〜７３が設けられている。今、ひとつの物理ＣＰＵが搭載されていて、物理ＣＰＵ情報としては、物理ＣＰＵ１情報７４のみが保持されているとする。図示するように、仮想プロセッサｖｃｐｕ１では、切替許可フラグ７１がＴＲＵＥになっている。従って、ＶＭ１内では、仮想プロセッサｖｃｐｕ１から仮想プロセッサｖｃｐｕ２への切り替え、及び、仮想プロセッサｖｃｐｕ１から仮想プロセッサｖｃｐｕ３への切り替えが許可される。一方、仮想プロセッサｖｃｐｕ３では、切替許可フラグ７３がＦＡＬＳＥになっている。従って、仮想プロセッサｖｃｐｕ３から仮想プロセッサｖｃｐｕ１への切り替え、及び、仮想プロセッサｖｃｐｕ３から仮想プロセッサｖｃｐｕ２への切り替えは禁止される。
【００４９】
切り替え先の仮想プロセッサの候補が複数ある場合には、いずれの仮想プロセッサを選択すべきかが問題になる。その際、仮想プロセッサのデタッチ時刻を基準にすれば、切り替え先の仮想プロセッサを一意に決定できると共に、順番に仮想プロセッサを切り替えることができる。切り替え先の仮想プロセッサを選ぶ際には、「デタッチ時刻」がもっとも古いものというルールを適用することができる。
【００５０】
図８を参照しながら説明する。ここで、物理ＣＰＵは一台のみ、ひとつのＶＭに４台の仮想プロセッサｖｃｐｕ１，ｖｃｐｕ２，ｖｃｐｕ３，ｖｃｐｕ４が生成されているとする。仮想プロセッサｖｃｐｕ１が実行中の時、タイムスライスが切れて、仮想プロセッサｖｃｐｕ１を切り替える場面を想定する。切り替え先候補はｖｃｐｕ２，ｖｃｐｕ３，ｖｃｐｕ４である。上図に示すように、切り替え先候補の中で「最終デタッチ時刻」が最も古いのは、仮想プロセッサｖｃｐｕ２である。そこで、切り替え先として仮想プロセッサｖｃｐｕ２を選択する。仮想プロセッサｖｃｐｕ１を仮想プロセッサｖｃｐｕ２に切り替えたら、仮想プロセッサｖｃｐｕ１の「最終デタッチ時刻」を更新する。このとき、各仮想プロセッサの最終デタッチ時刻は、下図のようになる。
【００５１】
切り替え先の仮想プロセッサｖｃｐｕ２が、処理を終え、タイムスライスが切れると、プロセッサ切り替えとなり、「最終デタッチ時刻」の最も古い仮想プロセッサｖｃｐｕ４へと処理が移る。続いて、仮想プロセッサｖｃｐｕ３へと切り替わり、その後、最終的には仮想プロセッサｖｃｐｕ１に処理が戻ってくる。
【００５２】
＜スケジューリングに関する仕組みの動作説明＞
図９に、仮想マルチプロセッサの切り替え方法を説明する図を、図１０に、フローチャートを示す。図９において、タイマ９０は、ティック間隔でタイマ割込みを発生する。［物理ＣＰＵ１］９１には、ＶＭ９３内の仮想プロセッサ９４，９５のいずれかがアタッチされる。ＶＭＭ９２は、物理ＣＰＵ情報９６と、仮想プロセッサ情報とを保持している。
【００５３】
仮想プロセッサ情報［ｖｃｐｕ１］には、［仮想プロセッサ１］９４に関する情報が格納されている。すなわち、［仮想プロセッサ１］９４を走行させるタイムスライス値、［仮想プロセッサ１］９４が最後にデタッチされた時刻、［仮想プロセッサ１］９４の切替を許可するか否かを示すフラグが格納されている。同様に、仮想プロセッサ情報［ｖｃｐｕ２］には、［仮想プロセッサ２］９５に関する情報が格納されている。
【００５４】
ＶＭＭ９２の物理ＣＰＵ情報９６には、ホストに搭載されている物理ＣＰＵの台数に関する情報が格納されている。図９に示すように、現在搭載されている物理ＣＰＵは、［物理ＣＰＵ１］９１一台なので、物理ＣＰＵ情報９６を参照すると、物理ＣＰＵの台数は一台であることが分かる。このとき、ＶＭＭ９２は、同一ＶＭ内における仮想プロセッサの切替を許可するため、仮想プロセッサ情報の切替許可フラグをＴＲＵＥに制御する。切替許可フラグがＴＲＵＥの場合、同一ＶＭ内における仮想プロセッサの切替が許可される。
【００５５】
図１０において、タイマ９０がティック間隔でタイマ割込みを発生させ（Ｓ１０）、これが［物理ＣＰＵ１］９１に通知される。ＶＭＭは、［物理ＣＰＵ１］９１に通知されたタイマ割り込みをトラップする（Ｓ１１）。そして、仮想プロセッサ情報［ｖｃｐｕ１］におけるタイムスライス値をデクリメントする（Ｓ１２）。その結果、タイムスライス値がゼロでなければ（Ｓ１３）、タイマ割込みをＶＭに配送し（Ｓ１４）、処理を終了する。なおタイマ割込みを配送すると、ゲストＯＳ上でプロセス切り替えなどが行われる。
【００５６】
デクリメントした結果、タイムスライス値がゼロになった場合には（Ｓ１３）、［仮想プロセッサｖｃｐｕ１］９４を切り替える。今、物理ＣＰＵが一つなので、仮想プロセッサ情報［ｖｃｐｕ１］における切替許可フラグはＴＲＵＥである。そこで、［仮想プロセッサｖｃｐｕ１］９４以外の全仮想プロセッサを切り替え候補とする。当例では、候補が［仮想プロセッサｖｃｐｕ２］９５しかないので［仮想プロセッサｖｃｐｕ２］９５を選択する（Ｓ１５）。もし候補が複数ある場合には、「最終デタッチ時刻」が最も古い仮想プロセッサを選択すればよい。
【００５７】
選択したら、［仮想プロセッサｖｃｐｕ１］９４の仮想プロセッサ情報［ｖｃｐｕ１］を更新する（Ｓ１６）。すなわち、タイムスライス値を初期値に戻し、最終デタッチ時刻に現在時刻を記録する。続いて、［仮想プロセッサｖｃｐｕ１］９４から［仮想プロセッサｖｃｐｕ２］９５へ、仮想プロセッサの切り替えを行う（Ｓ１７）。図９ではＶＭ９３側で切り替えているが、仮想プロセッサの切り替えは、ＶＭＭ９２の処理である。
【００５８】
以上説明したように、本発明では、物理ＣＰＵを１個しか搭載していなくてもゲストＯＳ側をマルチプロセッサ環境として動作可能にすることができる。従って、ホスト側が物理ＣＰＵのホットプラグ機能に対応していれば、ゲストＯＳがホットプラグに対応していなくても、物理ＣＰＵを１個から２個に増設する場合など、ゲストＯＳをリブートしなくても性能増強することができる。また、いったんホストを落として物理ＣＰＵを増設した後、再び立ち上げるときにゲストＯＳ側の設定変更が必要ない。例えば、シングルプロセッサ用とマルチプロセッサ用でカーネルの入れ替えや起動オプションを変更する必要がない。また、物理ＣＰＵを複数搭載したホスト上のマルチプロセッサＶＭを、物理ＣＰＵ１個のホストへ移動することも可能になる。
【図面の簡単な説明】
【００５９】
【図１】図１は、本発明による仮想計算機システムの実施形態の一例を説明する図である。
【図２】図２は、本発明による仮想計算機システムの実施形態の他の例を説明する図である。
【図３】図３は、プロセッサ間割り込みの仮想化について説明する図である。
【図４】図４は、プロセッサ間割り込みの仮想化について説明する他の図である。
【図５】図５は、切替許可フラグについて説明する図である。
【図６】図６は、切替許可フラグについて説明する他の図である。
【図７】図７は、切替許可フラグについて説明するその他の図である。
【図８】図８は、仮想プロセッサの選択方法について説明する図である。
【図９】図９は、仮想マルチプロセッサの切り替え方法を説明する図である。
【図１０】図１０は、図９の動作を説明するフローチャートである。
【符号の説明】
【００６０】
１０，１１  仮想計算機システム
２０  ハードウェア
２１，２２，９１  物理ＣＰＵ
２５，９０  タイマ
３０  管理情報
３１，３６，９４，９５  仮想プロセッサ
３２，３７  切替先選択情報
３３，３８  切替前マーク
３４，３９，５１，６１，６２，７１，７２，７３  切替許可フラグ
４０，４５  ソフトウェア
４１  トラップ部
４２  マーク部
４３  設定部
４４  切替部
４６  監視部
４７  制御部
５０，６０，７０，９２  ＶＭＭ
５２，５３，６３，７４，９６  物理ＣＰＵ情報
９３  ＶＭ
【図１】
2008123015.tif 000004
【図２】
2008123015.tif 000005
【図３】
2008123015.tif 000006
【図４】
2008123015.tif 000007
【図５】
2008123015.tif 000008
【図６】
2008123015.tif 000009
【図７】
2008123015.tif 000010
【図８】
2008123015.tif 000011
【図９】
2008123015.tif 000012
【図１０】
2008123015.tif 000013