GNU/Linux >> Linux Esercitazione >  >> Linux

Nello specifico, in che modo fork() gestisce la memoria allocata dinamicamente da malloc() in Linux?

Ogni pagina allocata per il processo (sia essa una pagina di memoria virtuale che contiene lo stack o l'heap) viene copiata affinché il processo fork possa accedervi.

In realtà, non viene copiato all'inizio, è impostato su Copy-on-Write, il che significa che una volta che uno dei processi (genitore o figlio) tenta di modificare una pagina, viene copiato in modo che non si danneggino a vicenda, e avere ancora tutti i dati dal punto di fork() accessibili a loro.

Ad esempio, le code page, quelle su cui l'eseguibile effettivo è stato mappato in memoria, di solito sono di sola lettura e quindi vengono riutilizzate tra tutti i processi biforcuti - non verranno copiate di nuovo, poiché nessuno scrive lì, solo legge, e così il copy-on-write non sarà mai necessario.

Ulteriori informazioni sono disponibili qui e qui.


Dopo un fork il figlio è completamente indipendente dal genitore, ma può ereditare alcune cose che sono copie del genitore. Nel caso dell'heap, il figlio avrà concettualmente una copia dell'heap dei genitori al momento del fork. Tuttavia, le modifiche all'intestazione nello spazio degli indirizzi del bambino modificheranno solo la copia del bambino (ad es. tramite copia su scrittura).

Per quanto riguarda la documentazione:ho notato che la documentazione di solito afferma che tutto viene copiato, tranne per bla bla bla.


La risposta breve è "sporca durante la scrittura" - la risposta più lunga è .. molto più lunga.

Ma a tutti gli effetti - il modello di lavoro che a livello C è sicuro assumere è che subito dopo il fork() i due processi sono assolutamente identici -- cioè il bambino riceve una copia esatta al 100% -- (ma per un pochino bit intorno al valore di ritorno di fork()) - e poi iniziano a divergere man mano che ogni lato modifica la sua memoria, stack e heap.

Quindi la tua conclusione è leggermente sbagliata - il bambino inizia con gli stessi dati del genitore copiati nel proprio spazio - poi li modifica - e li vede come modificati - mentre il genitore continua con la propria copia.

In realtà le cose sono un po' più complesse - poiché cerca di evitare una copia completa facendo qualcosa di sporco; evitando di copiare finché non è necessario.

Dw.


Linux
  1. Linux:come eseguire un bootloader da Linux?

  2. Come funziona internamente copy_from_user dal kernel di Linux?

  3. Come funziona l'allocazione dello stack in Linux?

  4. In che modo Linux distingue i thread dai processi figlio?

  5. Come disabilitare completamente e dinamicamente lo stack IPv4 da Linux?

Come accedere alle partizioni Linux da Windows 10

Come cancellare la memoria di scambio in Linux

Come rimuovere un comando dalla cronologia in Linux

Come installare il software dal sorgente in Linux

Come rimuovere (^M) caratteri da un file in Linux

Come funziona la memoria di scambio in Linux?