Domanda

la mia domanda è un po 'concettuale, come è processo padre dei dati condivisi con processo figlio creato da una chiamata fork() o con un filo creato da pthread_create()

per esempio, sono variabili globali direttamente passati in processo figlio e se è così, fa modifica su quella variabile fatta dal processo figlio il valore effetto di esso nel processo genitore?

apprezzo risposte parziali e complete in anticipo, se mi manca ogni risorsa esistente, mi dispiace, ho fatto qualche ricerca su google ma non ho trovato buoni risultati

Grazie ancora per il vostro tempo e le risposte

È stato utile?

Soluzione

La semantica della forcella () e pthread_create () sono un po 'diverso.

fork () crea un nuovo processo, in cui le variabili globali saranno separati tra il genitore e il bambino. La maggior parte delle implementazioni del sistema operativo utilizzerà la semantica copy-on-write, il che significa che sia il genitore e processo figlio utilizzeranno le stesse pagine di memoria fisica per tutte le variabili globali fino a quando uno dei processi di tentativi per modificare la memoria fisica, a quel punto una copia di quella pagina è fatta, così che ora ogni processo ottiene la propria copia e non vede di l'altro processo, in modo che i processi sono isolati.

pthread_create () invece, crea un nuovo thread all'interno dello stesso processo. Il nuovo filo avrà uno spazio di stack separato dagli altri fili di funzionamento dello stesso processo, tuttavia le variabili globali e spazio mucchio sono condivisi tra tutti thread dello stesso processo. Questo è il motivo per cui spesso è necessario un mutex per coordinare l'accesso a una parte condivisa di memoria tra più thread dello stesso processo.

TL; DR versione: con fork (), non si vede modifiche del l'altro ragazzo; con pthread_create () si fa.

Altri suggerimenti

Una forchetta crea una quasi esatta copia del processo chiamante, tra cui memoria e descrittori di file. Le variabili globali vengono copiate insieme a tutto il resto, ma non sono in alcun modo legati al processo padre. Dal momento che i descrittori di file vengono copiati, genitori e figli possono interagire tramite questi (come fino a quando sono configurato correttamente, di solito tramite tubo o socketpair).

C'è una grande differenza tra i processi creati da fork e tra i thread creati con pthread_create. I processi non condividono le variabili globali e dovrebbero comunicare attraverso tubi, prese di corrente, o altri strumenti forniti dal sistema operativo. Una buona soluzione è MPI - che è un message-passing libreria per la comunicazione tra processi

.

Le discussioni sono molto diverse. Un filo creato con azioni pthread_create tutte le variabili globali con il suo interlocutore. Inoltre, il chiamante può passare una struttura arbitraria nella filettatura, e questa struttura sarà anche condivisa. Ciò significa che si dovrebbe essere estremamente attenti in fase di programmazione con i thread - tali importi di condivisione sono pericolosi e soggetto a errori. L'API pthread fornisce mutex e condizioni per robusto sincronizzazione tra thread (anche se richiede ancora pratica e competenza per implementare correttamente).

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top