誰かが説明できますこのプログラムはいくつの子プロセスを作成しますか? 答えは127ですが、どうやって得たのか分かりませんでした。入れ子にされたループ内のフォーク
int create(int num){
int i;
for(i=0;i<num;i++)
fork();
}
int main() {
int i;
fork();
for(i=0;i<4;i++)
create(i);
return 0;
}
誰かが説明できますこのプログラムはいくつの子プロセスを作成しますか? 答えは127ですが、どうやって得たのか分かりませんでした。入れ子にされたループ内のフォーク
int create(int num){
int i;
for(i=0;i<num;i++)
fork();
}
int main() {
int i;
fork();
for(i=0;i<4;i++)
create(i);
return 0;
}
これは本当にオペレーティングシステム上のクラスの宿題のようですが、面白い問題ですので、私はあなたに答えます。まず、コードを次のように見てみましょう。機能的には、それは同じことですが、消化するのが少し楽になります。また、開始するには、その最初のfork()
呼び出しを無視してみましょう。そこに存在しない場合はいくつあるのかを数えます。それを元に戻すと、同じ量のプロセスが2回になります。
int main() {
int i, j;
// fork();
for (i = 0; i < 4; i++) {
for (j = 0; j < i; j++) {
fork();
}
}
}
これは部分的には数学の問題であり、一部はプログラミング上の問題です。まず、fork()
に電話するとどうなるかを理解する必要があります。子プロセスを作成すると、子は、fork()
呼び出しが行われた時点の変数の現在の値で、すべての親変数のコピーを継承します。つまり、親と子はまったく同じ値の同じ変数のコピーを持っていますが、それらの変数を個別に変更することができ、互いに影響しません。それでは、次の簡単な例では、両親の世界では
int main() {
int i = 0, pid = fork();
if (pid == 0) {
i = 1;
}
if (pid > 0) {
i = 2;
}
}
、i
は値2を取得し、子供の世界i
に値1を取得し、これらは私たちが話している今、別の変数であります親はそれが望むものを持つことができ、子供は望みのものを持つことができ、葛藤せず、誰もが幸せです。
あなたの問題に答えるには、これを念頭に置く必要があります。それで、最初にfork()
呼び出しをしていないプロセスがいくつあるかを見てみましょう。さて、親自体は6子プロセスを生成します。これらのプロセスのそれぞれについて、変数(i,j)
は、値(1,0)、(2,0)、(2,1)、(3,0)、(3,1)、および(3,2)をそれぞれ有する。 。
したがって、(3,2)で生成された最後の子はループを終了し、それ以上子を生成しません。 (3,1)で生成された子は、forループを続行し、j
をインクリメントし、別のプロセスを生成し、両方の子は(3,2)に(i,j)
を表示し、forループを終了してから終了します。それから、私たちは別の子を(3,0)で親から産んだ。今、この子はforループを続け、(3,1)と(3,2)に子を産んだ後に死ぬと、(3,1)で産まれたこの新しい子は別の子を産み、次に死ぬでしょう。私はこれがかなり複雑になってきているのが分かると思いますので、次のグラフを使ってこの状況を表すことができます。
グラフの各頂点はプロセスを表し、頂点標識pは親プロセスです。各エッジの順序付けられたペアは、子プロセスが生成された時点の(i,j)
の値を表します。プロセスをグループ化する方法に注目してください。その最初のグループでは、1つのプロセスがあり、次に、2つ、次の4つ、そして8つのプロセスがあります。次のグループには16のプロセスがあり、次のグループには32のグループが割り当てられます。したがって、親を含むすべてのプロセスを数えれば64プロセスがあります。これまでのところ理にかなっている?
ここで、最初にfork()
コールバックを入れてみましょう。これは、今まで説明したのと全く同じ状況が2回発生する原因となります。これは、親を含む合計128プロセスになります。つまり、子供。
だから、半分の数学の問題、半分のプログラミングの問題。あなたの質問を教えてください。
最初のループをfor (i = 1; i <= n; i++)
に書き換えることができます。それで、私は一般的にあなたの親プロセスが子供を産んだと言うことができると確信しています。