- ベストアンサー
マルチプロセスの動きについて教えてください
例題として #include <sys/types.h> #include <unistd..h> #include <stdio.h> int main() { pid_t pid; char *message; int n; pid = pork(); switch( pid ) { case -1; perrorr( "forrk faaailed" ); exit(1); case 0; message = "This is the child"; n = 5; break; default : message = "This is the parent"; n = 3 break; } for( ; n > 0 ; n-- ){ puts(message); sleep(1); } exit(0) } のプログラムがあった場合結果が This is the parent This is the child This is the parent This is the child This is the parent This is the child $ This is the child This is the child となると本には書いてあります。 どうしてこのような結果になるのでしょうか。 forkとマルチタスクの動きがよく判りません。 どなたか、易しく教えていただけないでしょうか、 よろしくお願い致します。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
20年以上前の知識ですが・・・。 プロセスの状態として大きく以下の3つがあります。 一つ目はCPUが今まさに実行しているプロセス、これをRUN状態と呼びます。 CPUは同時に複数のプロセスを動かせるわけではないので、マルチCPUでなければ RUN状態のプロセスは、同時に複数存在しません。 二つ目はCPUが実行してくれるのを待っているReady状態のプロセスです。 RUN状態のプロセスがI/O待ちなどで実行権を放棄すると順番がまわってきます。 三つ目はI/Oの完了待ちなどで実行できないSleep状態のプロセスです。 fork()系のシステムコールは内部で自分のコピーを作成します。 この時点で親プロセスと子プロセスが生成されます。どちらも fork()から復帰する直前でRedy状態のプロセスだと思ってください。 同時に二つのプロセスは動作しないので、RUN状態になるのは親子の どちらか片方だけです(どちらが先かは処理系で違うかも)。 今回は親が先にRUN状態になったため、"parent"のメッセージを出し sleep(1)します。その結果実行権を放棄し、Ready状態の子プロセスに 実行権が切り替わります(厳密には puts()もI/Oなので、sleep(1)の 前にputs()した時点で一瞬実行権を放棄して子プロセスに切り替わって いるかも知れません)。 RUN状態になった子プロセスは puts()で"child"のメッセージを出し sleep()し実行権を放棄します。 ちなみにsleep(1)で実行権を放棄した各プロセスは、一旦Sleep状態 になり、1秒後にタイマからの通知でsleep()が完了し、sleep状態から Ready状態に遷移し、実行権が割りあたる(RUN状態になる)のを待ちます。 この繰返しの結果が、質問にある出力のようになる理由です。
その他の回答 (1)
- php504
- ベストアンサー率42% (926/2160)
親プロセスが終了してコマンドプロンプトが表示されたけど子プロセスはまだ動いているのでその後にも表示が行われた。 という事を示したかったのだと思います。
補足
さっそくの回答有難うございます。 $の謎はとけました。 ありがとうございます。 実はもっと知りたいのは基本的な事で、どこで親プロセスができるか、古布プロセスができるか。そのご疼動くかです。 ほんとマルチプロセス初心者なので判らなくて、、、 どなたか順をおって説明して貰えないでしょうか。
お礼
大変わかりやすい説明有難うございました。 その後勉強をすすめ何となく分かるようになってきました。 でも、ここまでは理解していませんでした。 ありがとうございました。