Как копирование при записи работает в fork ()?

Я хочу знать, как происходит копирование при записи в fork ().

Предполагая, что у нас есть процесс A, который имеет динамический массив int:

int *array = malloc(1000000*sizeof(int));

Элементы в массиве инициализируются некоторыми значимыми значениями. Затем мы используем fork () для создания дочернего процесса, а именно B. B выполнит итерацию массива и выполнит некоторые вычисления:

for(a in array){
    a = a+1;
}
Я знаю, что B не скопирует весь массив сразу, но когда дочерний B выделяет память для массива? во время форка ()?Выделяет ли он весь массив одновременно или только одно целое дляa = a+1?a = a+1; Как это произошло? Читает ли B данные из A и записывает ли новые данные в свой собственный массив?

Я написал код, чтобы изучить, как работает COW. Моя среда: Ubuntu 14.04, gcc4.8.2

#include <stdlib.h>
#include <stdio.h>
#include <sys/sysinfo.h>

void printMemStat(){
    struct sysinfo si;
    sysinfo(&si);
    printf("===\n");
    printf("Total: %llu\n", si.totalram);
    printf("Free: %llu\n", si.freeram);
}

int main(){
    long len = 200000000;
    long *array = malloc(len*sizeof(long));
    long i = 0;
    for(; i<len; i++){
        array[i] = i;
    }

    printMemStat();
    if(fork()==0){
        /*child*/
        printMemStat();

        i = 0;
        for(; i<len/2; i++){
            array[i] = i+1;
        }

        printMemStat();

        i = 0;
        for(; i<len; i++){
            array[i] = i+1;
        }

        printMemStat();

    }else{
        /*parent*/
        int times=10;
        while(times-- > 0){
            sleep(1);
        }
    }
    return 0;
}

После fork () дочерний процесс изменяет половину чисел в массиве, а затем изменяет весь массив. Выходы:

===
Total: 16694571008
Free: 2129162240
===
Total: 16694571008
Free: 2126106624
===
Total: 16694571008
Free: 1325101056
===
Total: 16694571008
Free: 533794816

Похоже, что массив не выделен целиком. Если я немного изменю первый этап модификации на:

i = 0;
for(; i<len/2; i++){
    array[i*2] = i+1;
}

Выходы будут:

===
Total: 16694571008
Free: 2129924096
===
Total: 16694571008
Free: 2126868480
===
Total: 16694571008
Free: 526987264
===
Total: 16694571008
Free: 526987264

Ответы на вопрос(2)

Ваш ответ на вопрос