NetBSD-current - sched_4bsd.cの解析
sched_tick()
100ms毎にプロセスを切り替える、とコメントに書いてあるように見えるが、実際にやっているのはcpu_need_resched()の呼び出しでci->ci_want_reschedを1にしたり、spc->spc_ticksを更新したり、spc->spc_flagsを書き換えたりする程度。
kern_clock.cのhardclock()から呼び出される。
hardclock()はmips3_clockintr()から呼び出される(MIPSの話)。
hardclock()で
if ((--ci->ci_schedstate.spc_ticks) <= 0) sched_tick(ci)
とやっていて、sched_tick()で
spc->spc_ticks = rrticks
としているので、結果的に一定周期になる、という事だと思う。
decay_cpu()
decay_cpu_batch()から呼び出される。
loadfac, estcpuから新しいestcpuを計算。
decay_cpu_batch()
sched_pstats_hook()から呼び出される。
decay_cpu()を呼び出してestcpuを計算。
sched_pstats_hook()
sched_pstats()から呼び出される。
そもそもはschedcpu()の作業のうち、priorityのrecalculateのみ切り出した関数(の、はず)。
実際には、CPU時間の計算をdecay_cpu_batch()に、priorityの再計算をresetpriority()に任せている。
updatepri()
slptime, estcpuを更新したのちresetpriority()を呼び出してpriorityの
recalculate()を行う。
sched_setrunnable()
slptime > 1ならupdatepri()を呼び出し。
sched_nice()
proc構造体にnice値を書き込み、プロセスの持つlwpをすべてresetpriority()。
resetpriority()
estcpu、niceからpriority値を計算し、lwp_changepri()を呼び出し。
sched_schedclock()
estcpuを更新、resetpriority()を呼び出し。
sched_proc_fork()
fork時の処理?
sched_proc_exit()
child(fork先)が終了した時の後処理?
sched_lwp_fork()
lwpをforkする時の処理?
estcpuをコピーするだけ。
sched_lwp_collect()
curlwpのestcpuへ引数で渡したlwpのestcpuを足す。
sysctl_sched_rtts()
sysctlの初期化。
sched_wakeup()
sched_slept()
sched_lwp_exit()
sched_oncpu()
sched_newts()
なにもしない