Lions' 本読み (36)
朝練メモ。なんとなく俯瞰できてるカンジがしてる中でもっかい runin とか runout あたりの xref を見ながら中身を確認してみるなど。
runin
sched 手続きで非ゼロになって sleep してます。優先度も非ゼロ (というか負)。
1953 sloop: 1954 runin++; 1955 sleep(&runin, PSWP);
で、sleep で値チェックして wakeup してます。
2080 if(runin != 0) { 2081 runin = 0; 2082 wakeup(&runin); 2083 }
ちなみに上記は優先度が 0 以上の場合なブロックの中になってます。そしてもう一つは clock 手続きの以下の部分になります。
3820 if(runin!=0) { 3821 runin = 0; 3822 wakeup(&runin); 3823 }
で、この runin というのは契機として sleep 乃至 clock 割り込みで sched (proc#0) が起こされるんですが、sched の中で runin な状況 (372p に説明あり) であれば再び sleep するしそうでなければ、という事なんですね。
runout
実行状態でスワップアウトな状態のプロセスが無い場合、sched 手続きで以下な処理が適用される。
1966 if(n == -1) { 1967 runout++; 1968 sleep(&runout, PSWP); 1969 goto loop; 1970 }
次に出てくるのは setrun 手続き。setrun で実行状態にされたプロセスがスワップアウトな状態であれば runout で wakeup してますね。
2140 rp->p_stat = SRUN; (中略 2143 if(runout != 0 && (rp->p_flag&SLOAD) == 0) { 2144 runout = 0; 2145 wakeup(&runout); 2146 }
で、runout を云々しているのは 372p の記述にある通り、xswap 手続きの以下の部分。
4387 if(runout) { 4388 runout = 0; 4389 wakeup(&runout); 4390 }
xswap はスワップアウトな処理になるので proc#0 を起こして sched で云々してね、という事になるのか。成程。
runrun
調子に乗って runrun も確認。setrun では実行状態にするプロセスが curpri よりも優先度が高いのであれば runrun++ してます。
2141 if(rp->p_pri < curpri) 2142 runrun++;
あるいは setpri 手続きでも設定した優先度より、って
2165 if(p > curpri) 2166 runrun++;
ええと、例の参考書でも_バグっぽい?_という記述があるんでスルーします。ちなみに swtch 手続きの中で初期化されてます。
2195 loop: 2196 runrun = 0;
あとは clock 割り込みで 4 秒に一回なナニが以下の記述。
3806 if((time[1]&03) == 0) { 3807 runrun++; 3808 wakeup(&lbolt); 3809 }
で、この runrun 値でどのような作用が生じるかというとアセンブラで記述されている call 手続きで以下。
0785 jsr pc,*(r0)+ 0786 2: 0787 bis $340,PS 0788 tstb _runrun 0789 beq 2f 0790 bic $340,PS 0791 jsr pc,_swtch 0792 br 2b
割り込みから戻って runrun のチェックをしてこれが非ゼロなら swtch を呼び出してます。上記でチェックしたら優先度の高いプロセスが居るので swtch でプロセスを切り替える、という理解で良いのかな。
runrun での切り替わりは proc#0 以外のプロセスに直接切り替わり、という事なのか。