Monaにおけるプロセス・スレッド

Monaにおけるプロセス・スレッドに関して質問されたときのログをなんとなく公開。
というわけでMr.X氏がstdin/outをやる気になってくれたかも。

23:03 (Mr.X) stdin/outをやろうかと思ってるんですが
23:03 (Mr.X) プロセス関連が不明瞭
23:03 (Mr.X) プロセスとスレッドの関係は
23:04 (Mr.X) プロセス1に対してスレッドが0以上?
23:05 (higepon) プロセスはスレッドが使う環境、スレッドが実行単位。1つのプロセスに1つ以上のスレッドが存在です。
23:05 (higepon) 同じプロセスに属するスレッドはメモリを共有しています。
23:05 (Mr.X) でも、プロセスのみのものがない?
23:05 (higepon) ないです。
23:05 (Mr.X) スレッドなし
23:06 (Mr.X) monamainは、スレッドにマップ?
23:07 (higepon) monamainはメインスレッドという扱いですね。
23:07 (Mr.X) じゃ、tidを持つわけね
23:07 (higepon) はい。
23:08 (Mr.X) ふむ
23:08 (Mr.X) プロセスを作るのはプロセスサーバであってますか?
23:08 (higepon) 最終的にはカーネルが作りますが、プロセスサーバで作るといっても間違いではないです。
23:09 (higepon) プロセスサーバーは
23:09 (Mr.X) プロセスの初期状態は、プロセス(環境)とメインスレッド(monamain)が
23:09 (Mr.X) ある状態?
23:09 (higepon) はい。
23:10 (higepon) そのとおりです。
23:10 (Mr.X) プロセス構造体作って、スレッドを一個登録するまでがプロセスサーバの仕事ですかね
23:11 (higepon) きちんと踏み込んで説明した方がよいと思ってきた。
23:11 (higepon) しばしお待ちください。
23:11 (Mr.X) あとは、スケジューラがスレッドを選択したら、プロセスがRunになると
23:12 (higepon) Monaでプロセスが起動するまでを説明してもよいですか?
23:12 (Mr.X) いいですよ
23:12 (higepon) 疑問は適宜つっこみをば
23:13 (higepon) 1.シェルにHELLO.EXEと書かれてEnter
23:13 (higepon) 2.シェルはプロセスサーバに実行してくれとお願い
23:13 (Mr.X) ここでいうシェルはルートプロセス?
23:14 (higepon) ルートのようなLinux的なツリー構造はないです。
23:14 (higepon) シェル=Shell Serverです。
23:14 (higepon) (ユーザプロセス)
23:14 (Mr.X) プロセスに親ってなかったんだっけ?
23:14 (higepon) カーネル内部処理的にはありません。
23:15 (higepon) ここまではよいでしょうか。
23:15 (Mr.X) あるのは、プロセス内のスレッドの親子関係のみね
23:15 (Mr.X) OK
23:15 (higepon) はい。
23:15 (higepon) 3.ファイルサーバは共有メモリ経由でプロセスサーバにファイルの中身を渡します。
23:16 (Mr.X) ファイルをそのものをメモリ上にマッピングという理解でいい?
23:16 (higepon) はい。ちなみにこの時点ではカーネルは一切関与していないです。
23:17 (Mr.X) 関与というのはシステムコールは発行されてないということですよね
23:17 (higepon) です。
23:17 (higepon) 全部ユーザープロセス間でのやりとりです。
23:18 (higepon) 4.ファイルの形式(ELF/PE)などに応じてELF/PEサーバーがファイルの中身を実行可能なようにつぎはぎします
23:19 (higepon) 5.プロセスサーバはsyscall_load_process_image(&info);(システムコール)に実行可能なイメージを渡してcallします。
23:19 (higepon) 6.ここからカーネルに処理が遷移
23:19 (Mr.X) ストップ
23:19 (higepon) はい
23:20 (Mr.X) 実行可能なイメージとは
23:20 (Mr.X) さっきのファイルをメモリにマッピングしたのと、ELF/PEの解析した結果?
23:20 (higepon) です。
23:20 (Mr.X) OK
23:22 (higepon) 7.カーネルはプロセスの構造体(主にメモリ周りの初期化)をつくり、スレッドの構造体(HELLO.EXEのmonamain関数をエントリポイントとするスレッド)を作ります。
23:22 (higepon) 補足説明
23:23 (higepon) プロセス構造体にはpid, プロセスの名前,自分が持っているスレッドの情報などがあります。
23:23 (higepon) スレッド構造体には実行に必要なレジスタ情報や、今どこを実行中かなどの情報があります。
23:23 (higepon) 8.スケジューラのキューにスレッドを追加して、実行可能状態にします。
23:24 (higepon) ここまでは良いでしょうか。
23:24 (Mr.X) k
23:24 (Mr.X) プロセスは、親子関係はないのは、わかりましたが
23:24 (higepon) はい。
23:24 (Mr.X) プロセス間通信をしたい場合、
23:25 (Mr.X) 何を目印に通信?
23:25 (higepon) プロセス名。スレッド名が目印です(ぉ
23:26 (Mr.X) 名前でいけるのか
23:26 (Mr.X) スレッド名ってどうやってつけてたっけ
23:26 (higepon) ファイル名ですね。
23:27 (Mr.X) スレッドって関数を指定して起動してなかったっけ?
23:27 (higepon) そこがMonaのいい加減なところで
23:27 (higepon) HELLO.EXEがmainスレッドも含めて
23:27 (Mr.X) ファイル名はプロセス名じゃないの?
23:27 (higepon) 3つのスレッドを作ったとすると
23:27 (higepon) どれもHELLO.EXE
23:28 (higepon) なのでlookupMainThreadで得たtid(スレッドID)
23:28 (Mr.X) ふむ
23:28 (Mr.X) 危険だ
23:28 (higepon) にプラスいくつかすると、サブのスレッドのIDになるという
23:28 (higepon) 極悪仕様
23:28 (higepon) 続きがあって(ここがややこしい)
23:28 (Mr.X) スレッドって、プロセス内に閉じた番号体系?
23:29 (higepon) グローバルかな?
23:29 (higepon) 忘れた。
23:29 (Mr.X) いくつかプラスってダメじゃん
23:29 (higepon) 同一プロセスのスレッド間で通信することはあまりないので
23:30 (higepon) 今のところ困った事態にはなっていないですね。(それが良い状態とはいいませんが)
23:30 (Mr.X) 普通(?)同一プロセス内スレッド同士で通信すると思う
23:30 (Mr.X) まぁ、それはいいとして
23:31 (higepon) 忘れないうちに続きを!
23:31 (Mr.X) プロセスは、環境変数が集まってるだけで
23:31 (Mr.X) 実行主体はスレッドな分けですね
23:31 (Mr.X) はい、続きどうぞ
23:31 (higepon) プロセスに親子関係はないといいましたが、
23:32 (higepon) カーネルにはありませんが、プロセスサーバーがプロセスサーバー内にそういう情報を保持しています。
23:32 (higepon) つまり
23:32 (Mr.X) つまり、あるんじゃん
23:32 (higepon) プロセスの情報がカーネル内・ユーザー内に分散している。
23:32 (higepon) ついでに
23:32 (higepon) プロセスサーバ起動したもののみ
23:32 (higepon) 親子関係があります。
23:32 (higepon) syscall_process_xxxを呼べば
23:32 (higepon) 誰でもプロセス作れるw
23:33 (Mr.X) プロセスサーバが?プロセスサーバを?<起動
23:33 (higepon) プロセスサーバーは確かカーネルだか初期のサーバーに起動されるはず
23:33 (Mr.X) syscall_process_xxxは、pidって返らないんでしたっけ?
23:34 (higepon) 返らないかも
23:34 (Mr.X) 自分の親もわからないと
23:34 (higepon) 分からないですね。
23:34 (higepon) でもまぁ
23:34 (Mr.X) プロセスサーバに依頼したら、プロセスサーバ内にツリーはのこるってわけですね
23:34 (higepon) シェルから起動すれば自動的に親子関係が残ります。
23:34 (higepon) そうですね。
23:34 (Mr.X) シェル内にものこるの?
23:35 (higepon) 残らないです。
23:35 (Mr.X) それとも、シェルは、プロセスサーバに依頼するから、残るって事?
23:35 (higepon) そうです
23:36 (Mr.X) プロセスダウンは、プロセス内スレッドの全ダウン?
23:36 (Mr.X) それとも、メインスレッドの終了がプロセスダウン?
23:36 (higepon) カーネルダウン以外でプロセスダウンという概念はないかも。
23:36 (higepon) 全スレッドが終了したらプロセスも掃除される。(はず
23:37 (Mr.X) ダウンというか、終了
23:37 (Mr.X) スレッドは終了したら、プロセス内のスレッドリストからはずされる?
23:37 (higepon) たぶん。
23:38 (Mr.X) スレッドリストが空になったら、プロセス終了ってことですね
23:38 (higepon) 大雑把に言うとそうですね。
23:39 (Mr.X) システムコールで行われるのは、プロセス空間の用意くらい?
23:39 (higepon) 大体そんな感じです。
23:39 (Mr.X) ふむ
23:39 (Mr.X) 大体理解できた
23:40 (Mr.X) まずは、親子関係からかなぁ