Два процесса совместно используют одну кучу - PullRequest
3 голосов
/ 08 марта 2012

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

int main(int argc, char** argv)
{
    void* mem=malloc(100);
    pid_t pid=fork();
    printf("%p\n",mem);
}

Оба процесса печатают один и тот же адрес. Так они указывают на одну и ту же область памяти в куче? Разве это не опасно? Там может быть конфликт. Моя книга говорит, что значения в стеке копируются, но это не говорит о куче.

Ответы [ 2 ]

5 голосов
/ 08 марта 2012

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

Как предполагает Кароли Хорват, все немного сложнее из-за оптимизации под названием copy-on-write , которая в основном позволяет иметь одну копию до тех пор, пока не потребуется различие.Это реализуется через сбои страниц, и, в конце концов, одинаковые адреса в двух отдельных виртуальных адресных пространствах не относятся к одной и той же ячейке памяти.

0 голосов
/ 08 марта 2012

Среда, ограничения ресурсов, umask, управляющий терминал, текущий рабочий каталог, корневой каталог, маски сигналов и другие ресурсы процесса дублируются от родителя в разветвленном дочернем процессе.

...