2012-04-10 17 views
5

Questo è un sequel del mio precedente question. Sto usando fork per creare processi figlio. All'interno bambino, sto dando il comando per eseguire un processo come segue:tempo impiegato dal processo figlio biforcuto

if((childpid=fork())==0) 
{ 
system("./runBinary "); 
exit(1) 
} 

mio runBinary ha la funzionalità di misurare quanto tempo ci vuole, dall'inizio alla fine.

Quello che mi stupisce è che quando eseguo runBinary direttamente su riga di comando, ci vogliono circa 60 secondi. Tuttavia, quando lo eseguo come un processo figlio, richiede più, come ~ 75 o più. C'è qualcosa che posso fare o sto sbagliando, che sta portando a questo?

Grazie per l'aiuto in anticipo. ULTERIORI DETTAGLI: Sono in esecuzione su server RHEL linux, con 24 core. Sto misurando il tempo della CPU. Alla volta, forzo solo 8 figli (in sequenza), ognuno dei quali è associato a un core diverso, usando taskset (non mostrato nel codice). Il sistema non è caricato tranne per il mio programma.

+1

Forse ci vogliono 15 secondi per il processo padre di sonno per essere svegliati dal o/s dopo che il bambino è uscito? –

+0

@JonathanLeffler puoi dire come confermarlo? Grazie – user984260

+0

@sarnold in realtà è runBinary che è a sua volta misurare il tempo. – user984260

risposta

2

La funzione system() è di richiamare la shell. Puoi fare qualsiasi cosa al suo interno, incluso l'esecuzione di uno script. Questo ti dà molta flessibilità, ma ha un prezzo: stai caricando una shell e poi esegui Binary al suo interno. Anche se non penso che il caricamento della shell sia responsabile di tanta differenza di tempo (15 secondi è molto, dopo tutto), dal momento che non sembra che tu ne abbia bisogno - solo per eseguire l'app - prova ad usare qualcosa dal exec() famiglia invece.

+0

Grazie. La tua risposta è molto convincente. Pensi che la famiglia exec sia più veloce? La ragione per cui non ho usato execvp era che nel sistema potevo fare il sistema ("./ Binary argument1 argument2") ;, considerando che non potevo farlo in execvp. Puoi dire. – user984260

+1

Bene, non dover caricare la shell e interpretare la riga di comando fornita dovrebbe fornire un aumento di velocità. Sulla linea di comando, non ho capito, cosa hai detto che non puoi fare? Puoi passarci argomenti, l'unico lavoro addizionale è che devi mettere gli argomenti in un array - se usi le varianti di execv - o almeno avere il nome binario in una stringa separata - se usi le varianti di execl. Queste cose possono essere fatte, per esempio, con strtok. –

+0

Grazie. Vedo e seguo. – user984260

0

Senza profilare l'applicazione, se il processo genitore che forca ha un ampio spazio di memoria, si potrebbe scoprire che c'è tempo trascorso a tentare di biforcarsi il processo stesso, e tenta di duplicare lo spazio di memoria.

Questo non è un problema in Red Hat Enterprise Linux 6, ma era nelle versioni precedenti di Red Hat Enterprise Linux 5.

Problemi correlati