Путаница адресного пространства родителя и ребенка - PullRequest
4 голосов
/ 02 декабря 2011

Очевидно, что у нас есть блок кода, подобный

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 (), и, как и в предыдущем посте по этой теме, можно предположить, что еговиртуальной памяти. Но моя путаница заключается в том, что это подразумевает, что каждый родитель и ребенок обладают отдельным физическим адресным пространством, и если да, то почему виртуальный адрес не может отличаться, так как в конечном итоге он будет отображаться в соответствующем физическом адресном пространстве MMU.1006 *

Ответы [ 3 ]

2 голосов
/ 02 декабря 2011

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

1 голос
/ 02 декабря 2011

Да, каждый отдельный процесс обладает своей частью физической памяти, даже если виртуальные адреса могут конфликтовать, и хотя методы оптимизации, такие как копирование при записи, часто выполняются.

В большинстве современных реализаций используется копирование.-on-write, что означает, что пока один из процессов не попытается изменить часть памяти, оба процесса будут ссылаться на один и тот же кусок физической памяти.

В вашем конкретном случае это означает, что y должен ссылатьсяк одному и тому же куску физической памяти в обоих процессах, прежде чем ребенок модифицирует ее, умножая ее.В этот момент ядро ​​скопирует всю страницу, где находится y, так что теперь эти два процесса ссылаются на разные фрагменты физической памяти.

0 голосов
/ 02 декабря 2011

Что вы печатаете здесь с &y, это виртуальные адреса. Они могут быть разными, но имеет смысл, что для разветвленного дочернего процесса они такие же, как в родительском процессе.

Но с другой стороны, физические адреса различны для родителя и ребенка. Вот почему значения остаются неизменными даже после умножения.

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