2012-03-08 3 views
3

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

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

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

+0

https://en.wikipedia.org/wiki/Virtual_memory –

ответ

5

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

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

+4

Нет, они указывают на тот же аппаратный адрес, пока вы его не запишете. Когда вы делаете fork(), ОС отмечает все страницы в памяти, чтобы создать ошибку страницы при записи. Эта запись улавливается, и только тогда происходит фактическое копирование. До тех пор, пока вы читаете только из памяти, это отлично работает и экономит драгоценную память и время процессора;) –

+2

Вы должны сделать ответ – Useless

0

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