EN JA
RUNQUEUE(9)
RUNQUEUE(9) FreeBSD Kernel Developer's Manual RUNQUEUE(9)

名称

choosethread, procrunnable, remrunqueue, setrunqueue実行可能なプロセスのキューを管理する

書式

#include < sys/param.h>
#include < sys/proc.h>

extern struct rq itqueues[];
extern struct rq rtqueues[];
extern struct rq queues[];
extern struct rq idqueues[];

struct thread *
choosethread( void);

int
procrunnable( void);

void
remrunqueue( struct thread *td);

void
setrunqueue( struct thread *td);

解説

ラン (実行) キューは、4 つの優先キューから成ります: 割り込みスレッドのための itqueues、リアルタイム優先プロセスのための rtqueues、タイムシェアリングプロセスのための queues とアイドル優先プロセスのための idqueues です。各優先キューは、 NQS キューのヘッダ構造体の配列から成ります。各キューのヘッダは、等しい優先順位の実行可能なプロセスのリストを識別します。また、各キューには、すぐにプロセスを選択するのを助けるために空でないキューを識別するビットマスクを含む 1 つのワードがあります。これらは、 itqueuebits, rtqueuebits, queuebitsidqueuebits と名前が付けられています。ランキューは、 sched_lock ミューテックスによって保護されます。

procrunnable() は、アイドルプロセス以外の実行可能なプロセスがなければ、0 を返します。アイドルプロセス以外の少なくとも 1 つの実行可能なプロセスがあるなら、 0 以外を返します。この関数が呼び出されるとき、 sched_lock ミューテックスが保持される必要が ない ことに注意してください。別の CPU がこの関数を呼び出している間に、他の実行可能なプロセスが現在ないとき、ランキューで 1 つの CPU がプロセスを置く小さいレース (競合) ウィンドウがあります。その場合には、2 番目の CPU は、実行可能なプロセスがあることに気が付く前に、追加された 1 回のアイドルループを通って単に移動します。 SMP システムでは、アイドル CPU は、停止しないので、これは、動作しています。アイドル CPU が SMP システムで停止されないなら、このレース (競合) 条件には、失敗している場合に、より重大な影響があるかもしれません、そして、 procrunnable() は、 sched_lock ミューテックスが取得されるように要求しなければなりません。

choosethread() は、最高の優先順位の実行可能なスレッドを返します。実行可能なスレッドがなければ、アイドルスレッドが返されます。この関数は、どのスレッドを切り替えるかを決定するために cpu_switch() と cpu_throw() によって呼び出されます。 choosethread() は、 sched_lock ミューテックスが保持されている状態で、呼び出されなければなりません。

setrunqueue() は、適切な優先キューの適切なキューの後部 (テール) にスレッド td を追加します。スレッドは、実行可能でなければなりません、すなわち、 p_stat は、 SRUN に設定されていなければなりません。この関数は、 sched_lock ミューテックスが保持されている状態で、呼び出されなければなりません。

remrunqueue() は、ランキューからスレッド td を取り除きます。ランキューに td がないなら、カーネルは、 panic(9) (パニック) となります。この関数は、 sched_lock ミューテックスが保持されている状態で、呼び出されなければなりません。

August 15, 2010 FreeBSD