質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

Q&A

4回答

6636閲覧

プロセス管理の子プロセスとか親プロセスについて

退会済みユーザー

退会済みユーザー

総合スコア0

C

C言語は、1972年にAT&Tベル研究所の、デニス・リッチーが主体となって作成したプログラミング言語です。 B言語の後継言語として開発されたことからC言語と命名。そのため、表記法などはB言語やALGOLに近いとされています。 Cの拡張版であるC++言語とともに、現在世界中でもっとも普及されているプログラミング言語です。

OS

OS(オペレーティングシステム)は、システムソフトウェアの一種であり、一般的に、ハードウェアを直接的に管理・操作する最も中心的な機能を有するソフトウェアがオペレーティングシステムとして呼ばれます。

Linux

Linuxは、Unixをベースにして開発されたオペレーティングシステムです。日本では「リナックス」と呼ばれています。 主にWebサーバやDNSサーバ、イントラネットなどのサーバ用OSとして利用されています。 上位500のスーパーコンピュータの90%以上はLinuxを使用しています。 携帯端末用のプラットフォームAndroidは、Linuxカーネル上に構築されています。

0グッド

0クリップ

投稿2016/10/06 16:25

プロセスについて勉強しているのですが、子プロセスとか親プロセスとか具体的にどういうことを言っているのか理解できません。

親プロセスからforkして子プロセスができ、それが親プロセスと同等のものであるというのはなんとなく分かります。

例えばプロセスとはChromeを起動したら、Chromeのプロセスが走ると思います。この時のプロセスは親プロセスだと認識しています。ここで子プロセスを生成するとなった場合、Chrome側ではどういう操作を行ったのでしょうか?

これも例ですが、C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答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
popobot

総合スコア6586

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

タグにLinuxとあるのでLinux限定のつもりで書きます。

例えばプロセスとはChromeを起動したら、Chromeのプロセスが走ると思います。この時のプロセスは親プロセスだと認識しています。

「親プロセス」とはあくまで子プロセスを生成して初めてなれるものなので、起動しただけでは親プロセスではないです。
むしろ起動したプログラムは「子プロセス」です。
何の子プロセスかというと、シェルから起動したのならそのシェルの子プロセス、デーモンであればinitプロセスの子プロセスです。

子プロセスを生成するとなった場合、Chrome側ではどういう操作を行ったのでしょうか?

単純に言えば、「プログラムを起動する(プロセスを生成する)」となります。

C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?

C言語の話でいえば、"fork"関数が実行されてはじめて子プロセスの生成と言えます。
「処理を繰り返す」が何かしらの処理をループで複数回実行する、という事であれば子プロセスの生成はしていないという事になります。

psコマンドを実行すれば自分のPID、親プロセスのPIDが表示されます。
これをたどっていけば自分の親プロセスが何であるのか、さらにその親は…と遡れます。

投稿2016/10/06 23:32

ynakano

総合スコア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
rubato6809

総合スコア1380

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

0

C言語の部分に関してです

親プロセスからforkして子プロセスができ、それが親プロセスと同等のものであるというのはなんとなく分かります。

C言語でフォークするは、その時点の自プロセスが複製され、複製された子プロセスでも同じ場所からプログラムの実行が始まります。実行はサブミットなので、起動後にメモリの共有はできません。

これも例ですが、C言語の一つ処理があり、この処理を何度か繰り返したいので、子プロセスを生成しているということなのでしょうか?

繰り返しフォークすると、子プロセスがその分起動します。並列処理を行う場合に使えます。

投稿2016/10/07 16:41

編集2016/10/07 16:46
A.Ichi

総合スコア4070

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問