ネイティブなLinuxカーネルでは、実行するプロセスがなくなるとアイドルプロセスをスケジューリングし、アイドルプロセスは永久にcpu_idle関数を実行し続けます。電源制御の可能なハードウェアでは、システムを省電力モードに遷移させたり、それがないハードウェアではhlt命令やnwait命令を利用して、少しでも無駄に電力を消費しないようにしています。
準仮想化ドメインのゲストOSがアイドル状態になったとき、「アイドル状態になった」とXenに通知し実行権を手放すことを、Xenは期待しています*。準仮想化ドメイン用のLinuxカーネルでは、アイドル状態になるとxen_idle()関数が呼び出されます。xen_idle()関数はハイパーバイザー呼び出しを行い、Xenに実行権を返します(リスト6の太字部分)。
void xen_idle(void)
{
local_irq_disable();
if (need_resched()) {
local_irq_enable();
} else {
stop_hz_timer();
/* Blocking includes an implicit local_irq_enable(). */
HYPERVISOR_sched_op(SCHEDOP_block, 0);
start_hz_timer();
}
}
次回はsedfスケジューラについて解説します。なお、ドメインスケジューリング関連機能は、Xen 3.0.1のコードのままで説明することにします。次回の記事を読めば、sedfスケジューラの癖や、xmコマンドによるスケジューラの(難解な)制御方法が分かってくるのではないかと思います。
手放さなくとも、割り当て時間を過ぎれば、Xenが強制的にドメイン切り替えを行う。しかし、動作効率を考えると、ゲストOSとして動作するOSは自ら実行権を手放すべきといえる。
本記事は、オープンソースマガジン2006年6月号「仮想マシンモニタ Xen 3.0解読室」を再構成したものです。
Copyright © ITmedia, Inc. All Rights Reserved.