2012年1月17日 星期二

關於 fork 之一

計算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 )


說明:
先看這題
int main()
{
   fork();
   fork();
   fork();
}
包含main本身,結束後共有8個
如果不包含main本身,也就是多產生出來的process數,是7

                  main
               (first fork)
                  /  \
              c  /    \ p
                /      \
              fork      fork
              / \       / \
            c/   \ p  c/   \ p
            /     \   /     \
          fork  fork fork   fork
          / \   / \  / \    / \
         c  p  c  p  c  p   c  p

再來看原本的題目
在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

ref:批批踢實業坊

沒有留言:

張貼留言