системный вызов fork: выделяется ли предварительно выделенная родительская память для дочерних элементов?

int *g=NULL;

main()
{

g = malloc(40000000);//allocate 40MB in the parent

fork();

while(1);

}

Если я запускаю эту программу и смотрю то же самое вверху, я вижу 40 МБ памяти, выделенной для родителя, а также для ребенка.

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

Комментарии? Подходит ли COW для некоторых платформ? Как я могу проверить, действительно ли COW подходит для форка?


person user3393951    schedule 07.03.2014    source источник


Ответы (1)


Логически дочернему процессу выделено 40 МБ памяти, он просто не получает отдельную копию, пока не изменит ее.

Операция COW не изменяет количество ресурсов, выделяемых процессу. Вместо этого он просто предотвращает их физическое дублирование до тех пор, пока не будет произведено редактирование, после чего новому процессу потребуется отдельная копия.

person JaredPar    schedule 07.03.2014
comment
›он просто не получит отдельную копию, пока не изменит ее. - person user3393951; 07.03.2014
comment
он просто не получает отдельную копию, пока не изменит ее. Q1. Могу ли я каким-либо образом увидеть эту экономию (потому что я не модифицировал память) Q2. Есть ли какой-нибудь образец тестовой программы, который показывает, что память одинакова (общая) до записи. - person user3393951; 07.03.2014
comment
Проверьте файл /proc/$PID/smaps ваших процессов — см. также unix.stackexchange.com/questions/33381/ - person nos; 08.03.2014