cosa succede ai livelli inferiori dopo una chiamata di sistema fork?
-
18-09-2019 - |
Domanda
So quello che il fork () non al livello superiore. Quello che mi piacerebbe sapere è questa -
-
Appena c'è una chiamata fork, un'istruzione trappola segue e controllo passa ad eseguire la forcella "gestore". Ora, come questo gestore, che crea il processo figlio, duplicando il processo padre con la creazione di un altro blocco spazio di indirizzamento e controllo di processo, tornare 2 valori, uno per ogni processo?
-
A che punto dell'esecuzione fa 2 valori ritorno forcella?
Per dirla in breve, anbody può spiegare gli eventi passo-passo che si svolgono al livello inferiore dopo una chiamata fork?
Soluzione
Non è così difficile a destra - la parte kernel del syscall fork () può dire la differenza tra i due processi attraverso il processo Control Block come lei ha ricordato, ma non hanno nemmeno bisogno di farlo. Così il pseudocodice appare come:
int fork()
{
int orig_pid = getpid();
int new_pid = kernel_do_fork(); // Now there's two processes
// Remember, orig_pid is the same in both procs
if (orig_pid == getpid()) {
return new_pid;
}
// Must be the child
return 0;
}
Modifica La versione ingenua fa proprio come lei -. Crea un contesto nuovo processo, le copie di tutti i contesti filo associati, le copie di tutte le pagine e le mappature dei file e il nuovo processo è messo in "pronto per l'esecuzione" lista
Credo che la parte che stai ottenendo confuso su è, che quando questi processi riprendono (vale a dire quando i rendimenti genitore da kernel_do_fork, e il bambino è prevista per la prima volta), si avvia in centrale della funzione (cioè di esecuzione la prima 'se'). Si tratta di un esattamente copia - entrambi i processi eseguiranno 2 ° tempo della funzione.
Altri suggerimenti
Il valore restituito ad ogni processo è diverso. Il / originale get filo genitore il PID del processo figlio e del get processo figlio 0.
Il kernel di Linux raggiunge questo su x86 modificando il valore nel registro EAX come copia l'attuale thread nel processo padre.