2012-12-17 49 views
1

今天我參加了一個關於linux進程的講座。老師說:在fork-exec中如何防止不必要的複製?

  1. 叉()返回之後,叉EXEC序列是保證防止父進程的內存
的不必要的複製子進程已準備好執行
  • 因爲寫時複製機制

    通過叉高管序列我的意思是類似的東西:

    if(!fork()) 
    { 
        exec(...); 
    } 
    i = 0; 
    

    其中,據我所知轉換成這(寫在僞ASM):

    call fork 
    jz next 
    call exec(...) 
    next: 
    load 0 
    store i 
    

    讓我們假設父節點已經被授予了足夠的CPU時間來執行一次運行中的上述所有行。

    1. 叉返回0,所以第3行被跳過
    2. 當0被存儲在「i」的子
    3. 尚未exec'ed,在 複製(不必要的)親本的存儲器,以便COW踢腿。

    那麼在這種情況下如何防止不必要的複製? 它看起來是沒有,但我認爲Linux的開發者足夠聰明來做到這一點;)

    可能的答案:孩子總是先運行(父調用fork後preemted()) 1.是真的? 2.如果是,是否確保在所有情況下防止不必要的複製?

  • +0

    我不認爲牛是什麼在這裏扮演的角色。 –

    回答

    0

    答案基本上是必要的複製 - 託管其得到改變任何數據頁 - 發生,而不必要的複製 - 這還沒有由於叉通過改變任一過程的頁 - 沒有。

    後者通常不僅包括未修改數據,而且那些持有已加載的程序本身和共享庫 - 可以共享通常很多頁,主場迎戰剛剛必須複製等等。

    孩子一旦調用一個exec函數,共享(及任何需要爲未來的寫入時複製)被終止。

    1

    基本上兩個人可以讀同一本書。但是,如果一個人開始在邊距中寫筆記,那麼在該事件發生之前,另一個人需要該頁面的副本。沒有寫入頁面邊緣的人不希望看到書中的其他人的註釋。

    相關問題