[英]How the memory is mapped when fork is used?
我是“fork()”的新手,我到處讀到當調用fork()時,啟動當前(調用)進程的精確副本。現在我運行以下代碼時,應該有兩個不同的進程,有兩個不同的分配給其變量和函數的內存位置。
#include<stdio.h>
int i=10;
int pid;
int main(){
if((pid=fork())==0){
i++;//somewhere I read that separate memory space for child is created when write is needed
printf("parent address= %p\n",&i);// this should return the address from parent's memory space
}else{
i++;
i++;
printf("child address= %p\n",&i);// this should return the address of child's memory space
}
wait(0);
return(0);
}
Why The output looks like:: child address::804a01c parent address::804a01c
為什么父母和孩子的地址都是一樣的?
地址是進程本地的。 804a01c
在一個過程中是不一樣的804a01c
在另一種方法。
由於虛擬內存 :兩個地址空間看起來都與各個進程相同。 存儲的物理內存是不同的。 然而,實際上,通過內存優化(由大多數內核實現)使相應的不同虛擬頁面映射到相同的物理頁面,直到其中一個進程寫入該內存頁面,此時頁面被物理復制。到另一個物理地址(並為該進程重新映射虛擬頁面)。
還有許多其他復雜情況:最常見的是fork()
的返回值在進程之間有所不同,盡管這通常是寄存器值的差異,而不是內存。 但是,打開文件和其他一些資源可以標記為不可繼承,因此可能存在其他差異 - 次要但有時很有用。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.