2014-05-16 1 views
9

Lo scheduler di Linux preferisce eseguire il processo figlio dopo fork() nel processo padre?Lo scheduler di Linux preferisce eseguire il processo figlio dopo fork()?

Di solito, il processo biforcuta eseguirà exec di qualche tipo così, è meglio lasciare che il processo figlio di eseguire prima del processo di padre (per evitare la copia in scrittura).

Suppongo che il bambino eseguirà exec come prima operazione dopo la sua creazione.

La mia ipotesi (che lo scheduler preferirà il processo figlio) è corretta. Se no, perché? Se sì, ci sono più motivi per gestire prima il bambino?

risposta

6

Per citare The Linux Programming Interface (pg. 525) per una risposta generale:

Dopo un fork(), è indeterminata quale processo - il genitore o il bambino - ha vicino l'accesso alla CPU. (In un sistema multiprocessore, entrambi possono simultaneamente accedere ad una CPU.)

Il libro prosegue sulle differenze nelle versioni del kernel e cita anche la CFS/Linux 2.6.32:

[ ...] da Linux 2.6.32, è ancora una volta il genitore che, per impostazione predefinita, viene eseguito prima dopo un fork(). Questo valore predefinito può essere modificato assegnando un valore diverso da zero al file /proc/sys/kernel/sched_child_runs_first specifico per Linux.

This behaviour is still present with CFS anche se ci sono some concerns per il futuro di questa funzione. Guardando l'implementazione CFS, è seems to schedule il genitore prima del bambino.

La strada da percorrere per te sarebbe impostare /proc/sys/kernel/sched_child_runs_first su un valore diverso da zero.

Edit:This answer analizza il comportamento predefinito e lo confronta con sched_child_runs_first.

3

Per il caso in cui il bambino chiama exec alla prima opportunità è possibile utilizzare vfork anziché la forcella. vfork sospende il genitore finché il figlio non chiama _exit o exec *. Tuttavia, una volta chiamato exec, il figlio verrà sospeso se il codice deve essere caricato dal disco. In questo caso, il genitore ha buone possibilità di continuare prima che il bambino lo faccia.

+0

Ok, grazie, ma per quanto riguarda il solito caso. Lo scheduler preferisce il figlio al padre? – Farseer

+3

Con vfork la mia lettura è che il bambino è preferito, con la forchetta, non è specificato. –