2011年8月16日火曜日

kthreadd

kthreaddはカーネルスレッド・デーモンです。Linux kernelは、起動すると2つのスレッドを起こします。一つがinitプロセスを起動するためのkernel_initで、もう一つがこのkthreaddだったと思います(他には無かったと思う)。

カーネルは、今まさにやらなければならない仕事をこなしているわけですが、やっぱりどこかCPUがあいた時にでもやればいいような仕事もあるわけです。そんな時に、カーネル・スレッドが使われます。

で、このカーネルスレッド、psコマンドで表示されることからなんとなく想像できるかと思いますが、一般のプロセスと同じプロセス情報を持っています。なぜかというと、カーネルスレッドのスケジューリングは、一般のプロセスと同じようにスケジューリングされているようなのです。

ところで、先日の日記では、kthreaddの下に子プロセスが複数いましたね。実はこれこそが、kthreaddのお仕事のようです。
先ほど、CPUが空いた時に行えば良い事をカーネルスレッドにやらせると言いましたが、後回しで良い処理のためにプロセス情報の初期化やスケジューラへの登録(これはつまり再スケジューリングの契機になる?)なんていう重たい処理が走るのは嫌なので、Kernelにおけるスレッドの生成は、何をスレッドとするのかの最低限の情報をリストに追加するだけにとどめ、kthreaddが後からそのリストを読み、必要なプロセス情報の初期化、スケジュールへの登録などの作業を行うわけですね。

0 件のコメント:

コメントを投稿