2012-03-08 200 views
3

我沒有理解一些關於與叉生成過程()。 如果我試着像這樣的代碼:兩個進程共享相同的堆

int main(int argc, char** argv) 
{ 
    void* mem=malloc(100); 
    pid_t pid=fork(); 
    printf("%p\n",mem); 
} 

這兩個過程都打印相同的地址。 那麼他們是否指向堆中相同的內存區域? 這不危險嗎?可能有衝突。 我的書說,在棧上的值複製,但它並沒有談論堆。所以那些存儲器地址指向不同的存儲位置

+0

https://en.wikipedia.org/wiki/Virtual_memory – 2012-03-08 14:19:06

回答

5

不同的進程包含在不同的虛擬地址空間。

正如Karoly Horvath所說,由於copy-on-write的優化,它會更復雜一點,它基本上允許擁有一個副本直到需要區分爲止。這是通過頁面錯誤實現的,最後兩個單獨的虛擬地址空間中的相同地址不涉及相同的存儲位置。

+4

沒有,他們指向同一個硬件地址,直到你把它寫。當您執行fork()時,操作系統會將內存中的所有頁面標記爲在寫入時創建頁面錯誤。該寫入被捕獲,並且只有實際的複製發生。只要你只是從這個工作得很好,節省了寶貴的內存和CPU時間內存讀取;) – 2012-03-08 13:39:43

+2

你應該是一個答案 – Useless 2012-03-08 13:53:08

0

環境,資源限制的umask,控制終端,當前工作目錄,根目錄下,信號口罩等處理資源從在叉形子進程父複製。

相關問題