引き続き、ドメインのスケジューリングの仕組みを見ていきます。前回までは、「ドメインを切り替える」という点を中心に解説しましたが、今回は、「どのドメインに実行権を与えるか」という視点から解説します。
さて、前回、前々回に引き続き、今回もドメインのスケジューリングの仕組みを見ていきます。前回までは、「ドメインを切り替える」という点を中心に解説しましたが、今回は、「どのドメインに実行権を与えるか」という視点から解説していきたいと思います。
ドメインスケジューラの仕事は、実行するのに最もふさわしいドメインを選択し、そのドメインに実行権を与えることです。処理のイメージはLinuxのプロセススケジューラとほぼ同等といって良いでしょう。複数のドメインを時分割で動作させることで、いかにも複数のドメインが同時に実行されているかのような環境を作り出します。
Xenは、ドメインスケジューラ用に2種類のスケジューリングポリシーを用意しています。それぞれsedf(Simple Early Deadline First scheduler)とbvt(Borrowed Virtual Timer scheduler)と呼ばれており、どちらもリアルタイムスケジューリング用のアルゴリズムを採用しています。どのドメインを実行させるべきかという判断基準が少し異なる程度で、基本はどちらも同じです。
ドメインスケジューラが動作する契機にはどのようなものがあるか見ていきましょう。
Xenはタイマー*を契機に、ドメインの再スケジューリングを行います。Linuxもプロセス再スケジューリングにタイマーを利用していますが、同様のことをXenはドメインに対して行っています。タイマー処理の中から、ドメインスケジューリング関数(__enter_scheduler関数)をソフト割り込みハンドラ*として起動することで実現しています。タイマーから起動されたドメインスケジューラは、現在実行中のドメインの状態にかかわらず、強制的に再スケジューリングを行います(図1)。
ドメイン内で動作しているゲストOSは、Xenに明示的な再スケジューリングを要求できます。ゲストOSは、sched_opハイパーバイザー呼び出しを利用し、自分の意思で実行権を放棄するわけです。sched_opハイパーバイザーの引数を次のように変えることで、3種類の動作を指定できます。
1は、あるドメインが自主的にほかのドメインに実行権を譲れるようにする機能です。ドメイン内で優先度の高い処理が終了した後に、寛大にもほかのドメインに先に処理を実行する権利を与えるなどの使い方ができます。
2は、一番良く利用されるもので、ドメインの仮想CPUを待機状態に遷移させます。Linuxの場合、そのドメイン内に実行可能なプロセスが存在しなくなったとき、つまりアイドル状態になったときに呼び出します。何も成果を出さないアイドルプロセスを実行するより、ほかのドメインにCPUを譲った方が、全体としての効率を上げることができます。
このドメインで実行する必要のある処理が生まれたときに、仮想CPUを実行可能状態に戻すと、再度スケジューリング対象になります。
3は、ゲストOSの停止やサスペンドなどでの利用を前提としています。Domain 0から指示することで、任意のドメインや仮想CPUの実行を強制的に中断することも可能です。この場合も、それら仮想CPUをスケジューリング対象から外します。
待機状態の仮想CPUを、実行可能状態に遷移させることをドメインの起床といいます。前記2の処理で、スケジューリング対象から外れたドメインの仮想CPUを、再度スケジューリング対象に戻すことができます(vcpu_wake関数)。
ドメインを起床するということは、そのドメインの仮想CPUが行うべき処理が発生したということです。それぞれのドメインはイベント駆動型のプログラムであり、ドメイン内のすべての処理は割り込みを契機として動き始めます。ドメインに対する割り込みが発生したとき、割り込みを受けたドメインの仮想CPUが待機状態であった場合、その仮想CPUをスケジューリング対象に加えます。
割り込みの種類としては、実デバイスからの実割り込みの転送、Xenが生成する仮想割り込み、ドメイン間の通信を行うためのイベントチャネルからの割り込み、同じドメイン内の別の仮想CPUからのプロセッサ間割り込みなどさまざまなものがあります*。
プリエンプションとは、実行権を奪い取ることを指します。あるドメインの仮想CPUが起床したとき、ドメインスケジューラが「現在動作している仮想CPUより実行優先度が高い」と判断すれば、その瞬間に再スケジューリング可能です。スケジューリング関数(__enter_scheduler関数)をソフト割り込みハンドラとして、起動要求をかけます。
この動作はLinuxカーネルのプロセススケジューリングの場合と同様です。プロセスが起床したとき、そのプロセスが現在実行されているプロセスより実行優先度が高いと判断すれば、直ちにプリエンプションを発生させます。
ただしXenでは、単純にプロセスの優先度を基にスケジューリングするLinuxカーネルと少し異なった処理を行います。現在のXenのドメインスケジューラは、リアルタイムアルゴリズムに従って、デッドラインまでの残り時間などを基に、優先的に動作させるドメインを選択、プリエンプションを発生させるかどうかを決定します。
「直ちにプリエンプションを発生させます」と書きましたが、実際には少しだけ遅延があります。プリエンプト要求を出した瞬間にドメインが切り替わるのではなく、現在Xenが行っている処理が完了する時点まで遅延させます。これは、ドメインスケジューラをソフト割り込みハンドラとして動作させて実現しています。Xenの内部コードを実行中にドメイン切り替えを発生させないことで、Xenの実装を単純化できることがメリットです。これは、Linuxカーネルでも(UNIXでも)採用している方法です。
時計機能に関しては、別の回に詳しく説明する。
ソフト割り込みに関しては、別の回に詳しく説明する。
これらに関する詳しい説明は、割り込みの回に行う。
Copyright © ITmedia, Inc. All Rights Reserved.