• Publicidad

Ejecución y sincronización de varias llamadas al S.O.

¿Ya sabes lo que es una referencia? Has progresado, el nível básico es cosa del pasado y ahora estás listo para el siguiente nivel.

Ejecución y sincronización de varias llamadas al S.O.

Notapor miguialberto » 2009-05-04 11:06 @504

Hola,

tengo un problema de "diseño" de un programa en Perl que no sé cómo se puede solucionar.

Tengo un script en Perl llamado "General.pl". Este script llama mediante la función system() a un segundo script Perl llamado "Secundario.pl". "General.pl" tiene que esperar a que acabe la ejecución de "Secundario.pl" para poder continuar. "Secundario.pl" tarda alrededor de una hora en ejecutarse.

El problema que tengo es que ahora necesito llamar tres veces a "Secundario.pl". Si las llamadas son una detrás de otra necesitaré cerca de 3 horas hasta que acaben, así que lo que quiero es hacer las llamadas en paralelo para tardar solo 1 hora.

Mi duda es que cómo puedo sincronizar en Perl estas tres llamadas a "Secundario.pl" para saber cuando han terminado y poder continuar.

La primera idea que se me ha pasado es que "Secundario.pl" escriba en archivo de texto cuando ha terminado. Haciendo una encuesta al archivo puedo saber cuándo han finalizado, pero no termina de parecerme muy elegante este método...

Además quiero hacerlo sin usar ningún modulo especial de Perl...

¿Alguien me puede echar una mano?

¡¡Gracias por adelantado!!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Publicidad

Notapor explorer » 2009-05-04 12:49 @576

Solo vas a obtener esa ventaja si tienes más de un procesador o núcleo en el sistema. Si solo tienes uno, no conseguirás ninguna mejora.

En Perl, puedes usar la función fork() para crear procesos hijos, y, de esa manera, cada uno de ellos arrancará un proceso distinto. Con la función wait() podrás esperar la terminación de todos ellos.

Es una lástima que no quieras usar un módulo de Perl, porque Parallel::ForkManager te viene como anillo al dedo.

Si no quieres instalarlo, te vale con estudiar y copiar su código fuente... pero entonces... te da lo mismo instalarlo :)
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor miguialberto » 2009-05-05 09:45 @448

¡Gracias! Voy a probarlo a ver si con el wait() me vale ¡y te comento qué tal me funciona!
miguialberto
Perlero nuevo
Perlero nuevo
 
Mensajes: 44
Registrado: 2008-07-28 06:13 @301

Notapor Jenda » 2009-05-09 05:26 @268

No es verdad, Explorer. Quizás el Secundario.pl queda la mayoría del tiempo esperando a algo. Una respuesta del servidor de web o una base de datos... y en ese caso no importa el número de procesadores o núcleos. Solo en el caso que el secundario.pl sólo lea y escriba datos al disco puede ser ventajoso llamarlo dos o tres veces. Para que cuándo uno espera a los datos del disco, otro puede computar.
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa

Notapor explorer » 2009-05-09 07:40 @361

Sí, eso quería decir: si miguialberto quiere llamar varias veces al proceso, y además, sabe que la ejecución en paralelo de esos procesos no se afectan o interfieren entre sí, entonces es normal poder ejecutarlos en paralelo.

Mi comentario iba más por lo de no ejecutar más procesos que procesadores o nucleos, ya que si pones demás, empezarán a competir entre ellos, y el tiempo de cambio de contexto entre procesos, por parte de las procesadores, será muy alto.

En una ocasión contaba con un ordenador con dos procesadores Xeon con dos núcleos cada uno de ellos (curiosamente, quitando el hyperthreading, iba todo más rápido).

En teoría, el número máximo de procesos corriendo a la vez era cuatro, pero... recordando que al menos uno de los procesadores necesitaba estar ocupado en las tareas administrativas y gráficas del ordenador, aparte de dar servicio al resto de procesos del sistema. Aun así, se puso el límite en cuatro, aun sabiendo que el cuarto proceso tardaría más de la cuenta.

Enseguida se vio que no era viable tener esos cuatro procesos:
1.- Competían en el acceso a memoria: no estaba activado el "Dual Channel" en las memorias RAM, ya que cada chip tenía una velocidad de refresco distinta

2.- Competían con la ocupación de memoria: si, en un momento dado, los procesos necesitaban memoria para sus cálculos, podía darse el caso de que la llegaban a agotar, empezando a usar la memoria de intercambio, agravando el paso 3.-

3.- Competían en el acceso a disco: si coincidían en el momento de la escritura y lectura a disco.

Después de unas cuantas jornadas de pruebas, se llegó a las siguientes conclusiones:

1.- Ejecutar 4 procesos de forma secuencial tardaba X minutos

2.- Ejecutar 4 procesos de forma paralela tardaba X*250% :shock: , y no estaba asegurada la terminación

3.- Ejecutar 4 procesos, tomando 3 de forma paralela tardaba X*90%

4.- Ejecutar 4 procesos, tomando 2 de forma paralela tardaba X*70%

(creo que he puesto las cifras correctas)

Así que la solución final fue la de impedir la ejecución de más de dos procesos simultáneos. Esto permitía ejecutar los procesos de forma rápida, y dejaba espacio para ejecutar otros procesos más secundarios.

Como conclusión final: que no solo hay que ver el número de procesadores, sino el resto de cuellos de botella: memoria, discos, interrupciones, etc.
JF^D Perl programming & Raku programming. Grupo en Telegram: https://t.me/Perl_ES
Avatar de Usuario
explorer
Administrador
Administrador
 
Mensajes: 14486
Registrado: 2005-07-24 18:12 @800
Ubicación: Valladolid, España

Notapor Jenda » 2009-05-10 07:17 @345

Eso todo depende de lo que hacen los procesos. Si quedan la mayoría del tiempo esperando a algo, es mejor ejecutar más a la vez. Si quedan la mayoría del tiempo computando, es mejor ejecutar menos. No se puede hacer una regla fácil y general. Hay que saber las tareas y la compu :-|
-------------------------------------------------------
- Estoy aquí para practicar español. Si te ayudó mi respuesta ayudame con un mensaje privado sobre mis faltas por favor. Seguramente habrá muchas :-)
Jenda
Perlero nuevo
Perlero nuevo
 
Mensajes: 132
Registrado: 2007-10-29 06:31 @313
Ubicación: Praga, Republica Checa


Volver a Intermedio

¿Quién está conectado?

Usuarios navegando por este Foro: No hay usuarios registrados visitando el Foro y 2 invitados

cron