計算機システム、プロセッサ割り当て方法及びプログラム
【課題】選択された仮想プロセッサが不要にスピンループして処理効率が悪くなるという問題を解決する。
【解決手段】VMM31によって構築される仮想計算機実行環境32では、仮想プロセッサ331-0〜331-3が動作するマルチプロセッサ環境を前提としてゲストOS340が動作する。VMM31は、仮想プロセッサ331-0〜331-3の中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する、選択手段としての機能を持つ。VMM31はまた、選択された仮想プロセッサに実プロセッサを割り当てる、プロセッサ割り当て手段としての機能をも持つ。
【解決手段】VMM31によって構築される仮想計算機実行環境32では、仮想プロセッサ331-0〜331-3が動作するマルチプロセッサ環境を前提としてゲストOS340が動作する。VMM31は、仮想プロセッサ331-0〜331-3の中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する、選択手段としての機能を持つ。VMM31はまた、選択された仮想プロセッサに実プロセッサを割り当てる、プロセッサ割り当て手段としての機能をも持つ。
【発明の詳細な説明】
【技術分野】
【0001】
本発明は、仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作する計算機システムに係り、特に、複数の仮想プロセッサの中から処理を実行させる仮想プロセッサを選択して、その選択された仮想プロセッサに実プロセッサを割り当てるのに好適な、計算機システム、プロセッサ割り当て方法及びプログラムに関する。
【背景技術】
【0002】
近年、パーソナルコンピュータ等の計算機システムにおいて、仮想計算機(Virtual Machine)システム(以下、VMシステムと称する)を実現するためのアプリケーション(アプリケーションプログラム)が利用されるようになってきている。このようなアプリケーションは、VM(Virtual Machine)アプリケーションと呼ばれる。
【0003】
さて、計算機システム(実計算機システム)は、一般に、実プロセッサ、各種I/O(入出力)装置及びメモリ(図示せず)等のハードウェア(HW)で構成されている。この計算機システムのハードウェア構成上では、ホストOSと呼ばれるOSが動作する。ホストOS上では各種アプリケーションが実行される。このアプリケーションの1つが上記VMアプリケーションである。このVMアプリケーションの実行により、VMシステムを管理する仮想計算機マネージャ(Virtual Machine Manager、以下、VMMと称する)が実現される。VMMは、仮想プロセッサ、仮想I/O(入出力)装置及び仮想メモリ装置を含む仮想HWを実現する。VMMは、これらの仮想プロセッサ、仮想I/O装置及び仮想
メモリ装置をエミュレートして、仮想計算機実行環境を構築(提供)する。VMMは、この仮想計算機実行環境にゲストOSと呼ばれる適切なOSをロードし、実行する。具体的には、VMMは、仮想HWとしての仮想メモリ装置にゲストOSのコードを展開し、その実行コードを仮想プロセッサのエミュレートという形で実行することで、ゲストOSの処理を進める。ゲストOSからのI/O要求は、VMMが仮想I/O装置のエミュレートを行うことにより処理される。
【0004】
さて、ゲストOSがマルチプロセッサ環境を要求しているときには、仮想プロセッサを複数用意することで対応できる。計算機システム(ホストシステム)がマルチプロセッサシステムである場合には、それら複数の仮想プロセッサを、ある程度同時に並列に処理することが可能である。しかし一般的には、全ての仮想プロセッサに対して実プロセッサが同時に割り当てられる保証はない。このような事態は、例えば、実プロセッサの数が仮想プロセッサより少ない場合に起きる。また、計算機システム内の他の処理(アプリケーションやOS本体の処理)を、実プロセッサが実行しなければならない場合にも、このような事態は起きる。つまり計算機システム内では、一部の実プロセッサしかVMMアプリケーションに割り当てられないタイミングがある。このため、仮想プロセッサが複数存在する場合、時間を決めて、一部の仮想プロセッサを選択して実プロセッサを割り当てるのが一般的である。この場合、選択された仮想プロセッサで処理が実行されることにより、システム全体の処理が進められる。
【0005】
このように、VMMは一般的な計算機システム(以下、第1の計算機システムと称する)内で、仮想的な計算機実行環境(仮想計算機実行環境)を構築して、その中でゲストOSを実行することができる。ここでは、VMMは、OS上で動作する1つのアプリケーション(VMアプリケーション)として実装される。
【0006】
この他に、VMMが、計算機システムの実HW上にVM機構(HWとしての仮想計算機支援機構)として実装される構成も知られている。この計算機システム(以下、第2の計算機システムと称する)において、VM機構は、上記第1の計算機システム内のVMアプリケーションと同様に、実プロセッサ、実I/O装置及び実メモリ装置を仮想化して各ゲストOSに機能として提供する。つまりVM機構は、仮想プロセッサ、仮想I/O装置及び仮想メモリ装置をエミュレートする。またVM機構は、実プロセッサ、実I/O装置及び実メモリ装置等のHWリソースを、時間的、領域的(空間的)に仮想プロセッサ、仮想I/O装置及び仮想メモリ装置に割り当てる。このようにしてVM機構の上には、仮想計算機実行環境が当該VM機構により構築される。ゲストOSは、この仮想計算機実行環境にロードされて、仮想プロセッサにより実行される。ここで、ゲストOSがマルチプロセッサ構成を要求している場合、仮想プロセッサは複数用意される。この場合も、全ての仮想プロセッサに対して、実プロセッサを同時に割り当てることは必ずしもできない。その理由としては、例えば実プロセッサ数が元々足りない場合がある。また、他のゲストOSの実行のために、一部の実プロセッサが使用されている場合もある。
【0007】
上記第1または第2の計算機システムでは、VMアプリケーションまたはVM機構により、複数の仮想プロセッサの中から、細かい時間毎にいずれかの仮想プロセッサが選択される。そして、選択された仮想プロセッサの処理が、決められた時間、あるいはある事象が発生するまで、実プロセッサによりエミュレートされることで進められる(時分割処理)。このような処理が、全ての仮想プロセッサに対して、例えば順番に行われることにより、ゲストOS全体としての処理が進行する。
【0008】
上記第1または第2の計算機システムにおいて、ゲストOSがマルチプロセッサをサポートするOSで、かつVMMがマルチプロセッサ構成の仮想HWをエミュレートするものとする。このようなゲストOSでは、カーネル内部でスピンロックによる排他制御が行われることが多い。スピンロックは、変数(スピンロック変数)をフラグのように使い、それをTAS(Test And Set)命令などで排他的に変更することにより、排他制御区間に入れる排他制御対象を高々1つに限定する手法であり、一般的なマルチプロセッサシステムのOSで広く使われているものである。ゲストOSでの排他制御対象は仮想プロセッサである。また、スピンロック変数は、排他制御が必要となるデータ(キュー、リスト等のデータ)、あるいは処理(処理コード)毎、即ち実行対象毎に用意される。
【0009】
ここで、VMMが動作させるゲストOSがマルチプロセッサOSで、かつ複数のプロセッサ、例えば4つのプロセッサの存在を前提としているものとする。この場合、VMMはゲストOS実行時に4つの仮想プロセッサに対してゲストOSのコードを実行させる必要がある。計算機システムが潤沢に実プロセッサを備えており、これら仮想プロセッサの全てに同時に実プロセッサを割り当てることができることが理想である。しかし、ゲストOSが使う仮想プロセッサの数が実プロセッサ以下という条件は常には望むことはできない。そのため、一般的には、VMMがゲストOSの仮想プロセッサを選択して、限られた実プロセッサを割り当てることになる。そしてVMMは、一定時間、その仮想プロセッサの処理を進めた後、他の仮想プロセッサを選択して処理を進める手順、即ちスケジューリングを繰り返す。勿論、使える実プロセッサ数が複数なら、複数の仮想プロセッサを選ぶことも可能である。
【0010】
前述した計算機システム(第1または第2の計算機システム)において、ゲストOS内の各仮想プロセッサは、必要に応じてスピンロックを確保して排他制御区間内で処理を実行する。この計算機システムには、ロックが解除されるまでスピンロック変数を繰り返しテストする状態、つまりスピンロックをビジーウェイト(スピンループ)している状態の仮想プロセッサも存在し得る。もし、実プロセッサ数が仮想プロセッサ数より少ない場合には、VMMは同時実行できる仮想プロセッサを選択しなければならない。そこで従来の計算機システムのスケジューリングでは、各仮想プロセッサの状態に無関係に、例えばラウンドロビン法により一定の順番で仮想プロセッサが選択される。このため、スピンロックの解放を待ってビジーウェイトしている状態の仮想プロセッサが選択される可能性がある。この場合、次の仮想プロセッサの選択のタイミングまで、ビジーウェイトの処理のみが行われてしまい、有益な処理が何も行われないことになる。特に、仮想プロセッサ同士での取り合いが頻繁に行われるスピンロック変数が存在する場合には、そのような状況が頻発し、結果的に処理速度の低下を招く。
【0011】
以上は、スピンロックによる排他制御が仮想プロセッサに適用された例である。この他に、スピンロックによる排他制御を、アプリケーションとしてのプロセス内のスレッド(OS上で動作するマルチスレッドプログラム)に適用した技術(以下、先行技術と称する)も知られている(例えば、特許文献1参照)。この先行技術の特徴は、スレッド間でスピンロックを用いた排他制御を行っている場合に、OSのスケジューラがスピンロック待ち状態のスレッド以外を選択して効率よくプロセッサを使用する点にある。特許文献1には、アプリケーションのスレッドが「スピンロック待ち状態」になった場合に、スピンロックに使うスピンロック変数(共有変数)のアドレスをOSのスケジューラが知ることができる仕組みが記載されている。この仕組みにより、OSのスケジューラは、スレッドをディスパッチ候補として選択したときに、そのスレッドがスピンロック待ち状態か否かの判断をすることができる。そして上記特許文献1では、一定の順番でスレッドを選択する選択手法ではなくて、スピンロック待ちではないスレッドを優先的に選択する選択手法を適用することにより、無駄なスピンループを避けるようにしている。なお、スレッドも仮想プロセッサも、一種のプログラム実行単位である点では共通する。
【特許文献1】特開平5−204675(段落0007乃至0011、段落0054)
【発明の開示】
【発明が解決しようとする課題】
【0012】
上述のように、上記先行技術では、スピンロック待ちではないスレッドを優先的に選択する選択手法(以下、選択手法1と称する)により、無駄なスピンループを避けるようにしている。そこで、この選択手法1を、ゲストOSにおける仮想プロセッサの選択に適用することが考えられる。しかし、上記先行技術においては、ディスパッチ時にスピンロック待ち状態でないスレッドを選択しても、その後、この選択されたスレッドが、他のスレッドの確保した(そして現在当該他のスレッドに実プロセッサが割り当てられていない状態における)スピンロックの待ち状態になった場合には、やはり無駄にスピンループしてしまう事態が発生し得る。この点において、上記先行技術は、スケジューラが新たなスレッドを選択する際に限って効果がある技術であるといえる。つまり、上記先行技術は、スレッドの実行効率を確かに改善することができるものの、アプリケーションレベルでのみ効果がある技術であるといえる。
【0013】
したがって、上記選択手法1をゲストOSにおける仮想プロセッサの選択に適用して、VMMがスピンロック待ちではない仮想プロセッサを優先的に選択し、その選択された仮想プロセッサに実プロセッサを割り当てるだけでは、選択された仮想プロセッサは、その後、実プロセッサが割り当てられていない、つまり非実行中の状態にある仮想プロセッサが確保しているスピンロックの待ち状態になってスピンループを発生する虞がある。この場合、ゲストOSの性能低下(処理速度の低下)を招く。
【0014】
アプリケーションレベルの排他制御の影響は、そのアプリケーションの効率だけに止まり、他のアプリケーションに影響を与えるものではない。なぜなら、OSが各アプリケーション毎に平等にプロセッサを割り当てようとするからである。ところが、上記選択手法1をゲストOSにおける仮想プロセッサの選択に適用することで、非実行中の状態にある仮想プロセッサが確保しているスピンロックの待ち状態になってスピンループを発生すると、アプリケーションのスレッドのスピンループとは異なり、(OS上のアプリケーションを含めて)OS全体の処理が止まってしまう可能性がある。
【0015】
これらの理由から、VMMによりマルチプロセッサ環境を前提としたゲストOSを実行する際には、スピンロック変数を利用したスピンロックの処理に関して注意が必要であり、上記先行技術とは違った、より効率の良いスピンロックの扱いが要求される。
【0016】
本発明は上記事情を考慮してなされたものでその目的は、選択された仮想プロセッサが不要にスピンループして処理効率が悪くなるという問題を解決して、システム全体の効率を良くすることができる、計算機システム、プロセッサ割り当て方法及びプログラムを提供することにある。
【課題を解決するための手段】
【0017】
本発明の1つの観点によれば、仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、上記複数の仮想プロセッサ間の排他制御に、予め定められた処理毎に用意されるスピンロック変数が用いられる計算機システムが提供される。この計算機システムは、選択手段及びプロセッサ割り当て手段を備えている。選択手段及びプロセッサ割り当て手段は、それぞれ上記仮想計算機マネージャに設けられている。選択手段は、上記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する。プロセッサ割り当て手段は、選択手段によって選択された仮想プロセッサに実プロセッサを割り当てる。
【0018】
このように、上記構成の計算機システムにおいては、上記先行技術における「スピンロック待ちではないスレッド」に相当する、「スピンロック待ちでない仮想プロセッサ」ではなくて、「スピンロックを取得していて、かつ非実行中の状態にある仮想プロセッサ」、つまり「スピンロックを取得しているが、実プロセッサが割り当てられていないために処理が中断された状態にある仮想プロセッサ」が優先的に選択されて、その選択された仮想プロセッサに実プロセッサが割り当てられる。これにより、選択された仮想プロセッサは、既にスピンロックを取得している状態にあることから、スピンループして待ちの状態になることはなく、直ちに処理を実行して早期にスピンロックを解放できる。これにより、他の仮想プロセッサのスピンロック待ちの状態を速やかに解消して、結果としてシステム全体の効率を良くすることができる
ここで、上記複数の仮想プロセッサのうちのいずれかの仮想プロセッサがスピンロックの取得に失敗したことを検出する検出手段と、スピンロックの取得に失敗したことが当該検出手段によって検出された場合に、上記選択手段を呼び出す手段とを追加して、スピンロックの取得に失敗したことが検出された場合に、当該取得に失敗したスピンロックを取得していて、かつ非実行中の状態にある仮想プロセッサが上記選択手段により優先的に選択される構成とすると良い。
【0019】
このような構成においては、仮想プロセッサがスピンロックの取得に失敗し、そのことが検出手段によって検出された場合には、その時点で選択手段が呼び出され、仮想プロセッサ選択のやり直しの機会が作られる。つまり、再スケジューリングが行われる。これにより、例えば、一旦選択された仮想プロセッサが、他の仮想プロセッサの取得しているスピンロックをとろうとして失敗しても、無駄なスピンループが発生しかけた時点で、そのスピンロックを取得していて、かつ非実行中の状態にある仮想プロセッサを優先的に選択することが可能となり、無駄なスピンループを防止して、より効率よくプロセッサを利用することができる。
【0020】
上述の再スケジューリングを、仮想プロセッサがスピンロックの取得に失敗した場合だけでなく、例えばスピンロックの解放時にも実行するようにすると良い。但し、スピンロックの解放時の再スケジューリングでは、任意のスピンロックを取得しており、スピンロック待ちでなく、かつ非実行中の状態にある仮想プロセッサが優先的に選択される。ここで、選択すべき仮想プロセッサの候補が複数存在する場合、その時点において最も多くのスピンロックを取得している仮想プロセッサを選択すると良い。
【0021】
ゲストOS内の仮想プロセッサ間の排他制御では、複数のスピンロックをネストして(入れ子の状態で)取得して、排他的な処理を行うことが多い。そのような場合に、更に他の仮想プロセッサを待たせる可能性が高くなる。そこで、上述のように、最も多くのスピンロックを取得している仮想プロセッサを選択するならば、他の仮想プロセッサを待たせる可能性を効果的に低減できる。
【発明の効果】
【0022】
本発明によれば、仮想計算機マネージャによって構築される仮想計算機環境上でマルチプロセッサ環境を前提としたゲストOSが動作する計算機システム(仮想計算機システム)において、スピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択して、その選択された仮想プロセッサに実プロセッサを割り当てることにより、選択された仮想プロセッサによりビジーウェイトの処理のみが行われて、つまり選択された仮想プロセッサが不要にスピンループして、処理効率が悪くなる不具合を防止でき、更に選択された仮想プロセッサが取得しているスピンロックが早期に解放され、他の仮想プロセッサのスピンロック待ちの状態を速やかに解消して、結果としてシステム全体の効率を良くし、処理速度の向上を図ることができる。
【発明を実施するための最良の形態】
【0023】
以下、本発明の一実施形態につき図面を参照して説明する。
【0024】
図1は本発明の一実施形態に係る、仮想計算機システムを実現する計算機システム1の構成を示すブロック図である。計算機システム(ホストシステム)1は、実計算機を構成するハードウェア(HW)10を備えている。HW10は、例えば2つの実プロセッサ101-0(P0),101-1(P1)、各種I/O装置102及びメモリ(図示せず)を含む。HW10上では、ホストOSと呼ばれるOS20が動作する。OS20上では仮想計算機アプリケーション(VMアプリケーション)30を含む各種のアプリケーションが実行される。
【0025】
VMアプリケーション30の実行により、仮想計算機マネージャ(Virtual Machine Manager、以下、VMMと称する)31が実現される。VMM31は、仮想計算機システム(VMシステム)の環境(仮想計算機実行環境)32を構築する。仮想計算機実行環境32は、仮想HW環境(仮想HW装置)33及びゲストOS実行環境34からなる。仮想HW環境33は、複数の仮想プロセッサ、例えば4つの仮想プロセッサ331-0(VP0)〜331-3(VP3)、仮想I/O装置332及び仮想メモリ装置(図示せず)を含む。VMM31は、論理的に、この仮想HW環境33内の仮想プロセッサ331-0〜331-3、仮想I/O装置332及び仮想メモリ装置をエミュレートして、仮想計算機実行環境32を実現する。VMM31は、仮想計算機実行環境32内のゲストOS実行環境34に、当該ゲストOS実行環境34で動作するOSをゲストOS340としてロードする。VMM31は、仮想HW環境34に含まれる仮想メモリ装置にゲストOS340のコードを展開し、その実行コードを仮想プロセッサ331-i(i=0,1,2,3)のエミュレートという形で実行する。これによりVMM31は、ゲストOS340の処理を進める。ゲストOS340からのI/O要求は、VMM31が仮想I/O装置332のエミュレートを行うことにより処理する。
【0026】
ゲストOS340のカーネル内には、仮想プロセッサ331-0(VP0)〜331-3(VP3)の排他制御に用いられる共有変数としてのスピンロック変数が存在する。スピンロック変数は、排他制御を必要とする処理毎に存在する。図1の例では、4つのスピンロック変数#0,#1,#2,#3が存在する。このスピンロック変数#0,#1,#2,#3は、ゲストOS340からアクセス可能なメモリ上のアドレスaddr0,addr1,addr2,addr3に格納されている。この「スピンロック変数のアドレス」を、「スピンロックのアドレス」または「ロックアドレス」と呼ぶこともある。
【0027】
VMM31は、4つの仮想プロセッサ331-0〜331-3のいずれかに、実プロセッサ101-0,101-1のいずれかを割り当てて、仮想プロセッサの処理のエミュレーションを行う。図1の計算機システム1では、説明の簡略化のために、1つのゲストOS340のみが存在する場合を想定している。しかし、一般的には計算機システム1内に複数のゲストOSが存在する場合もある。その際には、2つの実プロセッサ101-0,101-1が、別々のゲストOSに割り当てられる状況もある。したがって、特定のゲストOSに着目すると、そのゲストOSに割り当てられる実プロセッサの数は、一般的には「実プロセッサ数以下」あるいは「高々実プロセッサ数」ということになる。
【0028】
VMM31は、スピンロック変数アドレステーブル311及びVPROC_TBL312の2つの管理テーブルを有している。この2つの管理テーブルは、ゲストOS340に対応して用意される。したがって、計算機システム1内に複数のゲストOSが存在する場合には、その複数のゲストOSの各々に対応して、それぞれスピンロック変数アドレステーブル311及びVPROC_TBL312が用意される。
【0029】
スピンロック変数アドレステーブル311は、ゲストOS340から通知があったスピンロック変数#iに関して、そのアドレス(スピンロックのアドレス)addriを保持するのに用いられる。スピンロック変数アドレステーブル311に保持されるアドレスは、ゲストOS340から値が参照できるアドレスである必要がある。スピンロック変数アドレステーブル311のデータ構造例を図2に示す。本実施形態では、図1に示されるように、ゲストOS340のカーネル内に4つのスピンロック変数#0〜#3が存在する。そこで、図2のスピンロック変数アドレステーブル311には、その4つのスピンロック変数#0〜#3のアドレスaddr0〜addr3が登録されている状態が示されている。
【0030】
VPROC_TBL312は、管理対象のゲストOS340で動作する各仮想プロセッサ(ここでは仮想プロセッサ331-0〜331-3)の状態を管理するのに用いられる仮想プロセッサ状態テーブルである。VPROC_TBL312のデータ構造例を図3に示す。図3から明らかなように、VPROC_TBL312は、仮想プロセッサ331-1〜331-3のID(例えば仮想プロセッサ番号0〜3)でインデックスされている。つまり、VPROC_TBL312のエントリiには、仮想プロセッサ番号がi(ID=i)の仮想プロセッサ331-iの状態情報が保持される。仮想プロセッサ331-iの状態情報は、実行ステータス、ロック取得個数及びロック待ちステータスを含む。
【0031】
実行ステータスは、管理対象のゲストOS340で動作する仮想プロセッサ331-iが現在実行中の状態にあるか否かを表す。ここでは、実行ステータスは、仮想プロセッサ331-iが、現在VMM31によって実プロセッサ101-j(jは0または1)を割り当てられている状態(実プロセッサ101-jによりエミュレーション中)にある場合に実行中の状態を示す1に、そうでないときには非実行中の状態を示す0にセットされる。
ロック取得個数は、仮想プロセッサ331-iが現在取得しているスピンロックの個数を示す。
【0032】
ロック待ちステータスは、仮想プロセッサ331-iが現在ロック待ち状態にあるか否かを示す。ロック待ちステータスは、ロック待ち状態にあれば1に、そうでないならば0にセットされる。実行ステータス、ロック取得個数及びロック待ちステータスの各々は、VMM31によって操作される。
【0033】
図4は、本実施形態で適用されるスピンロック変数のフォーマットを示す。図4の例では、スピンロック変数は32ビット(4バイト)で構成されており、OWNER_PROC_ID(ビット31〜27の5ビット)と、WAIT_PROC_BIT_MAP(ビット26〜11の16ビット)と、LOCK_BIT(ビット0)とを含む。ここでは、ビット10〜1の10ビットは空きビットである。
【0034】
OWNER_PROC_ID(ロック所有プロセッサID)は、ロックを確保した仮想プロセッサ331-iのID(仮想プロセッサ番号)を示す。OWNER_PROC_IDは、LOCK_BITがセットされている場合にのみ有効である。
WAIT_PROC_BIT_MAP(ロック待ちプロセッサビットマップ)は、ロックを待っている仮想プロセッサの集合を示すビットマップである。本実施形態では、WAIT_PROC_BIT_MAPは16ビットであり、仮想プロセッサの数が16個までのシステムに適用可能である。ここでは、WAIT_PROC_BIT_MAPの各ビット(ビット26〜11)は、仮想プロセッサ番号15〜0の仮想プロセッサに対応する。したがって、OWNER_PROC_IDの最上位ビットは0である。なお、OWNER_PROC_IDをビット30〜27の4ビットで構成し、ビット31を空きビットとしても良い。
LOCK_BIT(ロックビット)は、ロックされているか否かを示す。LOCK_BITは、ロックされているとき1に、そうでないとき0にセットされる。
【0035】
以上により、上記フォーマットのスピンロック変数のアドレスを保持するスピンロック変数アドレステーブル311及び仮想プロセッサ331-0〜331-3の状態を保持するVPROC_TBL(プロセッサ状況テーブル)312は、等価的に、仮想プロセッサ各々のスピンロックの取得状況を保持するスピンロック取得状況保持手段を構成していると見なせる。
【0036】
本実施形態では、ゲストOS340はVMM31に対し、以下に列挙されるインターフェイス
1)ゲストOSが使うスピンロックのアドレスのVMMへの登録
vmm_register_spinlock_address()
2)VMMへ登録されたスピンロックの使用開始の宣言
vmm_start_use_spinlock()
3)ゲストOSが使うスピンロック確保処理
vmm_acquire_spinlock()
4)ゲストOSが使うスピンロック解放処理
vmm_release_spinlock()
5)VMMへ登録したスピンロックの使用終了(中断)の宣言
vmm_end_use_spinlock()
6)ゲストOSが使うスピンロックのアドレスのVMMからの登録解除
vmm_deregister_spinlock_address()
を使って「スピンロックの状況」等を通知する。これらインターフェイスは、VMM31の機能を呼び出すためのシステムコールとしてゲストOS340に提供される。ここでは、各インターフェイスは、予めライブラリのような形でゲストOS340に呼び出し方法が提供されているものとする。
【0037】
以下、上記各インターフェイスについて順に説明する。
1)ゲストOSが使うスピンロックのアドレスのVMMへの登録
vmm_register_spinlock_address()
引数は「スピンロックのアドレス」である。後述するスピンロックの管理方法でゲストOS340がVMM31にスピンロックを管理してもらいたいときには、当該ゲストOS340は予めこのインターフェイスを呼び出して「スピンロックのアドレス」をVMM31に通知する。この結果、「スピンロックのアドレス(スピンロック変数のアドレス、つまりロックアドレス)」はスピンロック変数アドレステーブル311に登録され、後述するようにVMM31によるロックの管理の対象になる。
【0038】
2)VMMへ登録されたスピンロックの使用開始の宣言
vmm_start_use_spinlock()
引数は「スピンロックのアドレス」である。ゲストOS340は、上記1)で登録されたスピンロックを実際に使用する前に、このインターフェイスを呼び出して使用開始をVMM31に教える。VMM31は、このインターフェイスの呼び出しの後に、スピンロック変数の値を参照して、仮想プロセッサの実行制御に用いる。よって、ゲストOS340は、このインターフェイスを呼び出す前に、予めスピンロック変数の値を適切に初期化しておく必要がある。
【0039】
3)ゲストOSが使うスピンロック確保処理
vmm_acquire_spinlock()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がロックを確保(取得)する際に次のように使用される、スピンロック取得インターフェイスである。
VMM31は、仮想プロセッサがロックを取得できる(即ちLOCK_BITが0であった)場合、スピンロック変数のOWNER_PROC_IDに当該仮想プロセッサのID(仮想プロセッサ番号)をセットし、かつLOCK_BITをセットするという処理を「アトミック」に行う(OWNER_PROC_IDとLOCK_BITをまとめてアトミックに更新)。「アトミック」については後述する。
一方、仮想プロセッサがロックを取得できない(既にLOCK_BITが1だった)場合には、VMM31は、スピンロック変数のWAIT_PROC_BIT_MAP中の、当該仮想プロセッサに固有のビットをセットする。そしてVMM31は、必要に応じて、他の仮想プロセッサを選択し直す。仮想プロセッサは、他の仮想プロセッサに切り替えられない限り、ロックを取得できるまでスピンループする。
このインターフェイス(ロック取得インターフェイス)の処理の詳細については、後述する。
【0040】
4)ゲストOSが使うスピンロック解放処理
vmm_release_spinlock()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がロックを解放する際に使用される、スピンロック解放インターフェイスである。このインターフェイスの処理(スピンロック解放処理)の詳細については、後述する。
【0041】
5)VMMへ登録したスピンロックの使用終了(中断)の宣言
vmm_end_use_spinlock()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がVMM31に対して、対応するスピンロック変数を参照をしないように要求するのに用いられる。
【0042】
6)ゲストOSが使うスピンロックのアドレスのVMMからの登録解除
vmm_deregister_spinlock_address()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がVMM31に対して、対応するスピンロック変数をスピンロック変数アドレステーブル311から削除するように要求するのに用いられる。
【0043】
次に、本実施形態の動作について、上記3)のロック取得インターフェイスvmm_acquire_spinlock()の処理(スピンロック取得処理)を例に、図5及び図6のフローチャートを参照して説明する。この処理は、ゲストOS340がロック取得インターフェイスを呼ぶことにより、VMM31に制御が移って実行される処理である。正確には、ゲストOS340上で動作するある仮想プロセッサ#iがロック取得インターフェイスを呼ぶことにより、VMM31に制御が移って実行される処理である。より正確には、仮想プロセッサ#iのエミュレーション処理として、ゲストOS340がロック取得インターフェイスの呼び出しをした次の瞬間に、エミュレーションが一時的にストップして、直接VMM31の処理に戻る(ステップS1)。つまりロック取得インターフェイスの呼び出し元は、ゲストOS340でもあり、仮想プロセッサ#iでもあるといえる。ロック取得インターフェイスの引数にはスピンロックのアドレス(ロックアドレス)Aが用いられる。つまり、ゲストOS340は、VMM31にスピンロックのアドレスAを通知するスピンロックアドレス通知手段としての機能を有する。
【0044】
VMM31はまず、ロック変数(スピンロック変数)が取れたときにロック変数にセットすべき値を生成して、変数W_VALUEに設定する(ステップS2)。生成されたロック変数の値のOWNER_PROC_IDには、呼び出し元の仮想プロセッサ#iのID(仮想プロセッサ番号)がセットされている。また、生成されたロック変数の値のWAIT_PROC_BIT_MAPの全ビットには0がセットされ、LOCK_BITには1がセットされている。次にVMM31は、ロックアドレスAをポインタ変数LOCK_VALUEに設定する(ステップS3)。
【0045】
次にVMM31は、以下に述べる排他制御処理(ステップS4)を実行する。まずVMM31は、ポインタ変数LOCK_VALUEで指定されるメモリ上の内容(値)*LOCK_VALUEを、変数TMPとして設定する(ステップS4a)。ここでは、LOCK_VALUEはロックアドレスAである。したがって、*LOCK_VALUEはロックアドレスAで指定されるメモリ上のスピンロック変数であり、LOCK_BITを含む。次にVMM31は、TMP(スピンロック変数の現在の値)中のLOCK_BITが0であるか、つまり対応するスピンロックが解放されていて、呼び出し元の仮想プロセッサ#iによって当該ロックを取得できるかを判定する(ステップS4b)。このステップS4bは、呼び出し元の仮想プロセッサ#iが当該ロックの取得に成功するか、あるいは失敗するかを検出することと等価である。
【0046】
もし、TMP中のLOCK_BITが0であるならば、VMM31は、メモリ上のロックアドレスA(で指定される領域)に、W_VALUEの値をライトする(ステップS4c)。つまりVMM31は、ロックアドレスAで指定されるメモリ上のスピンロック変数*LOCK_VALUEとして、W_VALUEの値を設定する。このように、TMP(引数であるロックアドレスAで指定されるスピンロック変数の現在の値)中のLOCK_BITが0である場合、ロックアドレスAで指定されるスピンロック変数が、OWNER_PROC_ID=呼び出し元の仮想プロセッサ#iのID(=i)、LOCK_BIT=1のスピンロック変数に更新されて、ステップS4は終了する。
【0047】
VMM31は、ステップS4を終了すると、呼び出し元の仮想プロセッサのID(仮想プロセッサ番号)で指定されるVPROC_TBL312内のエントリの「ロック待ちステータス」を、当該仮想プロセッサが現在ロック待ちでないことを示すために0クリアし、かつ「ロック取得個数」を1インクリメントする(ステップS5)。これにより、ロック取得処理は終了する(ステップS6)。
【0048】
このように本実施形態においては、ロック取得インターフェイスvmm_acquire_spinlock()の引数でロックアドレスAが指定され、当該アドレスAのスピンロック変数のLOCK_BITが0の場合、VMM31による処理がS3→S4(S4a→S4b→S4c)→S5→S6の手順で実行される。これにより、呼び出し元の仮想プロセッサはロックを取得できる。この場合、図4のフォーマットのスピンロック変数であって、以下の値
OWNER_PROC_ID=ロック取得インターフェイスを呼び出した仮想プロセッサ#iのID(仮想プロセッサ番号)
WAIT_PROC_BIT_MAP=全て0
LOCK_BIT=1
が設定されたスピンロック変数がロックアドレスAで指定されるメモリにアトミックに書き込まれ、呼び出し元のゲストOS340に制御が戻る。この状態は、呼び出し元の仮想プロセッサ#iがロックを確保した状態である。「メモリにアトミックに書き込む」とは、複数の仮想プロセッサからのロック取得インターフェイスの呼び出しに応じて、それぞれステップS4の排他制御処理が計算機システム内で同時に実行されたとしても、この排他制御処理に関しては互いに不可分に参照と修正が行われることを意味する。例えばインテル社のPentium(登録商標)プロセッサを使っている場合には、ロック付きXCHG命令を使うことにより、ここに述べたステップS4b,S4cの処理を連続して行うことができる。このことは、図5及び図6のフローチャートで示されるロック取得処理がゲストOS340の処理(ステップS12を除く)として実装されている場合にも同様である。なお、このロック取得処理が、本実施形態のようにVMM31内の処理として実装されている場合には、排他的に実行される必要があるステップS4とステップS10の両排他制御処理自体を、VMM31内に設けた専用のロック変数を用いることで簡単に実現できる。
【0049】
一方、TMP中のLOCK_BITが1である場合(ステップS4b)、つまり対応するロックが呼び出し元以外の仮想プロセッサによって確保されているために、当該ロックを取得できないことが判定(検出)される場合には、VMM31は次の処理を行う。まずVMM31は、TMP(スピンロック変数の現在の値)のWAIT_PROC_BIT_MAP上の、呼び出し元仮想プロセッサ#iのID(=i)に対応するビットがセットされている(1である)かを判定する(ステップS7)。ステップS7の判定がYesの場合、即ち呼び出し元仮想プロセッサ#iがスピンループ中(ロック待ち)の状態にある場合、VMM31はステップS3に戻る。これにより、仮想プロセッサ#iがロックを取得できるまで、S3→S4a→S4b→S7の処理が繰り返される。
【0050】
これに対し、ステップS7の判定がYesの場合、即ち呼び出し元仮想プロセッサ#iがスピンループ中(ロック待ち)の状態にない場合、VMM31は、TMPのWAIT_PROC_BIT_MAP上の、呼び出し元仮想プロセッサ#iのID(=i)に対応するビットをセットする(ステップS9)。これにより、仮想プロセッサ#iがスピンループ中(ロック待ち)の状態となったことが示される。次にVMM31は、ステップS4と同様の排他制御処理(ステップS10)を次のように実行する。
【0051】
まずVMM31は、ポインタ変数LOCK_VALUE(ここでばロックアドレスA)で指定されるメモリ上の値*LOCK_VALUEを、変数TMP3として設定する(ステップS10a)。この時点における*LOCK_VALUEは、例えば先のステップS4aの実行時点における*LOCK_VALUE(=TMP)と必ずしも同じであると限らない。つまり、ロックアドレスAで指定されるメモリ上の値*LOCK_VALUE(スピンロック変数)は、ステップS4aの実行直後からステップS10aの実行時点までの間に変わっている可能性がある。そこでVMM31は、上記ステップS4aにおいて、ロックアドレスAで指定されるメモリ上の値*LOCK_VALUEをTMPとは別のTMP3に保存する。次にVMM31は、TPMとTMP3とが一致しているかを判定する(ステップS10b)。もし、TPMとTMP3とが一致している場合、つまりメモリ上のロックアドレスA(で指定される領域)の値がステップS4aの実行時点以降に書き換えられていない場合、VMM31はステップS10cを実行する。このステップS10cにおいて、VMM31は、メモリ上のロックアドレスA(で指定される領域)に、その時点におけるTMP2の値をライトする。このTMP2の値は、先のステップS8の実行時点のTMPの値が保存されたTMP2のうち、その後のステップS9で呼び出し元仮想プロセッサ#iに対応するWAIT_PROC_BIT_MAP上のビットがセットされたTMP2の値である。ステップS10cが実行されると、ステップS10の排他制御処理は終了し、VMM31はステップS11に進む。
【0052】
これに対し、TPMとTMP3とが一致していない場合(ステップS10b)、つまりメモリ上のロックアドレスA(で指定される領域)の値がステップS4aの実行時点以降に書き換えられた場合には、ステップS10cが実行されることなく、ステップS10の排他制御処理は終了する。つまりVMM31は、呼び出し元仮想プロセッサ#iに対応するWAIT_PROC_BIT_MAP上のビットをセットすべきスピンロック変数が書き換えられてしまったため、ステップS10cをスキップしてステップS11に進む。
【0053】
ステップS11において、VMM31は、呼び出し元の仮想プロセッサのID(仮想プロセッサ番号)で指定されるVPROC_TBL312内のエントリの「ロック待ちステータス」に、当該仮想プロセッサが「現在ロック待ち(スピンロックループ中)である」ことを示すために1をセットする(ステップS11)。次にVMM31は、他の仮想プロセッサを選択し直す(再スケジューリングの)ための後述するステップS12を実行して、ステップS3に戻る。これにより、ステップS10cが実行された場合だけでなく、ステップS10cがスキップされた場合にも、ステップS4の排他制御処理で仮想プロセッサ#iがロックを取得できるまで、ステップS3から始まる処理が繰り返される。その結果、ステップS10cがスキップされた場合にも、その後当該ステップS10cが実行されて、呼び出し元仮想プロセッサ#iに対応するWAIT_PROC_BIT_MAP上のビットが(ステップS9で)セットされたスピンロック変数が、ロックアドレスAにライトされる。
【0054】
このように本実施形態においては、ロック取得インターフェイスvmm_acquire_spinlock()の引数でロックアドレスAが指定され、当該アドレスAのスピンロック変数のLOCK_BITが1の場合、つまり当該スピンロック変数に対応するスピンロックが取得できない場合、
当該スピンロック変数のWAIT_PROC_BIT_MAPのうちの呼び出し元仮想プロセッサ#iに対応するビットがセットされる(ステップS9)。また、呼び出し元仮想プロセッサ#iは、他の仮想プロセッサに切り替えられない限り、ロックが取得できるまでスピンループする(S3→S4a→S4b→S7)。更に、必要に応じて、他の仮想プロセッサの選択のための処理(ステップS12)に切り替えられる。
【0055】
また、ロックアドレスAで指定されるスピンロック変数のOWNER_PROC_IDには、対応するロックがいずれかの仮想プロセッサに取得(所有)されている場合には、当該仮想プロセッサのIDがセットされる。また、スピンループの状態で、このロックの解放を待っている仮想プロセッサの集合は、ロックアドレスAで指定されるスピンロック変数のWAIT_PROC_BIT_MAPを参照することによって知ることができる。
【0056】
なお、VMM31をゲストOS340から毎回呼び出すのでは、処理が遅くなる可能性がある。そこで、図5及び図6のフローチャートで示されるロック取得処理を、後述するvmm_resched_with_lock_addr()の処理(ステップS12)を除いて、ゲストOS340内で行う(ライブラリ等で提供)構成とすることも可能である。
【0057】
ところで、ロックを所有している仮想プロセッサが非実行中の状態(つまりVMM31が実プロセッサを当該仮想プロセッサに割り当てておらず、処理が中断されている状態)の場合に、他の仮想プロセッサが、このロックの解放を待ってスピンループして待ち続けるのは効率が悪い。但し、いずれ時間が来ればVMM31が他の仮想プロセッサの実行に切り替えるので、デッドロックになるわけではない。
【0058】
そこで本実施形態では、VMM31は、呼び出し元の仮想プロセッサ#iがロックアドレスAのスピンロック変数に対応するスピンロックの解放を待ってスピンループするときには、ステップS11に続くステップS12で、vmm_resched_with_lock_addr()という当該VMM31のための再スケジューリング関数を呼び出す。以下、この再スケジューリング関数の処理(仮想プロセッサ再スケジューリング処理)について、図7のフローチャートを参照して説明する。
【0059】
まず、再スケジューリング関数vmm_resched_with_lock_addr()の引数にはロックアドレスAが用いられる。この場合、VMM31は、メモリ上の、ロックアドレスAで指定されるスピンロック変数(ロックアドレスAの値)、つまり現在呼び出し元の仮想プロセッサがスピンループ(ビジーウェイト)しているスピンロックの変数の値を、変数LOCK_VALUEに設定する(ステップS21)。
【0060】
次にVMM31は、LOCK_VALUE(スピンロック変数)中のOWNER_PROC_IDを参照して、現在呼び出し元の仮想プロセッサがスピンループしているスピンロックを所有している仮想プロセッサ(つまりロック所有プロセッサ)のID(仮想プロセッサ番号)を特定し、当該IDをPIDとして設定する(ステップS22)。次にVMM31は、VPROC_TBL312を参照して、PIDで指定される仮想プロセッサ(ロック所有プロセッサ)の現在の状態を得る(ステップS23)。VMM31は、ステップS23で得られたロック所有プロセッサの状態から、当該ロック所有プロセッサが実行中あるいはロック待ちの状態にあるかを判定する(ステップS24)。
【0061】
もし、ロック所有プロセッサが実行中あるいはロック待ちの状態にないならば(ステップS24)、つまり非実行中かつロック待ちでない状態にあるならば、VMM31は後述するステップS25乃至S27をスキップしてステップS28に進む。このステップS28において、VMM31はスピンループしている呼び出し元の仮想プロセッサの実行状態を当該VMM31内にセーブし、当該仮想プロセッサを非実行中の状態にする。またVMM31は、呼び出し元の仮想プロセッサに固有のVPROC_TBL312内の「実行ステータス」を「非実行中」に設定する。
【0062】
次にVMM31は、呼び出し元の仮想プロセッサを非実行中の状態にした代わりに、PIDで指定される仮想プロセッサ(ここでは、ロック所有プロセッサ)を選択して、当該PIDで指定される仮想プロセッサを実行中の状態にする(ステップS29)。即ちVMM31は、PIDで指定される仮想プロセッサに実プロセッサを割り当てて、仮想プロセッサ再スケジューリング処理からの復帰時に実行が開始される状態とする。ステップS29において、VMM31は、PIDで指定される仮想プロセッサに固有のVPROC_TBL312内の「実行ステータス」を「実行中」に設定する。VMM31は、ステップS29を実行すると、仮想プロセッサ再スケジューリング処理を終了する。
【0063】
これに対し、ロック所有プロセッサが実行中あるいはロック待ちの状態にあるならば(ステップS24)、VMM31はVPROC_TBL312を参照する(ステップS25)。そしてVMM31は、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが存在するかを調べる(ステップS26)。
【0064】
もし、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが存在しないならば(ステップS26)、VMM31は仮想プロセッサ再スケジューリング処理を終了する。一方、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが存在するならば(ステップS26)、VMM31はステップS27に進む。このステップS27において、VMM31は、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサを1つ例えばランダムに選択し、その選択された仮想プロセッサのIDをPIDとして設定する。次にVMM31は上記ステップS28に進み、スピンループしている呼び出し元の仮想プロセッサを非実行中の状態にする。そしてVMM31は上記ステップS29に進み、PIDで指定される仮想プロセッサを選択して、当該PIDで指定される仮想プロセッサに実プロセッサを割り当てて実行中の状態にする。但し、ここで選択される仮想プロセッサは、ロックを所有している仮想プロセッサが上述の「非実行中」の場合と異なって、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサである。この「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサも、実プロセッサが割り当てられたならば速やかに処理を実行することが可能である。
【0065】
このように本実施形態においては、呼び出し元の仮想プロセッサ#iがスピンロックの取得に失敗して、当該スピンロックの解放を待ってスピンループするときには、当該スピンロックを所有していて、かつ「非実行中かつロック待ちでない」仮想プロセッサが、仮想プロセッサ再スケジューリング処理で優先的に選択されて、「実行中」の状態に設定される。この結果、ロックが取得されており、かつそのロックを所有する仮想プロセッサが非実行中かつロック待ちでない状態にも拘わらずに、ビジーウェイトし続けて実プロセッサを無駄に使い続けることを避けることができる。その代わり、ロックを所有する仮想プロセッサに制御が渡されて、処理が進むようになるので、早期にロックが解放されるようになる。これにより、ロックが解放されるのを待っていた他の仮想プロセッサもそれだけ早くロックを確保できるようになり、結果としてスピンループに費やされる時間を大幅に少なくすることができる。
【0066】
また本実施形態においては、呼び出し元の仮想プロセッサ#iがスピンロックを取得できずに、当該スピンロックの解放を待ってスピンループするときに、当該スピンロックを所有する仮想プロセッサが「実行中あるいはロック待ち」である場合には、次善の策として、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが選択されて、「実行中」の状態に設定される。これにより、少なくとも、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが選択された時点では、無駄なスピンループを避けることができる。
【0067】
次に、本実施形態における、上記4)のスピンロック解放インターフェイスvmm_release_spinlock()の処理(スピンロック解放処理)について、図8のフローチャートを参照して説明する。スピンロック取得インターフェイスの引数にはスピンロックのアドレス(ロックアドレス)Aが用いられる。
【0068】
VMM31は、ゲストOS340上で動作する仮想プロセッサ#iによってスピンロック解放インターフェイスが呼び出されると、メモリ上のロックアドレスAに0をライトする(ステップS31)。つまりVMM31は、ロックアドレスAで指定されるスピンロック変数を0に設定する。これにより、LOCK_BITが0となってロックが解放されたことになる。次にVMM31は、呼び出し元の仮想プロセッサのIDで指定されるVPROC_TBL312内のエントリ(つまり呼び出し元の仮想プロセッサに固有のVPROC_TBL312内のエントリ)の「ロック取得個数」を1デクリメントする(ステップS32)。
【0069】
[スピンロック解放処理の変形例]
次に、スピンロック解放処理の変形例について、図9のフローチャートを参照して説明する。まずVMM31は、上記ステップS31,S32と同様の処理を実行する。即ちVMM31は、ロックアドレスAで指定されるスピンロック変数を0に設定して、ロックを解放すると共に、呼び出し元の仮想プロセッサのIDで指定されるVPROC_TBL312内のエントリの「ロック取得個数」を1デクリメントする(ステップS41,S42)。そしてVMM31は、再スケジューリング関数vmm_resched()を呼び出す(ステップS43)。この再スケジューリング関数vmm_resched()は、前述したロックを取得できなかった場合にステップS12で呼び出される再スケジューリング関数vmm_resched_with_lock_addr()と異なって、引数を持たない。以下、このvmm_resched()が呼び出されることにより実行される再スケジューリング関数の処理(仮想プロセッサ再スケジューリング処理)について、図10のフローチャートを参照して説明する。
【0070】
まずVMM31は、VPROC_TBL312を参照して、所定の選択条件を満足する仮想プロセッサを探す(ステップS51)。この所定の選択条件を満足する仮想プロセッサとは、1)非実行中であり、2)ロック待ちでなく、かつ3)最もロック取得個数が多い仮想プロセッサである。ただし、3)ではロックを1つも取得していない仮想プロセッサは対象としない。VMM31は、上記選択条件を満足する仮想プロセッサを探すことができた場合、その選択条件を満足する仮想プロセッサを1つ選択して、VPnextとして設定する(ステップS53)。
【0071】
次にVMM31は、呼び出し元の仮想プロセッサの実行状態を当該VMM31内にセーブし、当該仮想プロセッサを非実行中の状態にする(ステップS54)。このステップS54において、VMM31は、呼び出し元の仮想プロセッサに固有のVPROC_TBL312内の「実行ステータス」を「非実行中」に設定する。
【0072】
次にVMM31は仮想プロセッサVPnextを選択して、当該仮想プロセッサVPnextを実行中の状態にする(ステップS55)。即ちVMM31は、仮想プロセッサVPnextに実プロセッサを割り当てて、仮想プロセッサ再スケジューリング処理からの復帰時に実行が開始される状態とする。ステップS55において、VMM31は、仮想プロセッサVPnextに固有のVPROC_TBL312内の「実行ステータス」を「実行中」に設定する。VMM31は、ステップS55を実行すると、仮想プロセッサ再スケジューリング処理を終了する。
【0073】
このように、スピンロック解放処理の変形例では、当該解放処理の最後に仮想プロセッサ再スケジューリング処理が実行される。この再スケジューリング処理では、上記選択条件を満足する仮想プロセッサが存在するならば、その仮想プロセッサが優先的に選択される。ここで、上記選択条件を満足する仮想プロセッサVPnextは、多くのロックをネストして(入れ子の状態で)所有しており、したがって他の仮想プロセッサがそのロックの待ち状態になる可能性が高いと考えられる。そこで、このような仮想プロセッサVPnextを優先的に処理させることにより、ロックの解放を早め、他のプロセッサも(必要ならそれら解放されたロックを確保して)処理を進められるような状況にすることができ、無駄なスピンループ処理を減らすことができる。なお、上述の再スケジューリング関数vmm_resched()は、ロック解放時だけではなく、VMM31の汎用のスケジューラ(次に実行すべき仮想プロセッサを選択する処理)に使うことができる。
【0074】
上記実施形態では、ゲストOSが1つの場合で、その中の仮想プロセッサに対する実プロセッサ割り当てを中心に述べた。この実施形態で適用された技術は、より一般的な実装例として、複数ゲストOSに跨って、それら複数のゲストOS内の仮想プロセッサに対する実プロセッサ割り当ての際に適用することも可能である。例えば、特定のゲストOS内の全てのロック待ちでない仮想プロセッサに実プロセッサが割り当てられた状態を想定する。この状態では、さらに他のゲストOSのVPROC_TBL312を参照し、上記実施形態と同様に、スピンロックを所有し、かつ非実行中の(つまり排他制御区間の処理を中断している)仮想プロセッサを選択するといったことが実現可能であり、同様の効果を得ることが期待できる。
【0075】
また、上記実施形態では、図4に示したフォーマットのスピンロック変数、即ち対応するスピンロックを所有(取得)している仮想プロセッサのID(OWNER_PROC_ID)、及び当該ロックの解放を待っている仮想プロセッサの情報(WAIT_PROC_BIT_MAP)を含むスピンロック変数が適用されている。しかし、これらの情報を必ずしもスピンロック変数に含める必要はなく、スピンロック変数に関連付けられた他のデータ構造として実装することも可能である。
【0076】
[他の実施形態]
図1に示される上記実施形態の計算機システム1では、VMM31は、OS20上で動作する1つのVMアプリケーション30として実装されている。しかし、図1の計算機システム(第1の計算機システム)1に代えて、図11に示す計算機システム(第2の計算機システム)100を適用することも可能である。図11において、図1と等価な部分には同一符号が付されている。
【0077】
図2に示す計算機システム100の特徴は、図1中のVMM31に相当するVMM(VM機構)310が、計算機システム100の実HW上に実装されている点にある。このVMM310の機能は、VMM31と同様であり、仮想計算機実行環境32を構築し、当該仮想計算機実行環境32中のゲストOS実行環境34にゲストOS340をロードする。VMM310は、VMM31と同様に、ゲストOS340に対応して用意されるスピンロック変数アドレステーブル311及びVPROC_TBL312の2つの管理テーブルを有する。
【0078】
なお、本発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。
【図面の簡単な説明】
【0079】
【図1】本発明の一実施形態に係る、仮想計算機システムを実現する計算機システムの構成を示すブロック図。
【図2】図1中のスピンロック変数アドレステーブル311のデータ構造例を示す図。
【図3】図1中のVPROC_TBL312のデータ構造例を示す図。
【図4】同実施形態で適用されるスピンロック変数のフォーマットを示す図。
【図5】同実施形態におけるスピンロック取得処理の手順を示すフローチャートの一部を示す図。
【図6】同実施形態におけるスピンロック取得処理の手順を示すフローチャートの残りを示す図。
【図7】同実施形態における仮想プロセッサ再スケジューリング処理の手順を示すフローチャート。
【図8】同実施形態におけるスピンロック解放処理の手順を示すフローチャート。
【図9】スピンロック解放処理の変形例を示すフローチャート。
【図10】図9のスピンロック解放処理での再スケジューリング関数の呼び出しによって実行される仮想プロセッサ再スケジューリング処理の手順を示すフローチャート。
【図11】本発明の他の実施形態に係る、仮想計算機システムを実現する計算機システムの構成を示すブロック図。
【符号の説明】
【0080】
1,100…計算機システム、31,310…VMM(仮想計算機マネージャ)、32…仮想計算機実行環境、33…仮想HW環境、34…ゲストOS実行環境、101-0,101-1…実プロセッサ、311…スピンロック変数アドレステーブル、312…VPROC_TBL(仮想プロセッサ状態テーブル)、331-0〜331-3…仮想プロセッサ、340…ゲストOS。
【技術分野】
【0001】
本発明は、仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作する計算機システムに係り、特に、複数の仮想プロセッサの中から処理を実行させる仮想プロセッサを選択して、その選択された仮想プロセッサに実プロセッサを割り当てるのに好適な、計算機システム、プロセッサ割り当て方法及びプログラムに関する。
【背景技術】
【0002】
近年、パーソナルコンピュータ等の計算機システムにおいて、仮想計算機(Virtual Machine)システム(以下、VMシステムと称する)を実現するためのアプリケーション(アプリケーションプログラム)が利用されるようになってきている。このようなアプリケーションは、VM(Virtual Machine)アプリケーションと呼ばれる。
【0003】
さて、計算機システム(実計算機システム)は、一般に、実プロセッサ、各種I/O(入出力)装置及びメモリ(図示せず)等のハードウェア(HW)で構成されている。この計算機システムのハードウェア構成上では、ホストOSと呼ばれるOSが動作する。ホストOS上では各種アプリケーションが実行される。このアプリケーションの1つが上記VMアプリケーションである。このVMアプリケーションの実行により、VMシステムを管理する仮想計算機マネージャ(Virtual Machine Manager、以下、VMMと称する)が実現される。VMMは、仮想プロセッサ、仮想I/O(入出力)装置及び仮想メモリ装置を含む仮想HWを実現する。VMMは、これらの仮想プロセッサ、仮想I/O装置及び仮想
メモリ装置をエミュレートして、仮想計算機実行環境を構築(提供)する。VMMは、この仮想計算機実行環境にゲストOSと呼ばれる適切なOSをロードし、実行する。具体的には、VMMは、仮想HWとしての仮想メモリ装置にゲストOSのコードを展開し、その実行コードを仮想プロセッサのエミュレートという形で実行することで、ゲストOSの処理を進める。ゲストOSからのI/O要求は、VMMが仮想I/O装置のエミュレートを行うことにより処理される。
【0004】
さて、ゲストOSがマルチプロセッサ環境を要求しているときには、仮想プロセッサを複数用意することで対応できる。計算機システム(ホストシステム)がマルチプロセッサシステムである場合には、それら複数の仮想プロセッサを、ある程度同時に並列に処理することが可能である。しかし一般的には、全ての仮想プロセッサに対して実プロセッサが同時に割り当てられる保証はない。このような事態は、例えば、実プロセッサの数が仮想プロセッサより少ない場合に起きる。また、計算機システム内の他の処理(アプリケーションやOS本体の処理)を、実プロセッサが実行しなければならない場合にも、このような事態は起きる。つまり計算機システム内では、一部の実プロセッサしかVMMアプリケーションに割り当てられないタイミングがある。このため、仮想プロセッサが複数存在する場合、時間を決めて、一部の仮想プロセッサを選択して実プロセッサを割り当てるのが一般的である。この場合、選択された仮想プロセッサで処理が実行されることにより、システム全体の処理が進められる。
【0005】
このように、VMMは一般的な計算機システム(以下、第1の計算機システムと称する)内で、仮想的な計算機実行環境(仮想計算機実行環境)を構築して、その中でゲストOSを実行することができる。ここでは、VMMは、OS上で動作する1つのアプリケーション(VMアプリケーション)として実装される。
【0006】
この他に、VMMが、計算機システムの実HW上にVM機構(HWとしての仮想計算機支援機構)として実装される構成も知られている。この計算機システム(以下、第2の計算機システムと称する)において、VM機構は、上記第1の計算機システム内のVMアプリケーションと同様に、実プロセッサ、実I/O装置及び実メモリ装置を仮想化して各ゲストOSに機能として提供する。つまりVM機構は、仮想プロセッサ、仮想I/O装置及び仮想メモリ装置をエミュレートする。またVM機構は、実プロセッサ、実I/O装置及び実メモリ装置等のHWリソースを、時間的、領域的(空間的)に仮想プロセッサ、仮想I/O装置及び仮想メモリ装置に割り当てる。このようにしてVM機構の上には、仮想計算機実行環境が当該VM機構により構築される。ゲストOSは、この仮想計算機実行環境にロードされて、仮想プロセッサにより実行される。ここで、ゲストOSがマルチプロセッサ構成を要求している場合、仮想プロセッサは複数用意される。この場合も、全ての仮想プロセッサに対して、実プロセッサを同時に割り当てることは必ずしもできない。その理由としては、例えば実プロセッサ数が元々足りない場合がある。また、他のゲストOSの実行のために、一部の実プロセッサが使用されている場合もある。
【0007】
上記第1または第2の計算機システムでは、VMアプリケーションまたはVM機構により、複数の仮想プロセッサの中から、細かい時間毎にいずれかの仮想プロセッサが選択される。そして、選択された仮想プロセッサの処理が、決められた時間、あるいはある事象が発生するまで、実プロセッサによりエミュレートされることで進められる(時分割処理)。このような処理が、全ての仮想プロセッサに対して、例えば順番に行われることにより、ゲストOS全体としての処理が進行する。
【0008】
上記第1または第2の計算機システムにおいて、ゲストOSがマルチプロセッサをサポートするOSで、かつVMMがマルチプロセッサ構成の仮想HWをエミュレートするものとする。このようなゲストOSでは、カーネル内部でスピンロックによる排他制御が行われることが多い。スピンロックは、変数(スピンロック変数)をフラグのように使い、それをTAS(Test And Set)命令などで排他的に変更することにより、排他制御区間に入れる排他制御対象を高々1つに限定する手法であり、一般的なマルチプロセッサシステムのOSで広く使われているものである。ゲストOSでの排他制御対象は仮想プロセッサである。また、スピンロック変数は、排他制御が必要となるデータ(キュー、リスト等のデータ)、あるいは処理(処理コード)毎、即ち実行対象毎に用意される。
【0009】
ここで、VMMが動作させるゲストOSがマルチプロセッサOSで、かつ複数のプロセッサ、例えば4つのプロセッサの存在を前提としているものとする。この場合、VMMはゲストOS実行時に4つの仮想プロセッサに対してゲストOSのコードを実行させる必要がある。計算機システムが潤沢に実プロセッサを備えており、これら仮想プロセッサの全てに同時に実プロセッサを割り当てることができることが理想である。しかし、ゲストOSが使う仮想プロセッサの数が実プロセッサ以下という条件は常には望むことはできない。そのため、一般的には、VMMがゲストOSの仮想プロセッサを選択して、限られた実プロセッサを割り当てることになる。そしてVMMは、一定時間、その仮想プロセッサの処理を進めた後、他の仮想プロセッサを選択して処理を進める手順、即ちスケジューリングを繰り返す。勿論、使える実プロセッサ数が複数なら、複数の仮想プロセッサを選ぶことも可能である。
【0010】
前述した計算機システム(第1または第2の計算機システム)において、ゲストOS内の各仮想プロセッサは、必要に応じてスピンロックを確保して排他制御区間内で処理を実行する。この計算機システムには、ロックが解除されるまでスピンロック変数を繰り返しテストする状態、つまりスピンロックをビジーウェイト(スピンループ)している状態の仮想プロセッサも存在し得る。もし、実プロセッサ数が仮想プロセッサ数より少ない場合には、VMMは同時実行できる仮想プロセッサを選択しなければならない。そこで従来の計算機システムのスケジューリングでは、各仮想プロセッサの状態に無関係に、例えばラウンドロビン法により一定の順番で仮想プロセッサが選択される。このため、スピンロックの解放を待ってビジーウェイトしている状態の仮想プロセッサが選択される可能性がある。この場合、次の仮想プロセッサの選択のタイミングまで、ビジーウェイトの処理のみが行われてしまい、有益な処理が何も行われないことになる。特に、仮想プロセッサ同士での取り合いが頻繁に行われるスピンロック変数が存在する場合には、そのような状況が頻発し、結果的に処理速度の低下を招く。
【0011】
以上は、スピンロックによる排他制御が仮想プロセッサに適用された例である。この他に、スピンロックによる排他制御を、アプリケーションとしてのプロセス内のスレッド(OS上で動作するマルチスレッドプログラム)に適用した技術(以下、先行技術と称する)も知られている(例えば、特許文献1参照)。この先行技術の特徴は、スレッド間でスピンロックを用いた排他制御を行っている場合に、OSのスケジューラがスピンロック待ち状態のスレッド以外を選択して効率よくプロセッサを使用する点にある。特許文献1には、アプリケーションのスレッドが「スピンロック待ち状態」になった場合に、スピンロックに使うスピンロック変数(共有変数)のアドレスをOSのスケジューラが知ることができる仕組みが記載されている。この仕組みにより、OSのスケジューラは、スレッドをディスパッチ候補として選択したときに、そのスレッドがスピンロック待ち状態か否かの判断をすることができる。そして上記特許文献1では、一定の順番でスレッドを選択する選択手法ではなくて、スピンロック待ちではないスレッドを優先的に選択する選択手法を適用することにより、無駄なスピンループを避けるようにしている。なお、スレッドも仮想プロセッサも、一種のプログラム実行単位である点では共通する。
【特許文献1】特開平5−204675(段落0007乃至0011、段落0054)
【発明の開示】
【発明が解決しようとする課題】
【0012】
上述のように、上記先行技術では、スピンロック待ちではないスレッドを優先的に選択する選択手法(以下、選択手法1と称する)により、無駄なスピンループを避けるようにしている。そこで、この選択手法1を、ゲストOSにおける仮想プロセッサの選択に適用することが考えられる。しかし、上記先行技術においては、ディスパッチ時にスピンロック待ち状態でないスレッドを選択しても、その後、この選択されたスレッドが、他のスレッドの確保した(そして現在当該他のスレッドに実プロセッサが割り当てられていない状態における)スピンロックの待ち状態になった場合には、やはり無駄にスピンループしてしまう事態が発生し得る。この点において、上記先行技術は、スケジューラが新たなスレッドを選択する際に限って効果がある技術であるといえる。つまり、上記先行技術は、スレッドの実行効率を確かに改善することができるものの、アプリケーションレベルでのみ効果がある技術であるといえる。
【0013】
したがって、上記選択手法1をゲストOSにおける仮想プロセッサの選択に適用して、VMMがスピンロック待ちではない仮想プロセッサを優先的に選択し、その選択された仮想プロセッサに実プロセッサを割り当てるだけでは、選択された仮想プロセッサは、その後、実プロセッサが割り当てられていない、つまり非実行中の状態にある仮想プロセッサが確保しているスピンロックの待ち状態になってスピンループを発生する虞がある。この場合、ゲストOSの性能低下(処理速度の低下)を招く。
【0014】
アプリケーションレベルの排他制御の影響は、そのアプリケーションの効率だけに止まり、他のアプリケーションに影響を与えるものではない。なぜなら、OSが各アプリケーション毎に平等にプロセッサを割り当てようとするからである。ところが、上記選択手法1をゲストOSにおける仮想プロセッサの選択に適用することで、非実行中の状態にある仮想プロセッサが確保しているスピンロックの待ち状態になってスピンループを発生すると、アプリケーションのスレッドのスピンループとは異なり、(OS上のアプリケーションを含めて)OS全体の処理が止まってしまう可能性がある。
【0015】
これらの理由から、VMMによりマルチプロセッサ環境を前提としたゲストOSを実行する際には、スピンロック変数を利用したスピンロックの処理に関して注意が必要であり、上記先行技術とは違った、より効率の良いスピンロックの扱いが要求される。
【0016】
本発明は上記事情を考慮してなされたものでその目的は、選択された仮想プロセッサが不要にスピンループして処理効率が悪くなるという問題を解決して、システム全体の効率を良くすることができる、計算機システム、プロセッサ割り当て方法及びプログラムを提供することにある。
【課題を解決するための手段】
【0017】
本発明の1つの観点によれば、仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、上記複数の仮想プロセッサ間の排他制御に、予め定められた処理毎に用意されるスピンロック変数が用いられる計算機システムが提供される。この計算機システムは、選択手段及びプロセッサ割り当て手段を備えている。選択手段及びプロセッサ割り当て手段は、それぞれ上記仮想計算機マネージャに設けられている。選択手段は、上記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する。プロセッサ割り当て手段は、選択手段によって選択された仮想プロセッサに実プロセッサを割り当てる。
【0018】
このように、上記構成の計算機システムにおいては、上記先行技術における「スピンロック待ちではないスレッド」に相当する、「スピンロック待ちでない仮想プロセッサ」ではなくて、「スピンロックを取得していて、かつ非実行中の状態にある仮想プロセッサ」、つまり「スピンロックを取得しているが、実プロセッサが割り当てられていないために処理が中断された状態にある仮想プロセッサ」が優先的に選択されて、その選択された仮想プロセッサに実プロセッサが割り当てられる。これにより、選択された仮想プロセッサは、既にスピンロックを取得している状態にあることから、スピンループして待ちの状態になることはなく、直ちに処理を実行して早期にスピンロックを解放できる。これにより、他の仮想プロセッサのスピンロック待ちの状態を速やかに解消して、結果としてシステム全体の効率を良くすることができる
ここで、上記複数の仮想プロセッサのうちのいずれかの仮想プロセッサがスピンロックの取得に失敗したことを検出する検出手段と、スピンロックの取得に失敗したことが当該検出手段によって検出された場合に、上記選択手段を呼び出す手段とを追加して、スピンロックの取得に失敗したことが検出された場合に、当該取得に失敗したスピンロックを取得していて、かつ非実行中の状態にある仮想プロセッサが上記選択手段により優先的に選択される構成とすると良い。
【0019】
このような構成においては、仮想プロセッサがスピンロックの取得に失敗し、そのことが検出手段によって検出された場合には、その時点で選択手段が呼び出され、仮想プロセッサ選択のやり直しの機会が作られる。つまり、再スケジューリングが行われる。これにより、例えば、一旦選択された仮想プロセッサが、他の仮想プロセッサの取得しているスピンロックをとろうとして失敗しても、無駄なスピンループが発生しかけた時点で、そのスピンロックを取得していて、かつ非実行中の状態にある仮想プロセッサを優先的に選択することが可能となり、無駄なスピンループを防止して、より効率よくプロセッサを利用することができる。
【0020】
上述の再スケジューリングを、仮想プロセッサがスピンロックの取得に失敗した場合だけでなく、例えばスピンロックの解放時にも実行するようにすると良い。但し、スピンロックの解放時の再スケジューリングでは、任意のスピンロックを取得しており、スピンロック待ちでなく、かつ非実行中の状態にある仮想プロセッサが優先的に選択される。ここで、選択すべき仮想プロセッサの候補が複数存在する場合、その時点において最も多くのスピンロックを取得している仮想プロセッサを選択すると良い。
【0021】
ゲストOS内の仮想プロセッサ間の排他制御では、複数のスピンロックをネストして(入れ子の状態で)取得して、排他的な処理を行うことが多い。そのような場合に、更に他の仮想プロセッサを待たせる可能性が高くなる。そこで、上述のように、最も多くのスピンロックを取得している仮想プロセッサを選択するならば、他の仮想プロセッサを待たせる可能性を効果的に低減できる。
【発明の効果】
【0022】
本発明によれば、仮想計算機マネージャによって構築される仮想計算機環境上でマルチプロセッサ環境を前提としたゲストOSが動作する計算機システム(仮想計算機システム)において、スピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択して、その選択された仮想プロセッサに実プロセッサを割り当てることにより、選択された仮想プロセッサによりビジーウェイトの処理のみが行われて、つまり選択された仮想プロセッサが不要にスピンループして、処理効率が悪くなる不具合を防止でき、更に選択された仮想プロセッサが取得しているスピンロックが早期に解放され、他の仮想プロセッサのスピンロック待ちの状態を速やかに解消して、結果としてシステム全体の効率を良くし、処理速度の向上を図ることができる。
【発明を実施するための最良の形態】
【0023】
以下、本発明の一実施形態につき図面を参照して説明する。
【0024】
図1は本発明の一実施形態に係る、仮想計算機システムを実現する計算機システム1の構成を示すブロック図である。計算機システム(ホストシステム)1は、実計算機を構成するハードウェア(HW)10を備えている。HW10は、例えば2つの実プロセッサ101-0(P0),101-1(P1)、各種I/O装置102及びメモリ(図示せず)を含む。HW10上では、ホストOSと呼ばれるOS20が動作する。OS20上では仮想計算機アプリケーション(VMアプリケーション)30を含む各種のアプリケーションが実行される。
【0025】
VMアプリケーション30の実行により、仮想計算機マネージャ(Virtual Machine Manager、以下、VMMと称する)31が実現される。VMM31は、仮想計算機システム(VMシステム)の環境(仮想計算機実行環境)32を構築する。仮想計算機実行環境32は、仮想HW環境(仮想HW装置)33及びゲストOS実行環境34からなる。仮想HW環境33は、複数の仮想プロセッサ、例えば4つの仮想プロセッサ331-0(VP0)〜331-3(VP3)、仮想I/O装置332及び仮想メモリ装置(図示せず)を含む。VMM31は、論理的に、この仮想HW環境33内の仮想プロセッサ331-0〜331-3、仮想I/O装置332及び仮想メモリ装置をエミュレートして、仮想計算機実行環境32を実現する。VMM31は、仮想計算機実行環境32内のゲストOS実行環境34に、当該ゲストOS実行環境34で動作するOSをゲストOS340としてロードする。VMM31は、仮想HW環境34に含まれる仮想メモリ装置にゲストOS340のコードを展開し、その実行コードを仮想プロセッサ331-i(i=0,1,2,3)のエミュレートという形で実行する。これによりVMM31は、ゲストOS340の処理を進める。ゲストOS340からのI/O要求は、VMM31が仮想I/O装置332のエミュレートを行うことにより処理する。
【0026】
ゲストOS340のカーネル内には、仮想プロセッサ331-0(VP0)〜331-3(VP3)の排他制御に用いられる共有変数としてのスピンロック変数が存在する。スピンロック変数は、排他制御を必要とする処理毎に存在する。図1の例では、4つのスピンロック変数#0,#1,#2,#3が存在する。このスピンロック変数#0,#1,#2,#3は、ゲストOS340からアクセス可能なメモリ上のアドレスaddr0,addr1,addr2,addr3に格納されている。この「スピンロック変数のアドレス」を、「スピンロックのアドレス」または「ロックアドレス」と呼ぶこともある。
【0027】
VMM31は、4つの仮想プロセッサ331-0〜331-3のいずれかに、実プロセッサ101-0,101-1のいずれかを割り当てて、仮想プロセッサの処理のエミュレーションを行う。図1の計算機システム1では、説明の簡略化のために、1つのゲストOS340のみが存在する場合を想定している。しかし、一般的には計算機システム1内に複数のゲストOSが存在する場合もある。その際には、2つの実プロセッサ101-0,101-1が、別々のゲストOSに割り当てられる状況もある。したがって、特定のゲストOSに着目すると、そのゲストOSに割り当てられる実プロセッサの数は、一般的には「実プロセッサ数以下」あるいは「高々実プロセッサ数」ということになる。
【0028】
VMM31は、スピンロック変数アドレステーブル311及びVPROC_TBL312の2つの管理テーブルを有している。この2つの管理テーブルは、ゲストOS340に対応して用意される。したがって、計算機システム1内に複数のゲストOSが存在する場合には、その複数のゲストOSの各々に対応して、それぞれスピンロック変数アドレステーブル311及びVPROC_TBL312が用意される。
【0029】
スピンロック変数アドレステーブル311は、ゲストOS340から通知があったスピンロック変数#iに関して、そのアドレス(スピンロックのアドレス)addriを保持するのに用いられる。スピンロック変数アドレステーブル311に保持されるアドレスは、ゲストOS340から値が参照できるアドレスである必要がある。スピンロック変数アドレステーブル311のデータ構造例を図2に示す。本実施形態では、図1に示されるように、ゲストOS340のカーネル内に4つのスピンロック変数#0〜#3が存在する。そこで、図2のスピンロック変数アドレステーブル311には、その4つのスピンロック変数#0〜#3のアドレスaddr0〜addr3が登録されている状態が示されている。
【0030】
VPROC_TBL312は、管理対象のゲストOS340で動作する各仮想プロセッサ(ここでは仮想プロセッサ331-0〜331-3)の状態を管理するのに用いられる仮想プロセッサ状態テーブルである。VPROC_TBL312のデータ構造例を図3に示す。図3から明らかなように、VPROC_TBL312は、仮想プロセッサ331-1〜331-3のID(例えば仮想プロセッサ番号0〜3)でインデックスされている。つまり、VPROC_TBL312のエントリiには、仮想プロセッサ番号がi(ID=i)の仮想プロセッサ331-iの状態情報が保持される。仮想プロセッサ331-iの状態情報は、実行ステータス、ロック取得個数及びロック待ちステータスを含む。
【0031】
実行ステータスは、管理対象のゲストOS340で動作する仮想プロセッサ331-iが現在実行中の状態にあるか否かを表す。ここでは、実行ステータスは、仮想プロセッサ331-iが、現在VMM31によって実プロセッサ101-j(jは0または1)を割り当てられている状態(実プロセッサ101-jによりエミュレーション中)にある場合に実行中の状態を示す1に、そうでないときには非実行中の状態を示す0にセットされる。
ロック取得個数は、仮想プロセッサ331-iが現在取得しているスピンロックの個数を示す。
【0032】
ロック待ちステータスは、仮想プロセッサ331-iが現在ロック待ち状態にあるか否かを示す。ロック待ちステータスは、ロック待ち状態にあれば1に、そうでないならば0にセットされる。実行ステータス、ロック取得個数及びロック待ちステータスの各々は、VMM31によって操作される。
【0033】
図4は、本実施形態で適用されるスピンロック変数のフォーマットを示す。図4の例では、スピンロック変数は32ビット(4バイト)で構成されており、OWNER_PROC_ID(ビット31〜27の5ビット)と、WAIT_PROC_BIT_MAP(ビット26〜11の16ビット)と、LOCK_BIT(ビット0)とを含む。ここでは、ビット10〜1の10ビットは空きビットである。
【0034】
OWNER_PROC_ID(ロック所有プロセッサID)は、ロックを確保した仮想プロセッサ331-iのID(仮想プロセッサ番号)を示す。OWNER_PROC_IDは、LOCK_BITがセットされている場合にのみ有効である。
WAIT_PROC_BIT_MAP(ロック待ちプロセッサビットマップ)は、ロックを待っている仮想プロセッサの集合を示すビットマップである。本実施形態では、WAIT_PROC_BIT_MAPは16ビットであり、仮想プロセッサの数が16個までのシステムに適用可能である。ここでは、WAIT_PROC_BIT_MAPの各ビット(ビット26〜11)は、仮想プロセッサ番号15〜0の仮想プロセッサに対応する。したがって、OWNER_PROC_IDの最上位ビットは0である。なお、OWNER_PROC_IDをビット30〜27の4ビットで構成し、ビット31を空きビットとしても良い。
LOCK_BIT(ロックビット)は、ロックされているか否かを示す。LOCK_BITは、ロックされているとき1に、そうでないとき0にセットされる。
【0035】
以上により、上記フォーマットのスピンロック変数のアドレスを保持するスピンロック変数アドレステーブル311及び仮想プロセッサ331-0〜331-3の状態を保持するVPROC_TBL(プロセッサ状況テーブル)312は、等価的に、仮想プロセッサ各々のスピンロックの取得状況を保持するスピンロック取得状況保持手段を構成していると見なせる。
【0036】
本実施形態では、ゲストOS340はVMM31に対し、以下に列挙されるインターフェイス
1)ゲストOSが使うスピンロックのアドレスのVMMへの登録
vmm_register_spinlock_address()
2)VMMへ登録されたスピンロックの使用開始の宣言
vmm_start_use_spinlock()
3)ゲストOSが使うスピンロック確保処理
vmm_acquire_spinlock()
4)ゲストOSが使うスピンロック解放処理
vmm_release_spinlock()
5)VMMへ登録したスピンロックの使用終了(中断)の宣言
vmm_end_use_spinlock()
6)ゲストOSが使うスピンロックのアドレスのVMMからの登録解除
vmm_deregister_spinlock_address()
を使って「スピンロックの状況」等を通知する。これらインターフェイスは、VMM31の機能を呼び出すためのシステムコールとしてゲストOS340に提供される。ここでは、各インターフェイスは、予めライブラリのような形でゲストOS340に呼び出し方法が提供されているものとする。
【0037】
以下、上記各インターフェイスについて順に説明する。
1)ゲストOSが使うスピンロックのアドレスのVMMへの登録
vmm_register_spinlock_address()
引数は「スピンロックのアドレス」である。後述するスピンロックの管理方法でゲストOS340がVMM31にスピンロックを管理してもらいたいときには、当該ゲストOS340は予めこのインターフェイスを呼び出して「スピンロックのアドレス」をVMM31に通知する。この結果、「スピンロックのアドレス(スピンロック変数のアドレス、つまりロックアドレス)」はスピンロック変数アドレステーブル311に登録され、後述するようにVMM31によるロックの管理の対象になる。
【0038】
2)VMMへ登録されたスピンロックの使用開始の宣言
vmm_start_use_spinlock()
引数は「スピンロックのアドレス」である。ゲストOS340は、上記1)で登録されたスピンロックを実際に使用する前に、このインターフェイスを呼び出して使用開始をVMM31に教える。VMM31は、このインターフェイスの呼び出しの後に、スピンロック変数の値を参照して、仮想プロセッサの実行制御に用いる。よって、ゲストOS340は、このインターフェイスを呼び出す前に、予めスピンロック変数の値を適切に初期化しておく必要がある。
【0039】
3)ゲストOSが使うスピンロック確保処理
vmm_acquire_spinlock()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がロックを確保(取得)する際に次のように使用される、スピンロック取得インターフェイスである。
VMM31は、仮想プロセッサがロックを取得できる(即ちLOCK_BITが0であった)場合、スピンロック変数のOWNER_PROC_IDに当該仮想プロセッサのID(仮想プロセッサ番号)をセットし、かつLOCK_BITをセットするという処理を「アトミック」に行う(OWNER_PROC_IDとLOCK_BITをまとめてアトミックに更新)。「アトミック」については後述する。
一方、仮想プロセッサがロックを取得できない(既にLOCK_BITが1だった)場合には、VMM31は、スピンロック変数のWAIT_PROC_BIT_MAP中の、当該仮想プロセッサに固有のビットをセットする。そしてVMM31は、必要に応じて、他の仮想プロセッサを選択し直す。仮想プロセッサは、他の仮想プロセッサに切り替えられない限り、ロックを取得できるまでスピンループする。
このインターフェイス(ロック取得インターフェイス)の処理の詳細については、後述する。
【0040】
4)ゲストOSが使うスピンロック解放処理
vmm_release_spinlock()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がロックを解放する際に使用される、スピンロック解放インターフェイスである。このインターフェイスの処理(スピンロック解放処理)の詳細については、後述する。
【0041】
5)VMMへ登録したスピンロックの使用終了(中断)の宣言
vmm_end_use_spinlock()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がVMM31に対して、対応するスピンロック変数を参照をしないように要求するのに用いられる。
【0042】
6)ゲストOSが使うスピンロックのアドレスのVMMからの登録解除
vmm_deregister_spinlock_address()
引数は「スピンロックのアドレス」である。このインターフェイスは、ゲストOS340がVMM31に対して、対応するスピンロック変数をスピンロック変数アドレステーブル311から削除するように要求するのに用いられる。
【0043】
次に、本実施形態の動作について、上記3)のロック取得インターフェイスvmm_acquire_spinlock()の処理(スピンロック取得処理)を例に、図5及び図6のフローチャートを参照して説明する。この処理は、ゲストOS340がロック取得インターフェイスを呼ぶことにより、VMM31に制御が移って実行される処理である。正確には、ゲストOS340上で動作するある仮想プロセッサ#iがロック取得インターフェイスを呼ぶことにより、VMM31に制御が移って実行される処理である。より正確には、仮想プロセッサ#iのエミュレーション処理として、ゲストOS340がロック取得インターフェイスの呼び出しをした次の瞬間に、エミュレーションが一時的にストップして、直接VMM31の処理に戻る(ステップS1)。つまりロック取得インターフェイスの呼び出し元は、ゲストOS340でもあり、仮想プロセッサ#iでもあるといえる。ロック取得インターフェイスの引数にはスピンロックのアドレス(ロックアドレス)Aが用いられる。つまり、ゲストOS340は、VMM31にスピンロックのアドレスAを通知するスピンロックアドレス通知手段としての機能を有する。
【0044】
VMM31はまず、ロック変数(スピンロック変数)が取れたときにロック変数にセットすべき値を生成して、変数W_VALUEに設定する(ステップS2)。生成されたロック変数の値のOWNER_PROC_IDには、呼び出し元の仮想プロセッサ#iのID(仮想プロセッサ番号)がセットされている。また、生成されたロック変数の値のWAIT_PROC_BIT_MAPの全ビットには0がセットされ、LOCK_BITには1がセットされている。次にVMM31は、ロックアドレスAをポインタ変数LOCK_VALUEに設定する(ステップS3)。
【0045】
次にVMM31は、以下に述べる排他制御処理(ステップS4)を実行する。まずVMM31は、ポインタ変数LOCK_VALUEで指定されるメモリ上の内容(値)*LOCK_VALUEを、変数TMPとして設定する(ステップS4a)。ここでは、LOCK_VALUEはロックアドレスAである。したがって、*LOCK_VALUEはロックアドレスAで指定されるメモリ上のスピンロック変数であり、LOCK_BITを含む。次にVMM31は、TMP(スピンロック変数の現在の値)中のLOCK_BITが0であるか、つまり対応するスピンロックが解放されていて、呼び出し元の仮想プロセッサ#iによって当該ロックを取得できるかを判定する(ステップS4b)。このステップS4bは、呼び出し元の仮想プロセッサ#iが当該ロックの取得に成功するか、あるいは失敗するかを検出することと等価である。
【0046】
もし、TMP中のLOCK_BITが0であるならば、VMM31は、メモリ上のロックアドレスA(で指定される領域)に、W_VALUEの値をライトする(ステップS4c)。つまりVMM31は、ロックアドレスAで指定されるメモリ上のスピンロック変数*LOCK_VALUEとして、W_VALUEの値を設定する。このように、TMP(引数であるロックアドレスAで指定されるスピンロック変数の現在の値)中のLOCK_BITが0である場合、ロックアドレスAで指定されるスピンロック変数が、OWNER_PROC_ID=呼び出し元の仮想プロセッサ#iのID(=i)、LOCK_BIT=1のスピンロック変数に更新されて、ステップS4は終了する。
【0047】
VMM31は、ステップS4を終了すると、呼び出し元の仮想プロセッサのID(仮想プロセッサ番号)で指定されるVPROC_TBL312内のエントリの「ロック待ちステータス」を、当該仮想プロセッサが現在ロック待ちでないことを示すために0クリアし、かつ「ロック取得個数」を1インクリメントする(ステップS5)。これにより、ロック取得処理は終了する(ステップS6)。
【0048】
このように本実施形態においては、ロック取得インターフェイスvmm_acquire_spinlock()の引数でロックアドレスAが指定され、当該アドレスAのスピンロック変数のLOCK_BITが0の場合、VMM31による処理がS3→S4(S4a→S4b→S4c)→S5→S6の手順で実行される。これにより、呼び出し元の仮想プロセッサはロックを取得できる。この場合、図4のフォーマットのスピンロック変数であって、以下の値
OWNER_PROC_ID=ロック取得インターフェイスを呼び出した仮想プロセッサ#iのID(仮想プロセッサ番号)
WAIT_PROC_BIT_MAP=全て0
LOCK_BIT=1
が設定されたスピンロック変数がロックアドレスAで指定されるメモリにアトミックに書き込まれ、呼び出し元のゲストOS340に制御が戻る。この状態は、呼び出し元の仮想プロセッサ#iがロックを確保した状態である。「メモリにアトミックに書き込む」とは、複数の仮想プロセッサからのロック取得インターフェイスの呼び出しに応じて、それぞれステップS4の排他制御処理が計算機システム内で同時に実行されたとしても、この排他制御処理に関しては互いに不可分に参照と修正が行われることを意味する。例えばインテル社のPentium(登録商標)プロセッサを使っている場合には、ロック付きXCHG命令を使うことにより、ここに述べたステップS4b,S4cの処理を連続して行うことができる。このことは、図5及び図6のフローチャートで示されるロック取得処理がゲストOS340の処理(ステップS12を除く)として実装されている場合にも同様である。なお、このロック取得処理が、本実施形態のようにVMM31内の処理として実装されている場合には、排他的に実行される必要があるステップS4とステップS10の両排他制御処理自体を、VMM31内に設けた専用のロック変数を用いることで簡単に実現できる。
【0049】
一方、TMP中のLOCK_BITが1である場合(ステップS4b)、つまり対応するロックが呼び出し元以外の仮想プロセッサによって確保されているために、当該ロックを取得できないことが判定(検出)される場合には、VMM31は次の処理を行う。まずVMM31は、TMP(スピンロック変数の現在の値)のWAIT_PROC_BIT_MAP上の、呼び出し元仮想プロセッサ#iのID(=i)に対応するビットがセットされている(1である)かを判定する(ステップS7)。ステップS7の判定がYesの場合、即ち呼び出し元仮想プロセッサ#iがスピンループ中(ロック待ち)の状態にある場合、VMM31はステップS3に戻る。これにより、仮想プロセッサ#iがロックを取得できるまで、S3→S4a→S4b→S7の処理が繰り返される。
【0050】
これに対し、ステップS7の判定がYesの場合、即ち呼び出し元仮想プロセッサ#iがスピンループ中(ロック待ち)の状態にない場合、VMM31は、TMPのWAIT_PROC_BIT_MAP上の、呼び出し元仮想プロセッサ#iのID(=i)に対応するビットをセットする(ステップS9)。これにより、仮想プロセッサ#iがスピンループ中(ロック待ち)の状態となったことが示される。次にVMM31は、ステップS4と同様の排他制御処理(ステップS10)を次のように実行する。
【0051】
まずVMM31は、ポインタ変数LOCK_VALUE(ここでばロックアドレスA)で指定されるメモリ上の値*LOCK_VALUEを、変数TMP3として設定する(ステップS10a)。この時点における*LOCK_VALUEは、例えば先のステップS4aの実行時点における*LOCK_VALUE(=TMP)と必ずしも同じであると限らない。つまり、ロックアドレスAで指定されるメモリ上の値*LOCK_VALUE(スピンロック変数)は、ステップS4aの実行直後からステップS10aの実行時点までの間に変わっている可能性がある。そこでVMM31は、上記ステップS4aにおいて、ロックアドレスAで指定されるメモリ上の値*LOCK_VALUEをTMPとは別のTMP3に保存する。次にVMM31は、TPMとTMP3とが一致しているかを判定する(ステップS10b)。もし、TPMとTMP3とが一致している場合、つまりメモリ上のロックアドレスA(で指定される領域)の値がステップS4aの実行時点以降に書き換えられていない場合、VMM31はステップS10cを実行する。このステップS10cにおいて、VMM31は、メモリ上のロックアドレスA(で指定される領域)に、その時点におけるTMP2の値をライトする。このTMP2の値は、先のステップS8の実行時点のTMPの値が保存されたTMP2のうち、その後のステップS9で呼び出し元仮想プロセッサ#iに対応するWAIT_PROC_BIT_MAP上のビットがセットされたTMP2の値である。ステップS10cが実行されると、ステップS10の排他制御処理は終了し、VMM31はステップS11に進む。
【0052】
これに対し、TPMとTMP3とが一致していない場合(ステップS10b)、つまりメモリ上のロックアドレスA(で指定される領域)の値がステップS4aの実行時点以降に書き換えられた場合には、ステップS10cが実行されることなく、ステップS10の排他制御処理は終了する。つまりVMM31は、呼び出し元仮想プロセッサ#iに対応するWAIT_PROC_BIT_MAP上のビットをセットすべきスピンロック変数が書き換えられてしまったため、ステップS10cをスキップしてステップS11に進む。
【0053】
ステップS11において、VMM31は、呼び出し元の仮想プロセッサのID(仮想プロセッサ番号)で指定されるVPROC_TBL312内のエントリの「ロック待ちステータス」に、当該仮想プロセッサが「現在ロック待ち(スピンロックループ中)である」ことを示すために1をセットする(ステップS11)。次にVMM31は、他の仮想プロセッサを選択し直す(再スケジューリングの)ための後述するステップS12を実行して、ステップS3に戻る。これにより、ステップS10cが実行された場合だけでなく、ステップS10cがスキップされた場合にも、ステップS4の排他制御処理で仮想プロセッサ#iがロックを取得できるまで、ステップS3から始まる処理が繰り返される。その結果、ステップS10cがスキップされた場合にも、その後当該ステップS10cが実行されて、呼び出し元仮想プロセッサ#iに対応するWAIT_PROC_BIT_MAP上のビットが(ステップS9で)セットされたスピンロック変数が、ロックアドレスAにライトされる。
【0054】
このように本実施形態においては、ロック取得インターフェイスvmm_acquire_spinlock()の引数でロックアドレスAが指定され、当該アドレスAのスピンロック変数のLOCK_BITが1の場合、つまり当該スピンロック変数に対応するスピンロックが取得できない場合、
当該スピンロック変数のWAIT_PROC_BIT_MAPのうちの呼び出し元仮想プロセッサ#iに対応するビットがセットされる(ステップS9)。また、呼び出し元仮想プロセッサ#iは、他の仮想プロセッサに切り替えられない限り、ロックが取得できるまでスピンループする(S3→S4a→S4b→S7)。更に、必要に応じて、他の仮想プロセッサの選択のための処理(ステップS12)に切り替えられる。
【0055】
また、ロックアドレスAで指定されるスピンロック変数のOWNER_PROC_IDには、対応するロックがいずれかの仮想プロセッサに取得(所有)されている場合には、当該仮想プロセッサのIDがセットされる。また、スピンループの状態で、このロックの解放を待っている仮想プロセッサの集合は、ロックアドレスAで指定されるスピンロック変数のWAIT_PROC_BIT_MAPを参照することによって知ることができる。
【0056】
なお、VMM31をゲストOS340から毎回呼び出すのでは、処理が遅くなる可能性がある。そこで、図5及び図6のフローチャートで示されるロック取得処理を、後述するvmm_resched_with_lock_addr()の処理(ステップS12)を除いて、ゲストOS340内で行う(ライブラリ等で提供)構成とすることも可能である。
【0057】
ところで、ロックを所有している仮想プロセッサが非実行中の状態(つまりVMM31が実プロセッサを当該仮想プロセッサに割り当てておらず、処理が中断されている状態)の場合に、他の仮想プロセッサが、このロックの解放を待ってスピンループして待ち続けるのは効率が悪い。但し、いずれ時間が来ればVMM31が他の仮想プロセッサの実行に切り替えるので、デッドロックになるわけではない。
【0058】
そこで本実施形態では、VMM31は、呼び出し元の仮想プロセッサ#iがロックアドレスAのスピンロック変数に対応するスピンロックの解放を待ってスピンループするときには、ステップS11に続くステップS12で、vmm_resched_with_lock_addr()という当該VMM31のための再スケジューリング関数を呼び出す。以下、この再スケジューリング関数の処理(仮想プロセッサ再スケジューリング処理)について、図7のフローチャートを参照して説明する。
【0059】
まず、再スケジューリング関数vmm_resched_with_lock_addr()の引数にはロックアドレスAが用いられる。この場合、VMM31は、メモリ上の、ロックアドレスAで指定されるスピンロック変数(ロックアドレスAの値)、つまり現在呼び出し元の仮想プロセッサがスピンループ(ビジーウェイト)しているスピンロックの変数の値を、変数LOCK_VALUEに設定する(ステップS21)。
【0060】
次にVMM31は、LOCK_VALUE(スピンロック変数)中のOWNER_PROC_IDを参照して、現在呼び出し元の仮想プロセッサがスピンループしているスピンロックを所有している仮想プロセッサ(つまりロック所有プロセッサ)のID(仮想プロセッサ番号)を特定し、当該IDをPIDとして設定する(ステップS22)。次にVMM31は、VPROC_TBL312を参照して、PIDで指定される仮想プロセッサ(ロック所有プロセッサ)の現在の状態を得る(ステップS23)。VMM31は、ステップS23で得られたロック所有プロセッサの状態から、当該ロック所有プロセッサが実行中あるいはロック待ちの状態にあるかを判定する(ステップS24)。
【0061】
もし、ロック所有プロセッサが実行中あるいはロック待ちの状態にないならば(ステップS24)、つまり非実行中かつロック待ちでない状態にあるならば、VMM31は後述するステップS25乃至S27をスキップしてステップS28に進む。このステップS28において、VMM31はスピンループしている呼び出し元の仮想プロセッサの実行状態を当該VMM31内にセーブし、当該仮想プロセッサを非実行中の状態にする。またVMM31は、呼び出し元の仮想プロセッサに固有のVPROC_TBL312内の「実行ステータス」を「非実行中」に設定する。
【0062】
次にVMM31は、呼び出し元の仮想プロセッサを非実行中の状態にした代わりに、PIDで指定される仮想プロセッサ(ここでは、ロック所有プロセッサ)を選択して、当該PIDで指定される仮想プロセッサを実行中の状態にする(ステップS29)。即ちVMM31は、PIDで指定される仮想プロセッサに実プロセッサを割り当てて、仮想プロセッサ再スケジューリング処理からの復帰時に実行が開始される状態とする。ステップS29において、VMM31は、PIDで指定される仮想プロセッサに固有のVPROC_TBL312内の「実行ステータス」を「実行中」に設定する。VMM31は、ステップS29を実行すると、仮想プロセッサ再スケジューリング処理を終了する。
【0063】
これに対し、ロック所有プロセッサが実行中あるいはロック待ちの状態にあるならば(ステップS24)、VMM31はVPROC_TBL312を参照する(ステップS25)。そしてVMM31は、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが存在するかを調べる(ステップS26)。
【0064】
もし、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが存在しないならば(ステップS26)、VMM31は仮想プロセッサ再スケジューリング処理を終了する。一方、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが存在するならば(ステップS26)、VMM31はステップS27に進む。このステップS27において、VMM31は、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサを1つ例えばランダムに選択し、その選択された仮想プロセッサのIDをPIDとして設定する。次にVMM31は上記ステップS28に進み、スピンループしている呼び出し元の仮想プロセッサを非実行中の状態にする。そしてVMM31は上記ステップS29に進み、PIDで指定される仮想プロセッサを選択して、当該PIDで指定される仮想プロセッサに実プロセッサを割り当てて実行中の状態にする。但し、ここで選択される仮想プロセッサは、ロックを所有している仮想プロセッサが上述の「非実行中」の場合と異なって、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサである。この「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサも、実プロセッサが割り当てられたならば速やかに処理を実行することが可能である。
【0065】
このように本実施形態においては、呼び出し元の仮想プロセッサ#iがスピンロックの取得に失敗して、当該スピンロックの解放を待ってスピンループするときには、当該スピンロックを所有していて、かつ「非実行中かつロック待ちでない」仮想プロセッサが、仮想プロセッサ再スケジューリング処理で優先的に選択されて、「実行中」の状態に設定される。この結果、ロックが取得されており、かつそのロックを所有する仮想プロセッサが非実行中かつロック待ちでない状態にも拘わらずに、ビジーウェイトし続けて実プロセッサを無駄に使い続けることを避けることができる。その代わり、ロックを所有する仮想プロセッサに制御が渡されて、処理が進むようになるので、早期にロックが解放されるようになる。これにより、ロックが解放されるのを待っていた他の仮想プロセッサもそれだけ早くロックを確保できるようになり、結果としてスピンループに費やされる時間を大幅に少なくすることができる。
【0066】
また本実施形態においては、呼び出し元の仮想プロセッサ#iがスピンロックを取得できずに、当該スピンロックの解放を待ってスピンループするときに、当該スピンロックを所有する仮想プロセッサが「実行中あるいはロック待ち」である場合には、次善の策として、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが選択されて、「実行中」の状態に設定される。これにより、少なくとも、「ロック待ち」でなく、かつ「非実行中」の仮想プロセッサが選択された時点では、無駄なスピンループを避けることができる。
【0067】
次に、本実施形態における、上記4)のスピンロック解放インターフェイスvmm_release_spinlock()の処理(スピンロック解放処理)について、図8のフローチャートを参照して説明する。スピンロック取得インターフェイスの引数にはスピンロックのアドレス(ロックアドレス)Aが用いられる。
【0068】
VMM31は、ゲストOS340上で動作する仮想プロセッサ#iによってスピンロック解放インターフェイスが呼び出されると、メモリ上のロックアドレスAに0をライトする(ステップS31)。つまりVMM31は、ロックアドレスAで指定されるスピンロック変数を0に設定する。これにより、LOCK_BITが0となってロックが解放されたことになる。次にVMM31は、呼び出し元の仮想プロセッサのIDで指定されるVPROC_TBL312内のエントリ(つまり呼び出し元の仮想プロセッサに固有のVPROC_TBL312内のエントリ)の「ロック取得個数」を1デクリメントする(ステップS32)。
【0069】
[スピンロック解放処理の変形例]
次に、スピンロック解放処理の変形例について、図9のフローチャートを参照して説明する。まずVMM31は、上記ステップS31,S32と同様の処理を実行する。即ちVMM31は、ロックアドレスAで指定されるスピンロック変数を0に設定して、ロックを解放すると共に、呼び出し元の仮想プロセッサのIDで指定されるVPROC_TBL312内のエントリの「ロック取得個数」を1デクリメントする(ステップS41,S42)。そしてVMM31は、再スケジューリング関数vmm_resched()を呼び出す(ステップS43)。この再スケジューリング関数vmm_resched()は、前述したロックを取得できなかった場合にステップS12で呼び出される再スケジューリング関数vmm_resched_with_lock_addr()と異なって、引数を持たない。以下、このvmm_resched()が呼び出されることにより実行される再スケジューリング関数の処理(仮想プロセッサ再スケジューリング処理)について、図10のフローチャートを参照して説明する。
【0070】
まずVMM31は、VPROC_TBL312を参照して、所定の選択条件を満足する仮想プロセッサを探す(ステップS51)。この所定の選択条件を満足する仮想プロセッサとは、1)非実行中であり、2)ロック待ちでなく、かつ3)最もロック取得個数が多い仮想プロセッサである。ただし、3)ではロックを1つも取得していない仮想プロセッサは対象としない。VMM31は、上記選択条件を満足する仮想プロセッサを探すことができた場合、その選択条件を満足する仮想プロセッサを1つ選択して、VPnextとして設定する(ステップS53)。
【0071】
次にVMM31は、呼び出し元の仮想プロセッサの実行状態を当該VMM31内にセーブし、当該仮想プロセッサを非実行中の状態にする(ステップS54)。このステップS54において、VMM31は、呼び出し元の仮想プロセッサに固有のVPROC_TBL312内の「実行ステータス」を「非実行中」に設定する。
【0072】
次にVMM31は仮想プロセッサVPnextを選択して、当該仮想プロセッサVPnextを実行中の状態にする(ステップS55)。即ちVMM31は、仮想プロセッサVPnextに実プロセッサを割り当てて、仮想プロセッサ再スケジューリング処理からの復帰時に実行が開始される状態とする。ステップS55において、VMM31は、仮想プロセッサVPnextに固有のVPROC_TBL312内の「実行ステータス」を「実行中」に設定する。VMM31は、ステップS55を実行すると、仮想プロセッサ再スケジューリング処理を終了する。
【0073】
このように、スピンロック解放処理の変形例では、当該解放処理の最後に仮想プロセッサ再スケジューリング処理が実行される。この再スケジューリング処理では、上記選択条件を満足する仮想プロセッサが存在するならば、その仮想プロセッサが優先的に選択される。ここで、上記選択条件を満足する仮想プロセッサVPnextは、多くのロックをネストして(入れ子の状態で)所有しており、したがって他の仮想プロセッサがそのロックの待ち状態になる可能性が高いと考えられる。そこで、このような仮想プロセッサVPnextを優先的に処理させることにより、ロックの解放を早め、他のプロセッサも(必要ならそれら解放されたロックを確保して)処理を進められるような状況にすることができ、無駄なスピンループ処理を減らすことができる。なお、上述の再スケジューリング関数vmm_resched()は、ロック解放時だけではなく、VMM31の汎用のスケジューラ(次に実行すべき仮想プロセッサを選択する処理)に使うことができる。
【0074】
上記実施形態では、ゲストOSが1つの場合で、その中の仮想プロセッサに対する実プロセッサ割り当てを中心に述べた。この実施形態で適用された技術は、より一般的な実装例として、複数ゲストOSに跨って、それら複数のゲストOS内の仮想プロセッサに対する実プロセッサ割り当ての際に適用することも可能である。例えば、特定のゲストOS内の全てのロック待ちでない仮想プロセッサに実プロセッサが割り当てられた状態を想定する。この状態では、さらに他のゲストOSのVPROC_TBL312を参照し、上記実施形態と同様に、スピンロックを所有し、かつ非実行中の(つまり排他制御区間の処理を中断している)仮想プロセッサを選択するといったことが実現可能であり、同様の効果を得ることが期待できる。
【0075】
また、上記実施形態では、図4に示したフォーマットのスピンロック変数、即ち対応するスピンロックを所有(取得)している仮想プロセッサのID(OWNER_PROC_ID)、及び当該ロックの解放を待っている仮想プロセッサの情報(WAIT_PROC_BIT_MAP)を含むスピンロック変数が適用されている。しかし、これらの情報を必ずしもスピンロック変数に含める必要はなく、スピンロック変数に関連付けられた他のデータ構造として実装することも可能である。
【0076】
[他の実施形態]
図1に示される上記実施形態の計算機システム1では、VMM31は、OS20上で動作する1つのVMアプリケーション30として実装されている。しかし、図1の計算機システム(第1の計算機システム)1に代えて、図11に示す計算機システム(第2の計算機システム)100を適用することも可能である。図11において、図1と等価な部分には同一符号が付されている。
【0077】
図2に示す計算機システム100の特徴は、図1中のVMM31に相当するVMM(VM機構)310が、計算機システム100の実HW上に実装されている点にある。このVMM310の機能は、VMM31と同様であり、仮想計算機実行環境32を構築し、当該仮想計算機実行環境32中のゲストOS実行環境34にゲストOS340をロードする。VMM310は、VMM31と同様に、ゲストOS340に対応して用意されるスピンロック変数アドレステーブル311及びVPROC_TBL312の2つの管理テーブルを有する。
【0078】
なお、本発明は、上記実施形態そのままに限定されるものではなく、実施段階ではその要旨を逸脱しない範囲で構成要素を変形して具体化できる。また、上記実施形態に開示されている複数の構成要素の適宜な組み合せにより種々の発明を形成できる。例えば、実施形態に示される全構成要素から幾つかの構成要素を削除してもよい。
【図面の簡単な説明】
【0079】
【図1】本発明の一実施形態に係る、仮想計算機システムを実現する計算機システムの構成を示すブロック図。
【図2】図1中のスピンロック変数アドレステーブル311のデータ構造例を示す図。
【図3】図1中のVPROC_TBL312のデータ構造例を示す図。
【図4】同実施形態で適用されるスピンロック変数のフォーマットを示す図。
【図5】同実施形態におけるスピンロック取得処理の手順を示すフローチャートの一部を示す図。
【図6】同実施形態におけるスピンロック取得処理の手順を示すフローチャートの残りを示す図。
【図7】同実施形態における仮想プロセッサ再スケジューリング処理の手順を示すフローチャート。
【図8】同実施形態におけるスピンロック解放処理の手順を示すフローチャート。
【図9】スピンロック解放処理の変形例を示すフローチャート。
【図10】図9のスピンロック解放処理での再スケジューリング関数の呼び出しによって実行される仮想プロセッサ再スケジューリング処理の手順を示すフローチャート。
【図11】本発明の他の実施形態に係る、仮想計算機システムを実現する計算機システムの構成を示すブロック図。
【符号の説明】
【0080】
1,100…計算機システム、31,310…VMM(仮想計算機マネージャ)、32…仮想計算機実行環境、33…仮想HW環境、34…ゲストOS実行環境、101-0,101-1…実プロセッサ、311…スピンロック変数アドレステーブル、312…VPROC_TBL(仮想プロセッサ状態テーブル)、331-0〜331-3…仮想プロセッサ、340…ゲストOS。
【特許請求の範囲】
【請求項1】
仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる計算機システムにおいて、
前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する、前記仮想計算機マネージャに設けられた選択手段と、
前記選択手段によって選択された仮想プロセッサに実プロセッサを割り当てる、前記仮想計算機マネージャに設けられたプロセッサ割り当て手段と
を具備することを特徴とする計算機システム。
【請求項2】
前記複数の仮想プロセッサのうちのいずれかの仮想プロセッサが前記目的の実行対象に関するスピンロックの取得に失敗したことを検出する検出手段と、
スピンロックの取得に失敗したことが前記検出手段によって検出された場合、前記選択手段を呼び出す手段とを更に具備し、
前記選択手段は、スピンロックの取得に失敗したことが前記検出手段によって検出された場合、前記取得に失敗した前記スピンロックを取得していて、かつ前記非実行中の状態にある仮想プロセッサを優先的に選択する
ことを特徴とする請求項1記載の計算機システム。
【請求項3】
前記選択手段は、前記取得に失敗した前記スピンロックを取得していて、かつ前記非実行中の状態にある仮想プロセッサが存在しない場合、前記取得に失敗した前記スピンロックの待ち状態になく、かつ前記非実行中の状態にある仮想プロセッサ選択することを特徴とする請求項2記載の計算機システム。
【請求項4】
前記仮想プロセッサによって取得されているスピンロックが解放される際に前記選択手段を呼び出す手段を更に具備し、
前記選択手段は、スピンロックが解放される際には、任意のスピンロックを取得していて、スピンロック待ちでなく、かつ前記非実行中の状態にある仮想プロセッサを優先的に選択する
ことを特徴とする請求項1記載の計算機システム。
【請求項5】
前記選択手段は、スピンロックが解放される際に選択すべき仮想プロセッサの候補が複数存在する場合、その時点において最も多くのスピンロックを取得している仮想プロセッサを選択することを特徴とする請求項4記載の計算機システム。
【請求項6】
前記目的の実行対象に関するスピンロックに対応するスピンロック変数が格納されているメモリ上のアドレスであるスピンロックアドレスを前記仮想計算機マネージャに通知する、前記ゲストOSに設けられたスピンロックアドレス通知手段と、
前記複数の仮想プロセッサ各々のスピンロックの取得状況を保持する、前記仮想計算機マネージャに設けられたスピンロック取得状況保持手段とを更に具備し、
前記選択手段は、前記スピンロックアドレス通知手段によって通知されたスピンロックアドレスにより指定されるスピンロック変数と前記スピンロック取得状況保持手段によって示される前記複数の仮想プロセッサ各々のスピンロックの取得状況に基づいて仮想プロセッサを選択する
ことを特徴とする請求項1記載の計算機システム。
【請求項7】
前記プロセッサ割り当て手段による実プロセッサ割り当てに応じて前記スピンロック取得状況保持手段に保持されている対応する仮想プロセッサのスピンロック取得状況を更新する更新手段を更に具備することを特徴とする請求項6記載の計算機システム。
【請求項8】
仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる計算機システムに適用され、前記複数の仮想プロセッサの中から処理を実行させる仮想プロセッサを選択して、その選択された仮想プロセッサに実プロセッサを割り当てるプロセッサ割り当て方法であって、
前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択するプロセッサ選択ステップと、
選択された仮想プロセッサに実プロセッサを割り当てるプロセッサ割り当てステップと
を具備することを特徴とするプロセッサ割り当て方法。
【請求項9】
前記複数の仮想プロセッサのうちのいずれかの仮想プロセッサがスピンロックの取得に失敗したことを検出するステップと、
スピンロックの取得に失敗したことが検出された場合に、前記プロセッサ選択ステップを呼び出すステップとを更に具備し、
前記選択ステップでは、スピンロックの取得に失敗したことが検出された場合、前記取得に失敗した前記スピンロックを取得していて、かつ前記非実行中の状態にある仮想プロセッサが優先的に選択される
ことを特徴とする請求項8記載のプロセッサ割り当て方法。
【請求項10】
前記仮想プロセッサによって取得されているスピンロックが解放される際に前記プロセッサ選択ステップを呼び出すステップを更に具備し、
前記選択ステップでは、スピンロックが解放される際に、任意のスピンロックを取得していて、スピンロック待ちでなく、かつ前記非実行中の状態にある仮想プロセッサが優先的に選択される
ことを特徴とする請求項8記載のプロセッサ割り当て方法。
【請求項11】
仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる計算機システムに適用され、前記複数の仮想プロセッサの中から処理を実行させる仮想プロセッサを選択して、その選択された仮想プロセッサに実プロセッサを割り当てるためのプログラムであって、
前記仮想計算機マネージャに、
前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択するプロセッサ選択ステップと、
選択された仮想プロセッサに実プロセッサを割り当てるプロセッサ割り当てステップと
を実行させるためのプログラム。
【請求項1】
仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる計算機システムにおいて、
前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択する、前記仮想計算機マネージャに設けられた選択手段と、
前記選択手段によって選択された仮想プロセッサに実プロセッサを割り当てる、前記仮想計算機マネージャに設けられたプロセッサ割り当て手段と
を具備することを特徴とする計算機システム。
【請求項2】
前記複数の仮想プロセッサのうちのいずれかの仮想プロセッサが前記目的の実行対象に関するスピンロックの取得に失敗したことを検出する検出手段と、
スピンロックの取得に失敗したことが前記検出手段によって検出された場合、前記選択手段を呼び出す手段とを更に具備し、
前記選択手段は、スピンロックの取得に失敗したことが前記検出手段によって検出された場合、前記取得に失敗した前記スピンロックを取得していて、かつ前記非実行中の状態にある仮想プロセッサを優先的に選択する
ことを特徴とする請求項1記載の計算機システム。
【請求項3】
前記選択手段は、前記取得に失敗した前記スピンロックを取得していて、かつ前記非実行中の状態にある仮想プロセッサが存在しない場合、前記取得に失敗した前記スピンロックの待ち状態になく、かつ前記非実行中の状態にある仮想プロセッサ選択することを特徴とする請求項2記載の計算機システム。
【請求項4】
前記仮想プロセッサによって取得されているスピンロックが解放される際に前記選択手段を呼び出す手段を更に具備し、
前記選択手段は、スピンロックが解放される際には、任意のスピンロックを取得していて、スピンロック待ちでなく、かつ前記非実行中の状態にある仮想プロセッサを優先的に選択する
ことを特徴とする請求項1記載の計算機システム。
【請求項5】
前記選択手段は、スピンロックが解放される際に選択すべき仮想プロセッサの候補が複数存在する場合、その時点において最も多くのスピンロックを取得している仮想プロセッサを選択することを特徴とする請求項4記載の計算機システム。
【請求項6】
前記目的の実行対象に関するスピンロックに対応するスピンロック変数が格納されているメモリ上のアドレスであるスピンロックアドレスを前記仮想計算機マネージャに通知する、前記ゲストOSに設けられたスピンロックアドレス通知手段と、
前記複数の仮想プロセッサ各々のスピンロックの取得状況を保持する、前記仮想計算機マネージャに設けられたスピンロック取得状況保持手段とを更に具備し、
前記選択手段は、前記スピンロックアドレス通知手段によって通知されたスピンロックアドレスにより指定されるスピンロック変数と前記スピンロック取得状況保持手段によって示される前記複数の仮想プロセッサ各々のスピンロックの取得状況に基づいて仮想プロセッサを選択する
ことを特徴とする請求項1記載の計算機システム。
【請求項7】
前記プロセッサ割り当て手段による実プロセッサ割り当てに応じて前記スピンロック取得状況保持手段に保持されている対応する仮想プロセッサのスピンロック取得状況を更新する更新手段を更に具備することを特徴とする請求項6記載の計算機システム。
【請求項8】
仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる計算機システムに適用され、前記複数の仮想プロセッサの中から処理を実行させる仮想プロセッサを選択して、その選択された仮想プロセッサに実プロセッサを割り当てるプロセッサ割り当て方法であって、
前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択するプロセッサ選択ステップと、
選択された仮想プロセッサに実プロセッサを割り当てるプロセッサ割り当てステップと
を具備することを特徴とするプロセッサ割り当て方法。
【請求項9】
前記複数の仮想プロセッサのうちのいずれかの仮想プロセッサがスピンロックの取得に失敗したことを検出するステップと、
スピンロックの取得に失敗したことが検出された場合に、前記プロセッサ選択ステップを呼び出すステップとを更に具備し、
前記選択ステップでは、スピンロックの取得に失敗したことが検出された場合、前記取得に失敗した前記スピンロックを取得していて、かつ前記非実行中の状態にある仮想プロセッサが優先的に選択される
ことを特徴とする請求項8記載のプロセッサ割り当て方法。
【請求項10】
前記仮想プロセッサによって取得されているスピンロックが解放される際に前記プロセッサ選択ステップを呼び出すステップを更に具備し、
前記選択ステップでは、スピンロックが解放される際に、任意のスピンロックを取得していて、スピンロック待ちでなく、かつ前記非実行中の状態にある仮想プロセッサが優先的に選択される
ことを特徴とする請求項8記載のプロセッサ割り当て方法。
【請求項11】
仮想計算機マネージャによって構築される仮想計算機環境で、複数の仮想プロセッサが動作するマルチプロセッサ環境を前提としてゲストOSが動作し、前記複数の仮想プロセッサ間の排他制御に、予め定められた実行対象毎に用意されるスピンロック変数が用いられる計算機システムに適用され、前記複数の仮想プロセッサの中から処理を実行させる仮想プロセッサを選択して、その選択された仮想プロセッサに実プロセッサを割り当てるためのプログラムであって、
前記仮想計算機マネージャに、
前記複数の仮想プロセッサの中から、目的の実行対象に関するスピンロックを取得していて、かつ実プロセッサが割り当てられていない非実行中の状態にある仮想プロセッサを優先的に選択するプロセッサ選択ステップと、
選択された仮想プロセッサに実プロセッサを割り当てるプロセッサ割り当てステップと
を実行させるためのプログラム。
【図1】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【図2】
【図3】
【図4】
【図5】
【図6】
【図7】
【図8】
【図9】
【図10】
【図11】
【公開番号】特開2006−99182(P2006−99182A)
【公開日】平成18年4月13日(2006.4.13)
【国際特許分類】
【出願番号】特願2004−281270(P2004−281270)
【出願日】平成16年9月28日(2004.9.28)
【出願人】(000003078)株式会社東芝 (54,554)
【出願人】(301063496)東芝ソリューション株式会社 (1,478)
【公開日】平成18年4月13日(2006.4.13)
【国際特許分類】
【出願日】平成16年9月28日(2004.9.28)
【出願人】(000003078)株式会社東芝 (54,554)
【出願人】(301063496)東芝ソリューション株式会社 (1,478)
[ Back to top ]