2010-11-05 107 views
3

這個循環是否忙着等待,我認爲等待電話會處理這個問題。如果是這樣,那麼如何解決不忙等待呢?這是忙碌的等待嗎?

id = fork(); 
for (i = 0; i < 20; i++) 
{ 
    switch (id) 
    { 
      case 0: 
       /* do stuff with child */ 
       exit(0); 
      default: 
      { 
       if (children>=3) { 
        int s; 
        wait(&s); 
        children--; 
       } 
       children++; 
       id = fork(); 
      } 
    } 
} 

回答

3

wait將導致內核選擇未標記爲已阻止的其他作業,因此這不是忙等待的情況。對於fork()也不會有點過分,爲什麼不使用簡單的if語句?

1

你是對的,wait等待非繁忙時,將CPU移交給內核,直到孩子退出。

1

它並不真正購買等待(它不會檢查循環中的子項的狀態;而是在wait()調用內的塊)。

儘管如此,代碼可以支配CPU,具體取決於do stuff with child中發生的情況。這看起來像忙着等待(CPU使用率100%),即使它真的是幾個進行實際工作的進程。

1

我同意你的觀點,等待一個孩子的死亡(即使在一個循環內)也不會等待。如果一個或多個子進程計算密集,OTOH可能會遇到麻煩。計算密集型兒童將始終準備好運行,並且不保證父代會獲得CPU。