tarosukeの日記: [wOS] SMPなスケジューラ
日記 by
tarosuke
まーだアルゴリズム決めかねてるわけだがw
候補は...
- システムで一つのレディキューを持ち、ディスパッチは全プロセッサを対象にする
- プロセッサごとにレディキューを持ち、ディスパッチそれ自体は一つのプロセッサで完結する
- アイドルになったプロセッサがどこぞのプロセッサから最高優先度のタスクを奪ってくる
- 定期的に負荷を計算して差が大きくなったらマイグレータを動かす
...みたいな感じ。なんとなく2.1.かなとは思ってる。優先度逆転防止性能は最低だけど。
1だと優先度逆転をかなりよく防げるんだけどIPIが無駄に飛び回るのでどうも気持ち悪い。2.2.は中間的で優先度逆転はそれなりに防げるが必ず負荷測定しなければならないのと本当の負荷ではなく優先度で重み付けしなければならないので負荷計算が多少面倒でマイグレータにいくらかプロセッサパワーを食われる。2.1.だと優先度逆転防止性能は最低だけどアイドル時にしかマイグレーションしないのでディスパッチそれ自体だけでなくマイグレーションも軽い。
--
逆に高負荷なプロセッサが暇なプロセッサにタスクを押し付けるというマイグレーションもできるなー。これだと2.1.のもうひとつの問題である「プロセッサが寝てるので他のプロセッサが忙しくなっても手伝いに行かない」という問題も解決できる。それに2.1.の単純なコードはほぼそのままで高負荷なプロセッサがアイドルなプロセッサ探してIPIを投げつけるだけだし。
--
結局最初は2,1,をそのまま実装することにした。高負荷プロセッサからのマイグレーションは負荷計算が必要なので別の機会(チケット?)にしとくってワケ。そんなこんなで最終的には2.1.と2.2.の中間くらいになる気がする。
[wOS] SMPなスケジューラ More ログイン