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