2012-04-10 23 views
5

Esta es una secuela de mi anterior question. Estoy usando un tenedor para crear un proceso infantil. En el interior del niño, estoy dando comandos para ejecutar un proceso de la siguiente manera:tiempo tomado por proceso hijo bifurcado

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

Mi runBinary tiene la funcionalidad de medición de la cantidad de tiempo que lleva de principio a fin.

Lo que me sorprende es que cuando ejecuto runBinary directamente en la línea de comandos, tarda ~ 60 segundos. Sin embargo, cuando lo ejecuto como un proceso secundario, toma más, como ~ 75 o más. ¿Hay algo que pueda hacer o que esté haciendo mal en la actualidad, que me está llevando a esto?

Gracias por la ayuda con antelación. MÁS DETALLES: Me estoy ejecutando en el servidor RHEL de Linux, con 24 núcleos. Estoy midiendo el tiempo de la CPU. En un momento, solo doy 8 hijos (secuencialmente), cada uno de los cuales está vinculado a un núcleo diferente, usando el conjunto de tareas (no se muestra en el código). El sistema no está cargado a excepción de mi propio programa.

+1

Tal vez se tarda 15 segundos para su proceso padre de dormir para ser despertado por el o/s después de que el niño sale? –

+0

@JonathanLeffler ¿Puedes decir cómo confirmar eso? Gracias – user984260

+0

@sarnold en realidad es runBinary que mide el tiempo. – user984260

Respuesta

2

La función del sistema() es invocar el shell. Puedes hacer algo dentro de él, incluso ejecutar un script. Esto le da mucha flexibilidad, pero tiene un precio: está cargando un shell, y luego ejecuta Binary dentro de él. Aunque no creo que cargar el shell sea responsable de tanta diferencia de tiempo (15 segundos es mucho, después de todo), ya que no parece que lo necesites, solo para ejecutar la aplicación, intenta usar algo del exec() familia en su lugar.

+0

Gracias. Tu respuesta es muy convincente. ¿Crees que la familia ejecutiva es más rápida? La razón por la que no usé execvp fue porque en el sistema podía hacer el sistema ("./ Binary argument1 argument2") ;, mientras que no podía hacerlo en execvp. Puedes decir. – user984260

+1

Bueno, simplemente no tener que cargar el intérprete de comandos e interpretar la línea de comando dada debería proporcionar un aumento de velocidad. Acerca de la línea de comando, no entendí, ¿qué dijo exactamente que no puede hacer? Puede pasarle argumentos, el único trabajo adicional es que debe colocar los argumentos en una matriz, si usa las variantes de execv, o al menos tener el nombre binario en una cadena separada, si usa las variantes execl. Esas cosas se pueden hacer, por ejemplo, con strtok. –

+0

Gracias. Yo veo y sigo. – user984260

0

Sin perfil de la aplicación, si el proceso principal que se bifurca tiene un gran espacio de memoria, puede encontrar que hay tiempo dedicado a intentar bifurcar el proceso e intenta duplicar el espacio de la memoria.

Esto no es un problema en Red Hat Enterprise Linux 6, pero era en versiones anteriores de Red Hat Enterprise Linux 5.

Cuestiones relacionadas