Re: [理工] [OS] 迴圈中的fork
※ 引述《yyc1217 (somo)》之銘言:
: 要計算create出幾個process
: for(i=0;i<3;i++)
: {
: if(fork()==0) /*A*/
: {
: fork(); /*B*/
: fork(); /*C*/
: fork(); /*D*/
: }
: }
: 答案是729
: 書上是寫9+9*8+(9+9*8)*8
: 請問有人可以解釋這式子是怎麼來的嗎= =
: 因為我一直覺得有ABCD四個fork,至少一開始應該會是四的倍數
: 如果只看9的話,應該就是迴圈中的BCD 3次,但A不是也算一次嗎?
: 謝謝!
你先看這題
int main()
{
fork();
fork();
fork();
}
包含main本身 結束後共有8個
如果不包含main本身 也就是多產生出來的process數 是7
再來看你原本的題目
在main第一次進入 (i=0時候)
if(fork()==0)
時候的瞬間 此時就算呼叫fork一次了
此時會有原本的main 跟 main產生的兒子1號
因為main的fork回傳值會是>0 所以不會進入三fork();
但是兒子fork是0 會進入
所以 兒子1號就進入了 三fork();
如前述所講 兒子1號 經過三fork會產生出7個兒子
就當作是 兒子2號~~~兒子8號吧
此時 i++;
main本身 跟 兒子1號~兒子8號 共九個人
都當i=1世代的 新爸爸
回憶一下
一開始i=0的時候
"一個"原始的main 一輪結束後 最後多了八個人
同理 這次i=1每位新爸爸 一輪結束後 都可以多出八個人
所以 就又多出了 9x8
↑九個當父親
依此類推
又 i=2 多出了
[9+(9x8)]x8
^^^^^^^^^
↑ 框框內的數字 都當父親
所以答案是 9 + 9x8 + [9+(9x8)]x8
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 140.113.5.216
→
01/06 20:29, , 1F
01/06 20:29, 1F
※ 編輯: JiDung 來自: 140.113.5.216 (01/06 20:58)
→
01/06 21:38, , 2F
01/06 21:38, 2F
→
01/06 21:38, , 3F
01/06 21:38, 3F
→
01/06 21:43, , 4F
01/06 21:43, 4F
→
01/06 21:43, , 5F
01/06 21:43, 5F
推
01/07 16:37, , 6F
01/07 16:37, 6F
回樓上
當一開始的main 執行完第一個fork();之後
此時 會多出 兒子一號
而你要注意的是
兒子一號 會從產生出這位兒子的fork之後(第一個fork之後)
"接著"往下做 原始main父親 也是同一個地方"接著"往下做
也就是說
int main()
{
//程式執行到這時候 只有原始main
fork(); //只有原始main執行fork();
//程式執行到這 有原始main跟 兒子一號
//他們都是要從"這"繼續往下執行
fork(); //原始main跟兒子一號都有執行第二次的fork();
//到這裡原始main產生了兒子二號 而兒子一號產生了兒子三號
//所以到這的時候 已經有 原始main 兒子1號~兒子3號 共四個人
fork(); //上述所講的四個人 都有執行到
//所以又蹦出四個人(兒子4~7號)
//所以到這裡總共有 原始main跟 兒子1~7號 共八個人
}
→
01/07 17:49, , 7F
01/07 17:49, 7F
→
01/07 17:49, , 8F
01/07 17:49, 8F
※ 編輯: JiDung 來自: 140.113.235.115 (01/07 18:13)
推
01/07 23:59, , 9F
01/07 23:59, 9F
推
01/08 12:00, , 10F
01/08 12:00, 10F
推
02/03 11:28, , 11F
02/03 11:28, 11F
推
11/22 15:24, , 12F
11/22 15:24, 12F
→
09/11 14:44, , 13F
09/11 14:44, 13F
推
08/06 13:37,
6年前
, 14F
08/06 13:37, 14F
討論串 (同標題文章)
本文引述了以下文章的的內容:
完整討論串 (本文為第 3 之 3 篇):