task_struct 構造体
find-grep してみたら代入されてる定数は
- TASK_ZOMBIE
- TASK_RUNNING
- TASK_INTERRUPTIBLE
- TASK_UNINTERRUPTIBLE
らしい。
ちなみに上記マクロが定義されている include/linux/sched.h な関連マクロを以下に引用。
#define NR_TASKS 64 #define HZ 100 #define FIRST_TASK task[0] #define LAST_TASK task[NR_TASKS-1]
あるいは以下。
#define TASK_RUNNING 0 #define TASK_INTERRUPTIBLE 1 #define TASK_UNINTERRUPTIBLE 2 #define TASK_ZOMBIE 3 #define TASK_STOPPED 4
TASK_STOPPED は使われていないですね。あと INIT_TASK マクロの下らへんで task 配列が定義されてます。
extern struct task_struct *task[NR_TASKS]; extern struct task_struct *last_task_used_math; extern struct task_struct *current;
あ、これ extern な宣言だ。本体というか領域の確保 (変数の定義) は kernel/sched.c で以下。
struct task_struct *current = &(init_task.task), *last_task_used_math = NULL; struct task_struct * task[NR_TASKS] = {&(init_task.task), };
ええと、手元にある_実習Linuxカーネル_によると
スケジューラとは、様々なシステムコールから呼び出されるカーネル関数 schedule() である (通常は sleep_on() を介して呼び出される。
という記述があります。sleep_on() はひら停止状態な訳です。実装な記述が以下。
void sleep_on(struct task_struct **p) { struct task_struct *tmp; if (!p) return; if (current == &(init_task.task)) panic("task[0] trying to sleep"); tmp = *p; *p = current; current->state = TASK_UNINTERRUPTIBLE; schedule(); if (tmp) tmp->state=0; }
引数で渡されるのは基本的に task_struct 構造体ポインタ変数のアドレスらしい。
sleep_on(&bh->b_wait);
b_wait が指してるナニを云々してます。
- 渡した struct task_struct 型な領域は tmp に一旦格納
- current なソレが引数である bh->b_wait から参照される形になる
- current (および bh->b_wait) の state 属性が TASK_UNINTERRUPTIBLE になる
- schedule() される
- ここで何が起きるかは不明ですが、少なくとも TASK_UNINTERRUPTIBLE になった current は実行対象にはならないはず
- tmp (呼び出し時に渡された struct task_struct 型な領域) が NULL でなければ state 属性に TASK_RUNNING を格納
- 次の schedule() で動きはじめるかも?
今から
体力の続く限り Hadoop 本を読みます。別件対応で本当に疲れましたorz