I thread vengono copiati quando si chiama fork?


31

Se ho un programma in esecuzione con thread e chiamo fork()su un sistema basato su unix, i thread vengono copiati? So che la memoria virtuale per il processo corrente viene copiata 1: 1 nel nuovo processo generato. So che i thread hanno il loro stack nella memoria virtuale di un processo. Pertanto, almeno la pila di thread dovrebbe essere copiata anche. Tuttavia, non so se c'è altro nei thread che non risiede nella memoria virtuale e quindi NON viene copiato. In caso contrario, i due processi condividono i thread o sono copie indipendenti?

Risposte:


29

No.

I thread non vengono copiati fork(). Le specifiche POSIX indicano (sottolineare è mio):

fork - crea un nuovo processo

Un processo deve essere creato con un singolo thread . Se un processo multi-thread chiama fork (), il nuovo processo deve contenere una replica del thread chiamante e il suo intero spazio di indirizzi, possibilmente includendo gli stati di mutex e altre risorse. Di conseguenza, per evitare errori, il processo figlio può eseguire operazioni asincrone-sicure fino al momento in cui viene chiamata una delle funzioni exec.

Per aggirare questo problema, esiste una pthread_atfork()funzione per aiutare.


7

forcella uomo :

Il processo figlio viene creato con un singolo thread, quello che ha chiamato fork (). L'intero spazio di indirizzi virtuale del genitore viene replicato nel figlio, inclusi gli stati di mutex, variabili di condizione e altri oggetti pthreads; l'uso di pthread_atfork (3) può essere utile per affrontare i problemi che ciò può causare.


Ma sembra strano: perché lo stack per i thread nel processo che chiama fork dovrebbe essere copiato se i thread effettivi (che non conosco contengano spazio di archiviazione diverso dalla memoria virtuale) non lo sono?

Bene, il perché è una domanda completamente diversa. Non conosco le decisioni di progettazione originali che hanno portato a tale implementazione. Se sei interessato, dovresti fare una domanda separata.
Kaylum,

@dip ma la pila di altri thread non viene copiata, chi l'ha detto?
Jean-Baptiste Yunès,

1
@ Jean-BaptisteYunès Nei sistemi unix, esiste una struttura che rappresenta la memoria virtuale per un processo. Questo è quello copiato. Non solo heap e bss

6
ottieni l'intero spazio di memoria - e quindi le pile di tutti i thread. ne hai bisogno perché non ci sono limiti su dove stanno puntando i puntatori che vivono nello stack (o memoria statica) accessibili al thread rimanente - potrebbero benissimo puntare a dati che vivevano nello stack di alcuni thread nel processo originale
davidbak

4

Dal fork di The Open Group Base Numero 7, edizione 2018 della forcella :

Un processo deve essere creato con un singolo thread. Se un processo multi-thread chiama fork () , il nuovo processo deve contenere una replica del thread chiamante e il suo intero spazio di indirizzi, possibilmente includendo gli stati di mutex e altre risorse. Di conseguenza, per evitare errori, il processo figlio può eseguire operazioni asincrone-sicure fino al momento in cui viene chiamata una delle funzioni exec .

Quando l'applicazione chiama fork () da un gestore di segnale e uno dei gestori di fork registrati da pthread_atfork () chiama una funzione che non è sicura per il segnale asincrono, il comportamento non è definito.


-2

Inizialmente, "fork" è stato ottenuto scrivendo l'attività su disco e quindi, anziché leggere in un thread diverso (che sarebbe fatto se si scambiasse l'attività con una diversa), modificando l'ID dell'attività dell'immagine ancora in memoria e continuando con la sua esecuzione (come la nuova attività). Questa era una modifica molto semplice al meccanismo di commutazione delle attività di base, in cui solo una attività occupava memoria RAM alla volta.

Naturalmente, man mano che la gestione della memoria è diventata più elaborata, questo schema è stato modificato per adattarsi al nuovo ambiente.


Curioso perché questo è stato votato in negativo. Questo è il modo in cui Unix l'ha fatto.
Hot Licks

Questa è una visione interessante, ma dove menziona i thread? Non mi sembra una risposta.
wastl,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.