PVM (Parallel Virtual Machine, Máquina Virtual Paralela)
PVM significa “Parallel Virtual Machine”, es relativamente nuevo ya que sus inicios se remontan al verano de 1989 en el Oak Ridge National Laboratory.
PVM consiste en un software y un conjunto de librerías, que permiten establecer una colección de uno o más sistemas de computación, con el fin de poder integrar dichos sistemas en un esquema de una sola máquina virtual (PVM: Parallel Virtual Machine - Máquina virtual en paralelo).
PVM opera sobre diferentes plataformas de UNIX y también de Windows 9x, la cantidad de plataformas en las que puede correr el ambiente de PVM es muy variada y abundante. PVM puede establecerse en cualquier esquema de red heterogénea, sobre todo en el ambiente de Internet, como se puede apreciar en la gráfica anterior.
PVM brinda rutinas en lenguajes C y en Fortran para procesos como paso de mensajes asíncronamente y para control de procesos; además de ofrecer un paralelismo escalable, entre otras muchas ventajas que ofrece.
A pesar de que PVM no es un estándar, es sumamente popular para realizar y desarrollar aplicaciones científicas complejas que requieren un esquema de programación en paralelo, dada su compatibilidad en sistemas operativos es sumamente portable y fácil de instalar, además de que PVM consiste en un esquema pequeño de código de computadora.
Ventajas:
Portabilidad: Es probablemente la librería de paso de mensajes más portable que existe
Paralelismo Escalable: PVM permite definir cuantos procesadores puede utilizar una aplicación, en caso de que falten procesadores, PVM realiza el trabajo en menos procesadores, recurriendo a técnicas de procesamiento concurrente.
Tolerancia A Fallas A Partir De Añadir O Borrar Procesos Anfitriones (Host).
Fácil de instalar y de usar.
Popular: Es una de las librerías de paso de mensajes más fáciles y óptimas.
Flexible: Puede incorporar casi cualquier computadora que funcione bajo UNIX: (Obviamente con cuenta de acceso), para incorporarla fácilmente al esquema de la máquina virtual.
Desventajas:
Desempeño: Como PVM es un esquema heterogéneo de computadoras, dependiendo de la capacidad de procesamiento de las computadoras vinculadas al esquema de la máquina virtual, su desarrollo puede verse mermado o incrementado, según sea el poder de cómputo de las computadoras anfitrionas.
Cuenta con un esquema no estandarizado: PVM no es un estándar (como lo es MPI).
Es algo deficiente en cuanto al paso de mensajes se refiere.
Configuración
Para explicar este punto nos vamos a vasar en los sistemas operativos UNIX.
Cada ordenador debe de estar ejecutando el demonio pvmd.
PVM requiere de cierta configuración para cada usuario. Es necesario crear un archivo .rhosts en el directorio HOME de cada usuario que quiera ejecutar programas bajo PVM.
El archivo .rhosts debe contener una línea por cada ordenador que va formar parte de la máquina virtual. Además debe incluir el nombre de usuario que se utilizara en cada una de ellas.
Ejemplo:
maquina1 username1
maquina2 username2
maquina3 username3
maquina4 username4
Además, se debe crear el directorio pvm3/bin/LINUX en el directorio HOME y colocar ahí los programas.
Para configurar la MV utilizamos el programa “pvm” en cualquiera de los ordenadores que forman parte de la MV.
Nos aparecerá un promt donde podremos introducir comandos para interactuar con la MV.
Los comandos más interesantes son: add/delete hostname: Añade/Quita el ordenador con nombre hostname a la máquina virtual.
conf: Para ver la configuración actual.
ps –a: Para ver los procesos en ejecución en la máquina virtual.
quit: Para salir de la consola pero dejar la máquina virtual activa.
halt: Para detener la máquina virtual y salir de la consola.
Las librerías de PVM (pvmd3)
Las tres librerías de PVM son las siguientes:
- libpvm3.a.- Esta librería brinda una gran cantidad de rutinas escritas en lenguaje C. Esta rutina siempre es requerida.
- libfpvm3.a.- Librería adicional que se requiere en caso de que la aplicación escrita en PVM utiliza código de Fortran.
- libgpvm.a.- Librería requerida en caso de usar grupos dinámicos.
Las citadas libreras contienen subrutinas sencillas que son incluidas en el código de aplicación escrito en PVM. Proveen las herramientas suficientes como para realizar acciones tales como el iniciado y borrado de procesos, el empaquetamiento, desempaqueta miento y recepción de mensajes, sincronización vía barrera (synchronize via barriers) y configuración dinámica de la máquina virtual.
Ejemplo:
Un programa maestro es ejecutado por el usuario en uno de los computadores. Este programa provoca la ejecución de programas esclavos en otros computadores de la máquina virtual y son éstos los que llevan a cabo el trabajo. Una vez que han finalizado reportan sus resultados al maestro. Para efectos del ejemplo, los programas esclavos simplemente envían un mensaje con información local al maestro, el cual la desplegará por la pantalla.
Programa maestro (master.c):
#include <stdio.h>
#include <pvm3.h>
main() {
struct pvmhostinfo *hostp;
int result, check, i, nhosts, narch, stid;
char buf[64];
pvm_setopt(PvmRoute, PvmRouteDirect); /* canal para comunicacion */
gethostname(buf, 20); /* obtiene nombre del maestro */
printf("El programa maestro se ejecuta en %s\n", buf); /* Obtiene y despliega la configuracion de la
maquina paralela */
pvm_config(&nhosts, &narch, &hostp); /* Obtiene configuracion */
printf("Se encontraron los siguientes computadores en la maquina paralela:\n");
for (i=0; i<nhosts; i++)
printf("\t%s\n", hostp[i].hi_name);
/* Ejecuta los procesos en todas las maquinas */
for (i=0; i<nhosts; i++) {
check = pvm_spawn("slave", 0, PvmTaskHost, hostp[i].hi_name, 1, &stid);
if (!check)
printf("No se pudo iniciar proceso en %s\n", hostp[i].hi_name);
}
/* Espera las respuestas de todas las maquinas e imprime su contenido */
result=0;
while (result<nhosts) {
pvm_recv(-1, 2); /* Espera por mensaje de respuesta */
pvm_upkstr(buf); /* Desempaca el mensaje */
printf("%s\n", buf); /* Despliega el contenido en pantalla */
result++; /* Siguiente mensaje */
}
pvm_recv(-1, 2); /* Espera por mensaje de respuesta */
}
Programa esclavo (slave.c):
#include <stdio.h>
#include <pvm3.h>
#include <time.h>
main() {
time_t now;
char name[12], buf[60];
int ptid;
ptid = pvm_parent(); /* El ID del proceso maestro */
pvm_setopt(PvmRoute, PvmRouteDirect);
gethostname(name, 64); /* Obtiene nombre de la maquina */
now = time(NULL); /* Obtiene hora de la maquina */
strcpy(buf, name); /* Coloca el nombre en el string */
strcat(buf, "'s time is ");
strcat(buf, ctime(&now)); /* Agrega la hora al string */
pvm_initsend(PvmDataDefault); /* Asigna buffer para el mensaje */
pvm_pkstr(buf); /* Empaca el string en el buffer */
pvm_send(ptid, 2); /* Envia el buffer al maestro */
pvm_exit; /* Esclavo finalizando */
}
No hay comentarios:
Publicar un comentario