Как копирование при записи работает в 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