2008-10-07から1日間の記事一覧
roundrobin()の仕組み、tick値やrrticks値の設定はNetBSD 1.6と「BSDカーネルの設計と実装」の段階でのFreeBSDとは特に違いがないように見える。 4BSD由来のコードがそのまま生きているという事だろう。BSDカーネルの設計と実装―FreeBSD詳解作者: マーシャル…
NetBSD 1.6のデフォルト値ではHZ = 100に設定されており、tick = 10000us = 10msである。 rrticks = hz / 10 = 10ticks = 100msであり、hardclock()が10ms毎、roundrobin()が100ms毎に実行される事になる。 つまり、1スレッド毎のタイムスライスは100msにな…
hardclock()はtick毎に呼び出され、その中でroundrobin()はrrticks毎に呼び出される。roundrobin()はneed_resched()を呼び出し、need_resched()はaston()を呼び出す。 これにより、proc構造体のmd_astpendingフラグが有効になる。UserIntr,UserGenException,…
NetBSD-currentにはschedcpu()がないで少し言及したyamt-idlelwp branchに関する議論のスレッドで発見したパッチを解析してみた。 このパッチは恐らくスケジューラのモジュール化を目的としており、4.0からcurrentのコードへ至る途中の段階がどうなっていた…
sched_tick() 100ms毎にプロセスを切り替える、とコメントに書いてあるように見えるが、実際にやっているのはcpu_need_resched()の呼び出しでci->ci_want_reschedを1にしたり、spc->spc_ticksを更新したり、spc->spc_flagsを書き換えたりする程度。kern_clo…
NetBSDにはgeneric software interrupt frameworkという仕組みがある。 これはボトムハーフハンドラを実現したり、クロック処理等に使われている。 Linuxの*_softirq()に近い。APIは、 void * softint_establish(u_int flags, void (*func)(void *), void *a…
NetBSD-currentでは、それまでkern/kern_synch.cにあったキュー関連の変数※とキューへのアクセス関数をまとめてkern/kern_runq.cへ移動した。 ※以下の変数 struct prochd sched_qs[RUNQUE_NQS]; /* run queues */ volatile uint32_t sched_whichqs; /* bitma…
2.0より処理の単位がprocからlwpへ書き直された。引数がバージョンによって異なる: 1.6 mi_switch(struct proc *p) 2.0〜4.0 mi_switch(struct lwp *l, struct lwp *newl) current mi_switch(struct lwp *l) 1.6ではmi_switch()がcpu_switch()を呼び出し、…
revision 1.188より、NetBSD-currentではschedcpu()が無くなっている。これは、スケジューラのモジュール化を進めていく中でschedcpu()をモジュール固有の機能/モジュール間で共通の機能に別けて整理し直した為と思われる。schedcpu()はsched_pstats()に名…
スケジューリング機構に手を入れる事を目的として、NetBSDのプロセススケジューラを解析している。 作業の中で分かった事を順次まとめて行きたい。 スケジュールの単位がprocからlwpに変更され、スケジューリングに関する主要なパラメータがlwpに移った(2.0…