2011年1月25日火曜日

kthreadd

相変わらず、次回勉強会へ向けての資料の下書きメモ。
今日は脱線コーナー

initから先の勉強の時点で、Androidのエミュレータにadb shellでつないだ上でpsした時のプロセスをtreeにした際に、kthreaddはカーネルのお話だからとすっ飛ばしていたら、日曜夜22時からのUst講座「V7から始めるUNIX講座」において、 生徒の@pakuqiさんが講師の@magoroku15 先生 に「PPIDが0のプロセスがいるんですが」なんてkthreaddの質問をしていてタイムリーだなぁと思ってしまいました。まぁ、先日の講座はV7におけるinitのお話で、質問はUbuntuに関してでしたので、同じところに行き着くわけですが。

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

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

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

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

とまぁ、偉そうに知ったかぶりな日記を書きましたが、隠者自身はここ最近この辺のコードを追いかけていません。仕事的にもカーネルのコード読みなんかはしないので、例によってただの趣味でちらちら見てた人です。こちらの情報は間違ってるとか、実はそうではないんだなという情報をお持ちの方は是非 twitterで@hermit4 までご教授下さい。

0 件のコメント:

コメントを投稿