Chcę wiedzieć, jak kopiowanie przy zapisie dzieje się w fork().Jak działa kopiowanie przy zapisie w fork()?
Zakładając, że posiada proces A, która ma dynamiczny int tablicy:
int *array = malloc(1000000*sizeof(int));
elementów w macierzy jest ustalony na pewną znaczące wartości. Następnie używamy widelca(), aby utworzyć procesu potomnego, a mianowicie B. B będzie iterację tablicy i zrobić kilka obliczeń:
for(a in array){
a = a+1;
}
- znam B nie będzie natychmiast skopiować całą tablicę, ale kiedy czy dziecko B alokuje pamięć dla tablicy? podczas fork()?
- Czy przydziela całą tablicę wszystkie naraz lub tylko jedną liczbę całkowitą dla
a = a+1
? a = a+1;
jak to się dzieje? Czy B odczytuje dane z A i zapisuje nowe dane do swojej własnej tablicy?
Napisałem kod, aby sprawdzić, jak działa COW. My środowiska: 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;
}
Po widełek(), to proces potomny modyfikuje połowę liczby w tablicy, a następnie modyfikuje się całą tablicę. Wyjściami są:
===
Total: 16694571008
Free: 2129162240
===
Total: 16694571008
Free: 2126106624
===
Total: 16694571008
Free: 1325101056
===
Total: 16694571008
Free: 533794816
Wygląda na to, że tablica nie została przydzielona jako całość. Gdybym nieznacznie zmienić pierwszy etap modyfikacji do:
i = 0;
for(; i<len/2; i++){
array[i*2] = i+1;
}
Wyjścia będą:
===
Total: 16694571008
Free: 2129924096
===
Total: 16694571008
Free: 2126868480
===
Total: 16694571008
Free: 526987264
===
Total: 16694571008
Free: 526987264
Dziecko nie "przydziela" niczego. Dziecko zaczyna się jako dokładna, kompletna kopia procesu nadrzędnego i po prostu kontynuuje wykonywanie od tego miejsca. –
A, A i B udostępniają tablicę? –
@KerrekSB: Ale otrzyma oddzielną pamięć procesową, która powinna być kopiowana przy zapisie. – Thilo