Разница между адресным пространством родительского процесса и его дочернего процесса в Linux? - PullRequest
6 голосов
/ 04 января 2011

Я в замешательстве. Я читал, что когда ребенок создается родительским процессом, child получает копию адресного пространства своего родителя. Что это значит здесь под копией? Если я использую код ниже, то он печатает те же адреса переменной «а», которая находится во всех случаев. т.е. в случае ребенка и родителя. Так что здесь происходит?

</p>

<p>int main ()
{
        pid_t pid;
        int *a = (int *)malloc(4);
        printf ("heap pointer %p\n", a);
        pid = fork();
        if (pid < 0) {
                fprintf (stderr, "Fork Failed");
                exit(-1);
        }
        else if (pid == 0) {
                printf ("Child\n");
                printf ("in child heap pointer %p\n", a);
        }
        else {</p>

<code>            wait (NULL);
            printf ("Child Complete\n");
            printf ("in parent heap pointer %p\n", a);
            exit(0);
    }
</code>

}

Ответы [ 5 ]

19 голосов
/ 04 января 2011

Ребенок получает точную копию адресного пространства родителей, которое во многих случаях может быть расположено в том же формате, что и родительское адресное пространство. Я должен указать, что каждый из них будет иметь свое собственное виртуальное адресное пространство для своей памяти, так что каждый может иметь одинаковые данные по одному и тому же адресу, но в разных адресных пространствах. Кроме того, linux использует копирование при записи при создании дочерних процессов. Это означает, что родитель и дочерний элемент будут совместно использовать родительское адресное пространство, пока один из них не выполнит запись, после чего память будет физически скопирована на дочерний элемент. Это исключает ненужные копии при exec запуске нового процесса. Поскольку вы просто собираетесь перезаписать память новым исполняемым файлом, зачем копировать его?

3 голосов
/ 04 января 2011

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

1 голос
/ 07 марта 2018

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

1 голос
/ 04 января 2011

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

0 голосов
/ 04 января 2011

При fork() дочерний процесс получает новое адресное пространство, в которое копируется все содержимое родительского адресного пространства (фактически современные ядра используют copy-on-write ).

Это означает, что если вы измените a или значение, указанное им в процессе, другой процесс все равно увидит старое значение.

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