2012-11-23 61 views
0

當內核創建兩個代碼段相同的進程時,內核是否真的將代碼複製到兩個進程的虛擬地址空間?換句話說,如果我在內存中創建了兩個相同程序的進程,那麼我們有兩個程序副本還是一個副本?在Unix/Linux中運行兩個進程

顯然,它可能取決於實現,但我在傳統的Unix操作系統中問。

回答

2

現代操作系統將使用Copy-on-Write來避免重複頁面直到它們實際更新。請注意,在許多系統(包括Linux)上,這可能導致過度使用,即操作系統實際上沒有足夠的內存來處理所有需要複製的應用程序,如果每個進程都決定修改未複製的頁面。

+1

我想你的意思是說COW。 – ninjalj

+0

@ninjalj:是的,我做到了。謝謝 :)。 –

3

內核是否真的將代碼複製到兩個進程的虛擬地址空間?

文本段將被映射(而不是複製)到每個進程的虛擬地址空間,但將是指相同的物理空間(所以內核將只在存儲器中的文本的一個拷貝) 。

數據和bss段也將映射到每個進程的虛擬地址空間,但這些將在每個進程中創建。在進程啓動時,來自可執行文件的數據和bss段的數據將被映射/複製到進程的虛擬內存中;如果它不是從頭開始複製的,那麼一旦進程開始寫入數據,進程將被賦予它自己的私有副本。

顯然,共享內存和mmap內存是在進程啓動後處理的。共享內存總是在進程之間共享;這是它的存在理由。 mmap會發生什麼情況取決於所用的標誌,但它通常也是共享的。

+0

但是內核怎麼知道文本段已經存在於內存中?我的意思是使用哪種內核數據結構? –

+1

這取決於哪個內核......它可能在每個進程表中使用可執行文件的inode編號,加上內存映射表中的某些內容,但我沒有詳細查看。核心的工作是擔心這個 - 不是我的。 –

相關問題