簡體   English   中英

使用fork時如何映射內存?

[英]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

為什么父母和孩子的地址都是一樣的?

將兩個不同的存儲位置分配給它們的變量和功能。

不; Linux實現虛擬內存 ,這意味着每個進程都有自己的完整地址空間。 因此,在fork ,兩個進程都會看到內存對象副本的相同地址。

(順便說一下:VM還會導致代碼在物理內存中的進程之間共享,並且所有數據都只能在寫入時復制 。)

地址是進程本地的。 804a01c在一個過程中是不一樣的804a01c在另一種方法。

由於虛擬內存 :兩個地址空間看起來都與各個進程相同。 存儲的物理內存是不同的。 然而,實際上,通過內存優化(由大多數內核實現)使相應的不同虛擬頁面映射到相同的物理頁面,直到其中一個進程寫入該內存頁面,此時頁面被物理復制。到另一個物理地址(並為該進程重新映射虛擬頁面)。

還有許多其他復雜情況:最常見的是fork()的返回值在進程之間有所不同,盡管這通常是寄存器值的差異,而不是內存。 但是,打開文件和其他一些資源可以標記為不可繼承,因此可能存在其他差異 - 次要但有時很有用。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM