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()

なにもしない