tarosukeの日記: [wOS] プロセッサへのプロセス割り当て考察
# プロセッサ番号はコア順であるという前提で。
- とりあえず一つおきにしとくと別のコアに割り当てられて計算力的には有利
- 逆にキャッシュ競合の面から言えばキャッシュを共有してるHTが効くようにbit1以上が同じになるように割り当てるほうがいい
- HTのないAMD機だとどっちでも同じ
- 並列処理したい場合は違うコアに割り当てるべき
- 逐次処理で大きなデータを渡したい場合はキャッシュに残ってる可能性が高いので同じプロセッサを割り当てるほうがいい
...なんか面倒な条件だな。前提条件の判断自体が困難だ。
とりあえず上3つは無条件にラウンドロビン的な割り当てインデクスのbit0とbit1を入れ替えて基本は一つおきで一周したらその間みたいになるようにすればいいか。問題は下二つ。マイグレーションする時に検出できればいいんだがな。あるいは逆に新規プロセスはプロセッサ0にだけ割り当ててマイグレーションで散らすってのも...どうなんだろ。
...んー、割り当てインデクスをインクリメントして割り当てプロセッサを変更するのはプロセッサの負荷が高くなったらでいいかもしれん。プロセッサの負荷が下がってきたら逆マイグレーションでプロセスを集めてくるのもいいし。とにかく、プロセッサがバックオーダーを抱えない範囲でなるべく偏ってるようにするとキャッシュとかでいろいろ良さげ(TLB的には不利かなぁ...)。割り込みのハンドリング分を残して平均では90%くらいかな?
偏っているからと言ってプロセッサがアイドルになる時間があるので遅くなるわけじゃない。もしずっと動いてるプロセスがあるならそのプロセッサの負荷は100%なのでプロセスはマイグレートされる。あるいは逆に高負荷プロセスは最初から分散されるようにする方がいいか。つまり「優先度と処理時間は反比例する」って原則から言えばデフォルトの優先度が低いプロセスは最も低負荷なプロセッサに割り当てられるってワケだ。
ハードリアルタイム処理の場合は普通のスケジューリングとは逆にプロセッサの負荷は平均化されてなければならない。でないと後の方の処理が不確実になる。なのでプロセス起動時にワンサイクルの処理時間を申請させて全体のサイクルが最短で終了するように固定的にスケジューリングするってあたり。
アルゴリズム的には処理時間が長い順にソートして割り当て済みタスク群の終了時間が最短なプロセッサに割り当てていくだけで良さげ。最優先タスクなので他のタスクのことは考えなくていいし。
ハードリアルタイムだとスケジューリングが固定的な関係で途中でタスクを追加したりとかはできない。なのでプロセスを全部生成して上のアルゴリズムでマイグレートしてからリアルタイムモードに入れるようにするとかする必要がある。もちろんリアルタイムモードではリアルタイムプロセスを追加できないし、リアルタイムモードでなければリアルタイムタスクはスケジュールされない。でないと時間を保証できん。
あと、サイクル開始からそのサイクルのリアルタイムの処理が終わるまではタイマ以外の割り込みは禁止しとかなきゃならんし、IPIを経由するのはジッタの原因だから「次にタイマ割り込みを受けるプロセッサ」を決めとかなきゃならんし(これはタイマ割り込みで起動するときに次に起動するプロセスのオーナープロセッサをチェックすれば可能)、いろいろすることはあるなー。今はリアルタイムはやらんけど。
--
wOSはノード内はUMAで、クラスタはNORAね。
[wOS] プロセッサへのプロセス割り当て考察 More ログイン