ドメインのスケジューリング【前編】仮想マシンモニタ Xen 3.0解読室(1/2 ページ)

引き続き、ドメインのスケジューリングの仕組みを見ていきます。前回までは、「ドメインを切り替える」という点を中心に解説しましたが、今回は、「どのドメインに実行権を与えるか」という視点から解説します。

» 2007年07月13日 03時23分 公開
[高橋浩和(VA Linux Systems Japan),ITmedia]

 さて、前回前々回に引き続き、今回もドメインのスケジューリングの仕組みを見ていきます。前回までは、「ドメインを切り替える」という点を中心に解説しましたが、今回は、「どのドメインに実行権を与えるか」という視点から解説していきたいと思います。

ドメインスケジューラ

 ドメインスケジューラの仕事は、実行するのに最もふさわしいドメインを選択し、そのドメインに実行権を与えることです。処理のイメージはLinuxのプロセススケジューラとほぼ同等といって良いでしょう。複数のドメインを時分割で動作させることで、いかにも複数のドメインが同時に実行されているかのような環境を作り出します。

 Xenは、ドメインスケジューラ用に2種類のスケジューリングポリシーを用意しています。それぞれsedf(Simple Early Deadline First scheduler)とbvt(Borrowed Virtual Timer scheduler)と呼ばれており、どちらもリアルタイムスケジューリング用のアルゴリズムを採用しています。どのドメインを実行させるべきかという判断基準が少し異なる程度で、基本はどちらも同じです。

スケジューリング契機

 ドメインスケジューラが動作する契機にはどのようなものがあるか見ていきましょう。

時間による再スケジューリング

 Xenはタイマー*を契機に、ドメインの再スケジューリングを行います。Linuxもプロセス再スケジューリングにタイマーを利用していますが、同様のことをXenはドメインに対して行っています。タイマー処理の中から、ドメインスケジューリング関数(__enter_scheduler関数)をソフト割り込みハンドラ*として起動することで実現しています。タイマーから起動されたドメインスケジューラは、現在実行中のドメインの状態にかかわらず、強制的に再スケジューリングを行います(図1)

図1 図1 実行可能状態の仮想CPUのプール

ドメインからの再スケジューリング要求

 ドメイン内で動作しているゲストOSは、Xenに明示的な再スケジューリングを要求できます。ゲストOSは、sched_opハイパーバイザー呼び出しを利用し、自分の意思で実行権を放棄するわけです。sched_opハイパーバイザーの引数を次のように変えることで、3種類の動作を指定できます。

  1. SCHEDOP_yield:ドメインの仮想CPUを実行可能な状態にしたまま、ほかのドメインに実行権を譲る(do_yield関数)。しばらくすると再度実行権が与えられる
  2. SCHEDOP_block:ドメインの仮想CPUをスケジューリング対象から外す(do_block関数)。実行可能状態ではなくなる
  3. SCHEDOP_shutdown:ドメインの仮想CPUを永久的にスケジューリング対象から外す

 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でも)採用している方法です。

このページで出てきた専門用語

タイマー

時計機能に関しては、別の回に詳しく説明する。

ソフト割り込みハンドラ

ソフト割り込みに関しては、別の回に詳しく説明する。

さまざまなものがあります

これらに関する詳しい説明は、割り込みの回に行う。


関連キーワード

カーネル | Linux | オープンソース | 仮想化 | Xen


       1|2 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

注目のテーマ