Máquina Virtual Paralela
La Máquina Virtual Paralela (conocida como PVM
por sus siglas en inglés de Parallel Virtual Machine) es una biblioteca
para el cómputo paralelo en un sistema distribuido de computadoras. Está diseñado
para permitir que una red de computadoras heterogénea comparta sus recursos de
cómputo (como el procesador y la memoria RAM) con el fin de aprovechar esto para disminuir el
tiempo de ejecución de un programa al distribuir la carga de trabajo en varias
computadoras.
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.
Opera sobre diferentes plataformas de UNIX y Windows,
sobretodo en el ambiente de Internet.
Ventajas
Es
una de las librerías de paso de mensajes más fáciles de usar.
Flexible:
Control arbitrario de dependencia de estructuras.
La aplicación decide:
Ø Donde y cuando
ejecutar o terminar las tareas.
Ø Que maquinas se añaden
o se eliminan desde la máquina virtual paralela.
Ø Que tareas se pueden
comunicar y/o sincronizar con otras.
Flexible:
Control arbitrario de dependencia de estructuras.
Desventajas
v
Al
ser un esquema heterogéneo de ordenadores, el rendimiento depende de la
capacidad de procesamiento de los ordenadores vinculados al esquema de la máquina
virtual (lo que era una ventaja tiene una su desventaja).
v
Es
algo deficiente en cuanto al paso de mensajes se refiere.
Configuración
Ø
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: Anade/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.
Áreas
de Aplicación:
Es muy utilizado para realizar y desarrollar
aplicaciones científicas complejas que requieren un esquema de programación en
paralelo, dada su compatibilidad entre sistemas operativos, es muy portable y fácil
de instalar.
Ejemplo:
El
ejemplo que se muestra a continuación es una aplicación PVM que se ha separado
en dos tipos de programa.
Un
programa maestro es ejecutado por el usuario en una de las computadoras. Este
programa provoca la ejecución de programas esclavos en otras computadoras de la
máquina virtual y son estos los que llevan a cabo el trabajo. Una vez que han
analizado 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 desplegara por la pantalla.
El maestro hace lo siguiente:
Determina cuales computadores
forman parte de la máquina virtual
Inicia un proceso esclavo
en cada computadorRecolecta los resultados enviados por los esclavos
Despliega en pantalla la información recibida
El esclavo hace lo
siguiente:
Determina el nombre
del computador en que se está ejecutando
Determina la hora en
ese computadorEnvía un mensaje al maestro con la información anterior
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_exit; /* Maestro finalizando */
}
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 */
}