Quale processo figlio erediterà i thread del processo principale?

3

Che cosa accade quando un processo ha thread figli e un processo figlio, il processo figlio erediterà tutti i thread figlio del processo padre?

Supponiamo che il sistema operativo sia Linux. Lascia che sia il modello di threading Java.

    
posta AKS 02.08.2013 - 18:44
fonte

1 risposta

5

La risposta breve è che il processo figlio eredita un thread dal genitore, cioè il thread che aveva chiamato fork .

Questo è dal punto di vista di Posix / Pthreads. Linux di solito cerca di stare vicino a Posix, quindi questo vale soprattutto per Linux, anche se Linux potrebbe avere alcune caratteristiche al di fuori di Posix che si comportano diversamente.

Si potrebbe chiedere perché solo un thread è ereditato invece di tutto. Apparentemente una chiamata alternativa forkall era considerata e rifiutata per Posix. A prima vista sembra che potrebbe essere utile. In realtà, però, è facile vedere come potrebbe portare a bug intrattabili. Considera un caso in cui il thread A ha aperto un file e sta per inviarne una scrittura. In quel preciso momento, la conversazione B chiama forkall . Poiché il thread A è duplicato nel processo figlio e (in generale) tutti i file aperti sono duplicati nel processo figlio, il thread A e il relativo clone nel child entrambi scrivono nel file aperto. Questo è molto probabilmente un errore.

Anche avere il processo figlio ereditare solo un singolo thread è problematico. Vedi questa domanda stackoverflow e un buon blog article a cui si collega. Il risultato è che ci sono problemi ma possono essere affrontati.

Il modello Threads Solaris , che precede i Pthreads, ha avuto una politica diversa per quanto riguarda fork e thread. Per impostazione predefinita, la chiamata di sistema fork ha clonato tutti i thread mentre la chiamata di sistema fork1 ha clonato solo il thread chiamante. Peggio ancora, quando Pthreads è stato implementato in Solaris, il modo in cui il programma è stato collegato ha definito se utilizzava i thread Solaris o la semantica Pthreads, determinando la semantica di fork . Molto confuso.

Infine, hai chiesto informazioni sui thread Java. Il modo in cui un nuovo processo è biforcuto in Java sta utilizzando il metodo java.lang.Runtime.exec() . Questo fonde le funzioni di Posix fork e exec . In generale, il sottoprocesso non deve necessariamente eseguire una Java Virtual Machine (JVM), quindi nessuno dei thread Java dal genitore esiste nel child. Anche se il bambino termina l'esecuzione di una JVM, quella JVM si avvia automaticamente eseguendo il metodo main() della classe iniziale e non eredita alcun thread dal genitore.

    
risposta data 05.08.2013 - 05:47
fonte

Leggi altre domande sui tag