プロセスについて勉強しているのですが、子プロセスとか親プロセスとか具体的にどういうことを言っているのか理解できません。
親プロセスからforkして子プロセスができ、それが親プロセスと同等のものであるというのはなんとなく分かります。
例えばプロセスとはChromeを起動したら、Chromeのプロセスが走ると思います。この時のプロセスは親プロセスだと認識しています。ここで子プロセスを生成するとなった場合、Chrome側ではどういう操作を行ったのでしょうか?
これも例ですが、C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答4件
0
自分はC言語はそんなに詳しくないのですが、OSの観点からプロセスがなんなのかちょっと説明してみます。
Linuxのpsコマンドを実行するとプロセスの一覧を見ることができます
$ ps -f UID PID PPID C STIME TTY TIME CMD icchii 5210 5209 0 06:24 pts/19 00:00:00 -bash icchii 6102 5210 0 07:01 pts/19 00:00:00 ps -f
※たぶん、上記のような結果が出力されますが、PIDはプロセスのIDです。PPIDは親プロセスのIDです。CMDは実行されているプログラムです。
端末にログインしているのでbashが動いています。そしてpsコマンドを実行したので、bashの子プロセスとしてpsのプロセスが動いていることがわかります。
次にsleepコマンドをバックグランド実行して、psで見てみてください
$ sleep 10 & $ ps -f UID PID PPID C STIME TTY TIME CMD icchii 5210 5209 0 06:24 pts/19 00:00:00 -bash icchii 6118 5210 0 07:05 pts/19 00:00:00 sleep 10 icchii 6119 5210 0 07:05 pts/19 00:00:00 ps -f
※sleepコマンドがプロセスとして実行しているのが見えると思います。親プロセスはbashです。10秒立つとコマンドが終了して、プロセスは消えます。
次に、すべてのプロセスを見てみてください。大量に表示されると思います。
$ ps -ef
pstreeコマンドを実行すると、親子関係が表示されます。
$ pstree
すべてのプロセスは親、子、孫とつながっている様子がわかると思います。
プロセスとは「実行中のプログラム」です。プロセスは親プロセスから生まれて(この時forkされています)、処理が終われば消えます。
うまく説明できたかわかりませんが、参考になれば幸いです。
おまけ
/procの配下に起動中のプロセスはディレクトリができ、中をみるとコマンドやアクセスしているファイルなどが見えます。興味があったら見てみてください。
$ ls /proc
投稿2016/10/06 22:09
編集2016/10/06 23:37総合スコア6586
0
タグにLinuxとあるのでLinux限定のつもりで書きます。
例えばプロセスとはChromeを起動したら、Chromeのプロセスが走ると思います。この時のプロセスは親プロセスだと認識しています。
「親プロセス」とはあくまで子プロセスを生成して初めてなれるものなので、起動しただけでは親プロセスではないです。
むしろ起動したプログラムは「子プロセス」です。
何の子プロセスかというと、シェルから起動したのならそのシェルの子プロセス、デーモンであればinitプロセスの子プロセスです。
子プロセスを生成するとなった場合、Chrome側ではどういう操作を行ったのでしょうか?
単純に言えば、「プログラムを起動する(プロセスを生成する)」となります。
C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?
C言語の話でいえば、"fork"関数が実行されてはじめて子プロセスの生成と言えます。
「処理を繰り返す」が何かしらの処理をループで複数回実行する、という事であれば子プロセスの生成はしていないという事になります。
psコマンドを実行すれば自分のPID、親プロセスのPIDが表示されます。
これをたどっていけば自分の親プロセスが何であるのか、さらにその親は…と遡れます。
投稿2016/10/06 23:32
総合スコア1894
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
試しに、Chromeを起動しておき、コンソールで、ps ax | grep chrome | wc -l
とタイプして、chromeプロセス数の増減を見てみました。新しくタブを開き、どこかページを表示するとchromeプロセスが増えるので、ひとつのタブを、ひとつのchromeプロセスが担当していると推測できます。
さて、Cで書いたソースコードをコンパイルすると、実行形式のファイル、即ちプログラムができます。プログラムは「一連の命令列」がファイルになったものですね。でも、「プログラム=プロセスそのもの」とは言えません。プログラムが「動作できる・動作している状態」がプロセスです。
"Hello, World\n" は誰が何時実行しても、常に同じ出力をしますが、プログラムが常に同じ出力(振る舞い)をするのは例外的です。chromeプログラムがタブ毎に違うページを表示するように、同一のプログラムが動作するたびに異なる振る舞いをするのが普通です。なぜなら、動作の都度、変数(データ)の値が異なるからです。
親プロセス・子プロセスと呼ぶ事自体がプロセスの擬人化ですが、一つのプロセスは、意思を持った1人の人間のように振る舞います。それができるのは、プロセスが、それぞれ固有のデータ領域を持っているからに他なりません。大まかですが、プロセスを構成するのは二種類のメモリ領域です。
- プログラム領域(一連の命令列)
- データ領域(各種変数、スタック等。CPUレジスタの値もデータ)
プログラムが fork()システムコールを呼んだ箇所で子プロセスが生まれます。fork()はシステムコールですから、その作業を実際に行うのはOSのカーネル内部です。OSは、新たに生まれる子プロセス用に、データ領域となるメモリを割り当ててくれます。それがプロセスの生成には必要不可欠なのです(念の為:この時点でプログラムは既にメモリ上にある)。
しかも、OSは、親プロセスのメモリ領域の内容を、子プロセスのメモリ領域にコピーしてくれます。スタック上の情報も含めて、変数の値が全て同じという事を意味します。
ただし、親と子では fork()の戻り値だけが異なります。子には0が返り、親には子プロセスのプロセス番号が返ります。殆ど同じプロセスが二つ存在することになるので、fork()は分身の術です。
ここで子プロセスを生成するとなった場合、Chrome側ではどういう操作を行ったのでしょうか?
プログラムがfork()を呼ぶ箇所を単純化すると次のようなコードになります。chromeにもfork()する箇所があるはずです、ただし execve()しない可能性があるわけですが。
C
1 /* ここまで親プロセスだけが走ってきて */ 2 id = fork(); /* ここで親子に分かれる */ 3 if (id == 0) { 4 /* こちらを走るのは子プロセス。新たなプログラムに変身する事が多い 5 * chromeはexecしないかも 6 */ 7 execve(新しいプログラム名, コマンドライン引数の配列, 環境変数の配列); 8 } else { 9 /* こちらを走るのは親プロセス */ 10 /* wait() で子プロセスの終了を待つのは、ひとつのパターン */ 11 }
fork()の戻り値を見て、プロセスは自分自身が親なのか子なのか判断し、別人格のごとく、その後の振る舞いが違ってきます。同じプログラムのまま、それぞれが異なる振る舞いをするケースもあります(多分、chromeのタブは、このパターン)が、一般的には、子プロセスは直後に execve()等のシステムコールを呼び、別のプログラムが動作開始するパターンが多いと思います。shellのコマンドラインからプログラムを実行するのも、ランチャー(launcher)で起動するのも、そうです。
exec??()は変身の術です(何種類かある)。指定されたプログラムをメモリにロードし、先頭から動作開始できるように、引数やデータ領域をセットしなおしてくれるのでしょう…という事を踏まえて、fork()とexec??()周りを調べてみればよいと思います。
C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?
処理によりけりだと思います。具体的な処理内容、要件、さらには実装上の都合などでも変わってくるのではないですか。
繰返しは普通ループで実現します。1人の人が作業を繰り返すイメージです。これで済むケースは沢山あるわけです。
一方、fork()するということは、プロセスを増やすという事であり、処理手順を知ってる人を増やすイメージで捉えられます。銀行の窓口担当者を増やせば、多くのお客様を捌けるのに似ています。また、chromeのタブは、タブ毎に異なるページを表示するだけでなく、その履歴も管理します。プロセス毎にデータ領域を持つからです。これもプロセスを増やすメリットを理解するヒントだと思います。
投稿2016/10/08 03:34
編集2016/10/08 04:16総合スコア1380
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
0
C言語の部分に関してです
親プロセスからforkして子プロセスができ、それが親プロセスと同等のものであるというのはなんとなく分かります。
C言語でフォークするは、その時点の自プロセスが複製され、複製された子プロセスでも同じ場所からプログラムの実行が始まります。実行はサブミットなので、起動後にメモリの共有はできません。
これも例ですが、C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?
繰り返しフォークすると、子プロセスがその分起動します。並列処理を行う場合に使えます。
投稿2016/10/07 16:41
編集2016/10/07 16:46総合スコア4070
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。