連載
» 2007年04月28日 08時00分 UPDATE

仮想マシンモニタ Xen 3.0解読室:ドメインの切り替え【前編】 (1/2)

Xenにおいて、それぞれのドメインは1つの仮想マシン環境です。Xenはそれらドメインの実行を制御します。実行を制御するこの機能をドメインスケジューラと呼びます。また、ドメインの実行を切り替える機能をドメインディスパッチャと呼びます。今回から少しの間、ドメインスケジューラとディスパッチャの動作について解説します。

[高橋浩和(VA Linux Systems Japan),ITmedia]

ドメインと仮想CPU

 各ドメイン内では、マルチプロセッサ対応のOSが動作可能です。つまり、ドメイン内のゲストOSが、同時に複数の実CPUを割り当てられ、動作することがあります。

 マルチプロセッサ対応のOSが動作すると、1つのドメイン内に複数の実行の流れが存在することになります。Xenは、それぞれの実行の流れを制御するオブジェクトとして仮想CPUを定義し、ドメインスケジューラにはこの仮想CPUをスケジューリングさせます。ドメインスケジューラはそれぞれの実CPU上で独立して動作し、それぞれ最適と思われる仮想CPUを選び出して実行権を与えます。つまり、仮想CPUを実CPUに割り当てているわけです(図1)

図1 図1 ドメインと仮想CPUと実CPUの関係

 ドメイン内のゲストOSから見た場合、この仮想CPUは実CPUのように見えます。実際にはドメインスケジューラが時分割で各ドメイン(仮想CPU)に時間を分け与えていますが、ゲストOSは実CPUを占有していると思っています。

 ドメインと仮想CPUの関係は、プロセスとスレッドの関係に似ています。プロセスはその中に複数のスレッドを持ち、プロセススケジューラがそのスレッドをスケジューリングしているのと同じ関係です(図2)

図2 図2 プロセスとスレッドとCPUの関係

domain構造体とvcpu構造体

 Xenは、各ドメインをdomain構造体で管理し、仮想CPUをvcpu構造体で管理します。それぞれのドメイン(domain構造体)には、複数の仮想CPU(vcpu構造体)が対応付けられています。

 仮想CPUは、各CPUごとに用意されたRUNキュー(実行キュー)に登録されます。それぞれのRUNキュー上の仮想CPUの1つが、実CPUと対応付けられ、その仮想CPUを含むドメイン内のゲストOSが実行されます(図3)

図3 図3 データ構造

ハイパーバイザースタック

 Xenは、ハイパーバイザースタックを1つだけ持っています(正確には実CPUごとに1つのハイパーバイザースタックを用意しています)。Linuxカーネルが、プロセスごとにカーネルスタックを用意していたのと対照的です。これは何を意味するのでしょうか?

 Linux上のプロセスは、システムコールやページフォルトの途中で処理を中断し、再開することがあります。メモリなどの資源確保で待ち合わせることもありますし、ディスクI/Oの完了を待たなければならないこともあります。プロセスが再開すると、そのシステムコール処理やページフォルト処理の続きから動き始めます。これらの処理が完了するまで、いま使っているカーネルスタックを占有する必要があります。

 しかし、処理を中断している間に、同じCPU上でほかのプロセスがシステムコール処理を始めることがあります(最大で、プロセス数だけ同時にシステムコール処理が実行中になる可能性があります)。これが、各プロセスごとにカーネルスタックが必要となる理由です。

 一方Xenは、ドメインごとのハイパーバイザースタックを用意していません。これは、ハイパーバイザーコールや例外ハンドラにおいて、その処理が中断しないことを意味しています。これらの処理は、ドメインの再スケジューリングを目的とした明示的なドメインスケジューラ呼び出しを除いて、Xenのコードを一気に走り抜けます。

 そのため、1つの実CPU上で、同時に複数の実行の流れがXenのコードを実行しているという状態は発生しません。これは、Xenの内部状態がLinuxカーネルほど複雑にならないことも示しています。

currentポインタ

 ハイパーバイザースタックの底には、物理CPUに現在割り当てられている仮想CPUを指すポインタを保持していて、Linuxと同じく、currentというマクロでこのポインタを参照できるようになっています。currentマクロを呼び出すと、実CPUに割り当てられている仮想CPUが求められます。

ドメインコンテキスト

 また、ハイパーバイザースタックの底にはドメインのコンテキストも保存されています。ハイパーバイザーコール、割り込み、例外が発生したときに、ドメインコンテキストをスタックに待避し、Xenに実行権を渡します。待避するのは、Xenが実行するときに利用する(破壊する)コンテキストです。Xenの処理が完了したとき、この待避したコンテキストを復帰させ、ドメインの処理を再開します。

 スタックの底のデータ(待避したドメインコンテキスト、current、そのほか幾つかのデータ)の並びは、さまざまな処理から利用しやすいようcpu_info構造体として管理されています。LinuxもXen同様、カーネルスタックの底に待避したプロセスコンテキストを参照しやすくするための構造体pt_regsを定義しています。

アイドルドメイン

 実行可能なドメインが1つも存在しないときに選択する、何も実行しないドメインを用意しています。このドメインをアイドルドメインと呼びます。Linuxのプロセススケジューリングにおいても、同様の手法を採用しています※。実行すべきプロセスが存在しないときは、何もしないプロセスであるアイドルプロセスを選択し、そのプロセスに実行権を与えます。

       1|2 次のページへ

Copyright© 2016 ITmedia, Inc. All Rights Reserved.

Loading

ピックアップコンテンツ

- PR -

注目のテーマ