連載
» 2007年10月03日 01時45分 UPDATE

仮想マシンモニタ Xen 3.0解読室:sedfスケジューラの実装を理解する【後編】 (1/4)

現在のXenでは、2種類のスケジューリング方針を提供しています。前回に引き続き、標準スケジューリング方式であるsedfスケジューラの実装について解説します。

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

sedfスケジューラのデータ構造

 sedfスケジューラのデータ構造は、固有のデータを格納する構造体として定義され、ドメインスケジューラ本体が用意するデータ構造と相互リンクを持つように設計されています(図1)。ドメインを管理するためのdomain構造体をsedf_dom_info構造体で、仮想CPUを管理するためのvcpu構造体をsedf_vcpu_info構造体で拡張しています。また、実CPUそれぞれのスケジューリング関連データを管理するschedule_data配列を、sedf_cpu_info構造体で拡張しています。

図1 図1 sedf固有データ構造

 またsedfスケジューラは、実行可能な状態にある仮想CPUを管理するために、sedf_cpu_info構造体内にRUNキューの頭を用意し、そこに仮想CPUを表すsedf_vcpu_info構造体を登録します。

runnableqキューとwaitqキュー

 割り当て時間を持っている仮想CPUと、割り当て時間を使い果たした仮想CPUは、分けて管理しています(「スケジューリング基本方針」で説明したように、sedfスケジューラは、各仮想CPUに一定周期ごとに割り当て時間を与えます)。割り当て時間を持っている仮想CPUは、いつでもすぐに実行可能という意味で、runnableqキューに登録します(図2の1)。このとき、デッドラインに近いものから順に、仮想CPUを並べています。

図2 図2 sedfのRUNキュー構造

 一方、割り当て時間を使い果たした仮想CPUは、waitqキューに登録します(図2の2)。waitqキューという名前ですが、LinuxカーネルでいうところのWAITキューとは異なります。LinuxカーネルのWAITキューには、待機状態のプロセスが登録されますが、Xenのwaitqキューには、あくまでも実行可能状態の仮想CPUが登録されます。Linuxカーネルでいうところのexpiredキューのようなものだと考えれば良いでしょう。

 これらrunnableqキューとwaitqキューの組は、それぞれの実CPUごとに用意されています。明示的な仮想CPUの移動がない限り、各仮想CPUは、常に同じ実CPUにて実行されます。

2つのextraqキュー

 実CPUが空いた場合、割り当て時間を持っていない仮想CPUに実行権を与えます。このとき、各仮想CPUに対して実行権を与えて良いか管理するextraqキューを用意しています。extraqキューは2つあり、1つは補償時間を使って動作できる仮想CPU用のpenaltyキュー。もう1つは、有効利用時間を使って動作できる仮想CPU用のutilizationキューです。

 penaltyキュー(図2の3、extraq[EXTRA_PEN_Q])には、I/O完了待ちなどで「補償時間を使い切る前に実行権を放棄した仮想CPU」が登録されます。また、runnableqキュー上に仮想CPUが存在しないとき、sedfスケジューラはpenaltyキュー上の仮想CPUに実行権を与えます。

 utilizationキュー(図2の4、extraq[EXTRA_UTIL_Q])には、実CPUの時間が余っている限り、利用したい仮想CPUを幾らでも登録できます*。runnableqキュー上にもpenaltyキュー上にも仮想CPUが存在しないとき、このutilizationキュー上の仮想CPUに実行権が与えられます。

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

利用したい仮想CPUを幾らでも登録できます

仮想CPUに有効利用時間を利用させるための設定を行う。仮想CPU作成時には標準で設定されている。


       1|2|3|4 次のページへ

Copyright© 2017 ITmedia, Inc. All Rights Reserved.

ピックアップコンテンツ

- PR -

注目のテーマ