2011-09-25 61 views
0

我聽說Unix的fork會複製當前進程。這是否意味着完全相同的程序和狀態會在新的子進程中產生?我不明白爲什麼它以這種方式工作。因爲它看起來效率低下。如何在Unix中用不同的程序啓動一個新的進程?

  1. 什麼的複製?
  2. 它爲什麼這樣工作?
  3. 有沒有其他辦法產卵新的子進程? (或分離過程)

回答

3

它工作的方式 - 那種。它主要是使用「寫入時複製」來實現的,這意味着大多數內存頁面在兩個進程之間共享,直到孩子嘗試寫入頁面,此時它真的被複制。因此,如果一個孩子被分叉,然後立即加載並執行一個新的二進制映像,那麼您擔心的低效率不會發生:從父節點開始的內存頁副本永遠不會實際創建。

是否有其他方法可以使子進程?當然,其他操作系統的做法有所不同。 UNIX方式實際上是一種非常有效的方式,以便子進程可以從其父級繼承打開的文件描述符,環境變量和其他系統信息:它實際上導致減少的工作,而不是更多!

2

fork在現代操作系統上非常高效。它僅通過Copy on Write技術或類似方法複製所需的頁面。

不同的操作系統有不同的產卵方式。 Linux有一個clone系統調用(並且fork基於此),可以對新進程從其父進程繼承的內容進行很多控制。

爲什麼它的工作原理是這樣的,我不知道。它效率高,範圍廣泛,並且使用和理解起來相當簡單(一旦你閱讀了手冊頁並查看了示例)。

1

調用fork()的認爲克隆的時候(你有一個的圖像,但等待他們是相同的 - 這是第一位的,這是第二次/克隆一個),有成爲下一個子線程主線程(父/子)。分叉是一個系統調用,但開銷是微妙的,除非你隨後調用exec。所以,fork/execing在unix中花費很大。

叉:一個子過程需要在父的屬性 - 所以有排序在相同的內存空間兩個單獨的可運行代碼段(一個父,和一個子)。爲了通過調用'exec'來分隔兩個後續部分,現在子代碼部分成爲一個分離的可運行進程,並且具有來自其父進程的父代代碼。如果你只是使用fork(),那麼你必須管理誰是父母的誰是孩子的單獨的代碼部分。

exec調用是內核開銷的開銷,而不是fork。

1

這是否意味着完全相同的程序和狀態會在新的子進程中產生?

不完全一樣的狀態。有一個小小的差異:fork返回值會根據父進程或子進程而有所不同。當然,這些pid也會有所不同。

此外,啓動新流程不需要用fork完成。當fork證明實現太困難時,posix_spawn已被標準化爲替代方案。

http://pubs.opengroup.org/onlinepubs/009695399/functions/posix_spawn.html

0

哦,如果你能解釋一下如何「init」的init進程或交換技術在UNIX中創建,那麼您瞭解UNIX進程創建的概念:叉/ EXEC。一件美麗的事!

相關問題