task_struct 構造体 (2)

プロセス・ディスクリプタである struct task_struct 型について属性について掘削してみます。なんか昨晩のエントリ見たら主語が略されてる部分があるので先頭の属性から再度って事で。

属性掘削

state 属性
  • -1 が unrunnable
  • 0 が runnable
  • >0 が stopped

との事。0.01 では bit の on/off ではなくて値で切り分けているみたいです。

counter 属性

ええと、schedule() 手続きにてこの属性を使って云々してる箇所がある。末端部分です。以下。

/* this is the scheduler proper: */

	while (1) {
		c = -1;
		next = 0;
		i = NR_TASKS;
		p = &task[NR_TASKS];
		while (--i) {
			if (!*--p)
				continue;
			if ((*p)->state == TASK_RUNNING && (*p)->counter > c)
				c = (*p)->counter, next = i;
		}
		if (c) break;
		for(p = &LAST_TASK ; p > &FIRST_TASK ; --p)
			if (*p)
				(*p)->counter = ((*p)->counter >> 1) +
						(*p)->priority;
	}
	switch_to(next);

中の while は task 配列を全部ナメてるのかなぁ。
で、c が 0 以外だったらループを出て switch_to() 手続きを呼びだしているのか。next は counter 属性がいっちゃんでっかい要素の添字になるのかな。
ちなみにそうではない場合、再度末端からナメてるように見えます。priority 属性な値を加算して再度 next を云々しているみたいに見えます。
ええと手元の資料 (Linux カーネル 2.4 の設計と実装) によれば schedule() は

プロセススケジューラ本体。最も優先度の高いプロセスを選び、そのプロセスに実行権を与える。


との記述がある。counter がいっちゃんでっかいのが優先度がいっちゃん高い、って事なのかな。

priority 属性

これもあまり使われてない。用途としては

  • counter 属性の初期値
  • sys_nice() 手続きで値が設定される
  • schedule() 手続きで counter 属性の値の再設定の材料として使われる

ちょっと counter とカブッてますね。

signal 属性

long 型。signal 関連って事で以下が一蓮托生なのかな。

	long signal;
	fn_ptr sig_restorer;
	fn_ptr sig_fn[32];

sys_signal() で上記属性を云々してます。restorer って謎なんですが、このあたりはシステムコールのあたりをなんとかしないと分からないのかな。

とりあえず

どうするべきか悩ましいんですが、task_struct の属性について、なんとなく掘削してみて system call 方面に去った方が良いような気がしてます。