其明顯,我們有一個代碼塊等父子地址空間混淆
int
main()
{
pid_t pid;
int y = 3;
if ((pid = fork()) <0)
return -1;;
if(pid == 0) /* child */
{
printf(" before: %d %p\n", y, &y);
y *= 10;
printf("after: %d %p\n", y, &y);
}
else /* father */
{
sleep(1);
printf("father: %d %p\n" , y , &y);
}
return 0;
}
打印的地址是相同的每個printf()和作爲關於此主題的先前post暗示的,其因爲虛擬memory.But我的困惑是,這是否意味着每個父母和孩子擁有單獨的物理地址空間,如果是,那麼爲什麼虛擬地址不能有所不同,因爲它最終將由MMU映射到相應的物理地址空間。
好了,它表明,直到乘法的子進程的執行,無論是孩子和家長指向相同的物理地址和執行完成和最終值會修改,然後內核拷貝原有的物理地址空間,新的每一件事物理地址和現在的子地圖的虛擬地址。但是虛擬地址空間的相似性僅僅是爲了優化? –
不,這是必須的:編譯後的程序使用虛擬內存地址來訪問變量(以及幾乎所有的東西)。這些是在編譯時確定的。 – Viruzzo