NetBSD-currentのランキュー(kern/kern_runq.c)
NetBSD-currentでは、それまでkern/kern_synch.cにあったキュー関連の変数※とキューへのアクセス関数をまとめてkern/kern_runq.cへ移動した。
※以下の変数
struct prochd sched_qs[RUNQUE_NQS]; /* run queues */ volatile uint32_t sched_whichqs; /* bitmap of non-empty queues */ struct slpque sched_slpque[SLPQUE_TABLESIZE]; /* sleep queues */
恐らくスケジューラのモジュール化の一環だと思われる。
単に移動しただけでなく、構造がかなり変わっており、カーネルに一本だったランキューがCPU毎に二本(リアルタイムプロセスのキュー、通常プロセスのキュー)に増えている。
但し、今の所2本に別けた意味はあまり無いように見える。
これがrunqueueの構造体:
typedef struct { /* Lock and bitmap */ uint32_t r_bitmap[PRI_COUNT >> BITMAP_SHIFT]; /* Counters */ u_int r_count; /* Count of the threads */ u_int r_avgcount; /* Average count of threads */ u_int r_mcount; /* Count of migratable threads */ /* Runqueues */ queue_t r_rt_queue[PRI_RT_COUNT]; queue_t r_ts_queue[PRI_TS_COUNT]; /* Event counters */ struct evcnt r_ev_pull; struct evcnt r_ev_push; struct evcnt r_ev_stay; struct evcnt r_ev_localize; } runqueue_t;
これがrunqueueを触る唯一の関数:
/* * Control of the runqueue. */ static void * sched_getrq(runqueue_t *ci_rq, const pri_t prio) { KASSERT(prio < PRI_COUNT); return (prio <= PRI_HIGHEST_TS) ? &ci_rq->r_ts_queue[prio].q_head : &ci_rq->r_rt_queue[prio - PRI_HIGHEST_TS - 1].q_head; }
上記の関数で一緒くたに扱ってしまっているのだから、現状ではキューが1つの時と意味が変わらない気がする。
将来のスケジューラ拡張を見越した構造にしているのだろうか。