Как отображается память при использовании fork? - PullRequest
5 голосов
/ 15 марта 2012

Я новичок в "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

Почему оба адреса одинаковы для родительского и дочернего?

Ответы [ 3 ]

8 голосов
/ 15 марта 2012

с двумя различными ячейками памяти, назначенными их функциям и функциям.

Нету; В Linux реализована виртуальная память , что означает, что каждый процесс имеет свое собственное полное адресное пространство. В результате после fork оба процесса видят одинаковые адреса для своих копий объектов в памяти.

(Кроме того: виртуальная машина также обеспечивает совместное использование кода процессом в физической памяти, и все данные будут только скопированы при записи .)

2 голосов
/ 15 марта 2012

Из-за виртуальной памяти : оба адресных пространства выглядят идентичными соответствующим процессам. Физическая память, в которой они хранятся, отличается. Однако на практике это осложняется оптимизацией памяти (реализуемой большинством ядер), которая отображает соответствующие разные виртуальные страницы на одни и те же физические страницы, пока один из этих процессов не выполнит запись на эту страницу памяти, после чего страница будет дублирована физически на другой физический адрес (и виртуальная страница переназначается для процесса).

Существует также много других сложностей: наиболее признанным является то, что возвращаемое значение fork() отличается между процессами, хотя обычно это разница в значении регистра, а не в памяти. Однако открытые файлы и некоторые другие ресурсы могут быть помечены как не наследуемые, поэтому возможны и другие различия - незначительные, но иногда полезные.

2 голосов
/ 15 марта 2012

Адреса являются локальными.804a01c в одном процессе не совпадает с 804a01c в другом процессе.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...