| フィールド | 意味 |
|---|---|
| state | プロセスの状態 TASK_RUNNING: 実行可能 TASK_INTERRUPTIBLE: Sleep中(シグナルを受信するとWakeupする) TASK_UNINTERRUPTIBLE: Sleep中(シグナルを受信してもWakeupしない) TASK_STOPPED:SIGSTOPなどを受けて停止中 TASK_NONINTERACTIVEは少し特殊で、Sleep時にTASK_INTERRUPTIBLEなどと組み合わされて使用される。このフラグがセットされているとWakeup時にsleep_avgが更新されない。 |
| prio | 動的優先度。effective_prio()によりstatic_prioをベースに計算される。 topで表示されているPrioはこの動的優先度(100-139)を0-39にバイアスして表示している。 |
| static_prio | 静的優先度(小さいほうが優先度高)。動的優先度を計算するための元ネタとして使われる。 0-99 リアルタイムプロセス用 100-139 通常プロセス用(nice値により値が決まる) |
| sleep_avg | プロセスのSleep量を表す値(0〜NS_MAX_SLEEP_AVG)。 動的優先度の計算に使用される。sleep_avgが大きい程、動的優先度が小さくなる。 |
| timestamp | 以下のタイミングで時間が記録される ・RunqueueのActiveリストにつながれたとき ・コンテキスイッチされた時 ・スケジューラで実行プロセスに選ばれた時 |
| activated | プロセスがどのようにWakeupされたかを示す。schedule()で実行プロセスに選ばれると0にクリアされる。このため!=0の場合、Wakeupされたがまだ実行はされていないことを示す。スケジューリングのパラメータの調整に使用されている。 -1:TASK_UNINTERRUPTIBLE状態からWakeupされた。 1:通常コンテキストからWakeupされた 2:割り込みコンテキストからWakeupされた |
| time_slice | 残りのCPU時間(jiffies) CPUを使っているとscheduler_tick()で減算されていき、0になると Runqueueのactiveリストからexpireリストに移動される。(activeのままでいる場合もある) nice値(static_prioと同義)から以下の値に初期設定される。 (優先度が高い程、割り当て時間が長くなる) nice値 -20 19 p->static_prio 100 ... 139 p->time_slice 200ms ... 5ms task_timeslice()でnice値をtime_slice値に変換している。 |
| mm | プロセスのアドレス空間 カーネルプロセスの場合は、ユーザアドレス空間を持たないのでNULL。 |
| active_mm | Active(実際にCR3に設定されて動作中)なアドレス空間。ユーザプロセスにおいてはtask->mmと同じものを指す。 カーネルプロセス等のようにアドレス空間を持たない(task->mm==NULL)プロセスの場合は、TLB Flushを最小限にするため、前のプロセスのアドレス空間をそのまま引き継ぐ(前のプロセスのactive_mmがcurrent->active_mmとなっている)。 もしcurrent->active_mm == NULLなら、なにかがおかしい。カレントのプロセスは、カーネルスレッド(current->mm == NULL)であったとしても、正しいtask->active_mmを常に持っていなければならない。 |
union thread_union {
struct thread_info thread_info;
unsigned long stack[THREAD_SIZE/sizeof(long)];
};
thread_union
+------------+ task_struct
|thread_info | --> +-------+
| | | |
+------------+ +-------+
| |
: <-esp
| | KernelStack先頭
+------------+