Lions' 本読み (88)
ええと #台風そん にのっかって 14 章再読に突入です。
とりあえず軽め設定ということで sched あたりを確認。Lions' 本によれば
- プロセス #0 が sched 手続きを実行
- 入出力操作待ち以外は runin ないし runout で sleep している
とのこと。以前のエントリでも纏めたような気がしますがリハビリがてら xref をそれぞれのキーワードでたぐってみます。
runin
いきなり躓く。p372 の 1958 行な記述
クロックが割り込んで p_time の値を変更できないように、プロセッサを優先度 6 に変更して、実行可能状態で最も長い時間スワップアウトされていたプロセスを検索する。
Lions' Commentary on UNIX より引用
の以下な実装を見てるのですが
1958 spl6(); 1959 n = -1; 1960 for(rp = &proc[0]; rp < &proc[NPROC]; rp++) 1961 if(rp->p_stat==SRUN && (rp->p_flag&SLOAD) && 1962 rp->p_time > n) { 1963 p1 = rp; 1964 n = rp->p_time; 1965 }
proc 構造体の p_time 属性って秒単位の clock 割り込みに捕まったら +1 されてスワップアウトする時に 0 で初期化されてるみたいなのですがこれは一体どーゆーことだ、というあたりで、となっております。
む
sched から SRUN のままでスワップアウトされるのは
- proc 配列要素の内 p_stat が SRUN で p_flag が SLOAD でない (スワップアウトされている) もののうち p_time 属性の値が 4 以上のものがある
- 安易にコアが見つからない (1990-1994)
- p_flag が SLOAD (SSYS でもなく SLOCK でもない) で p_stat が SWAIT または SSTOP の状態な要素が proc 配列にある場合
- proc 配列要素の内 p_stat が SRUN ないし SSLEEP で p_flag が SLOAD (SSYS でもなく SLOCK でもない) もののうち p_time 属性の値が 3 以上のものがある
- この要素なプロセスがスワップアウト対象になる模様
ということなのか。
あれれ、おかしいな。基本的にスワップアウトされると p_time 属性は 0 で初期化されれるって上にも控えてるな。ちょっとへろへろなカンジなので休みつつ本確認入れてみます。
再開
答えは p372 の runin な説明の記述にありました。基本的にオブジェクトという意味でアクティブな proc 配列要素については全て clock 割り込みで p_time 属性が増分されてました。
3809 for(pp = &proc[0]; pp < &proc[NPROC]; pp++) 3810 if(pp->p_stat) { 3811 if(pp->p_time != 127) 3812 pp->p_time++;
ちなみに上記の条件 (最初のものと最後のもの) が真の場合、runin な状態、ということになります。また、第二引数が 0 以上の値 (優先度が通常のもの?) で sleep を呼び出すことによって runin が 0 でなければ wakeup(&runin) を呼び出しています。あ、clock 割り込みからも runin が 0 でなければ wakeup(&runin) を呼び出しています。
runout
こちらは Lions' 本に書いてあるそのまんまで
- proc 配列要素を全て調べスワップアウトされていて (p_flag 属性が SLOAD でない)、実行可能な状態 (p_stat 属性が SRUN な状態) の要素が無い場合
runout な状態として sleep しています。ちなみにこの状態は以下に列挙する挙動により変更されるとのこと。
- wakeup の呼び出し
- newproc か expand のどちらかから呼び出される xswap の呼び出し
たしかに wakeup から呼び出される setrun と xswap からは wakeup(&runout) してますね。xref 見てもそこからのみ、になっていることが分かります。
とりあえず
リハビリ、ということで今日はこれで終わりにします。