Búsqueda personalizada

viernes, 18 de enero de 2008

Funciones Pvm

a) Control de procesos

pvm_mytid():Esta función incorpora a la PVM al proceso que la invoca, propor

cionándole un número de tarea único en toda la máquina virtual,

denominado tid. Esta función debe ser la primera rutina que se in

voque antes de cualquier otra.

pvm_exit(): Comunica al demonio local que el proceso está abandonando la

PVM. Esta primitiva no elimina el proceso en sí, sino que éste

continúa pero como un proceso convencional de UNIX.

pvm_spawn():Inicializa un conjunto de tareas que se incorporarán a la PVM.

Para determinar en qué EP se van a crear estas nuevas tareas, la

heurística utilizada podría estar diseñada en función de las medi

das de carga de los EP de la PVM y de la capacidad de cómputo

de los mismos. La función devuelve el número de tareas creadas

en una o más máquinas de la configuración.

Si las tareas han sido inicializadas correctamente, como pará

metro de salida, devuelve un vector con los tids y en caso que

alguna tarea no haya podido ser inicializada, devuelve en su

correspondiente componente del vector, un código de error,

indicando el motivo por el que no ha podido iniciarse dicha

tarea.

pvm_kill(): Elimina de la PVM la tarea identificada por el parámetro tid.

b) Información de la máquina virtual

pvm_parent(): Devuelve el tid del proceso que creó la tarea que invoca a esta

función. Si existe algún error devuelve un error tipo

PvmNoParent.

pvm_pstat(): Devuelve el estado de una tarea PVM identificada por tid.

Devuelve PvmOk si la tarea está en ejecución, PvmNoTask si no

lo está, y PvmBadParam si el tid es incorrecto.

pvm_mstat(): Devuelve PvmOk si el EP está ejecutando tareas PVM,

PvmHostFail si no es posible acceder al EP, o PvmNoHost si ese

EP no está en la PVM. Esta función es útil en el diseño de

aplicaciones tolerantes a fallos. En todo momento se puede

interrogar por el estado de cualquiera de las máquinas

involucradas en la maquina virtual

pvm_config(): Devuelve información acerca de la PVM, incluyendo el número

de EPs, tipo de arquitecturas, etc.

pvm_tasks(): Devuelve información sobre las tareas en ejecución en la PVM.

c) Configuraciones dinámicas

pvm_addhost (), pvm_delhost () :Estas primitivas permiten añadir o eliminar

un EP de la configuración inicial de la PVM.

d) Primitivas de señalización

pvm_sendsig(): Envía la señal signum a otra tarea PVM identificada por un tid.

pvm_notify(): Provoca el envío de un mensaje a una serie de tareas

especificadas, al ocurrir un evento en la PVM. Los posibles

eventos que pueden ocurrir son: una tarea ha finalizado, una

máquina ha caído o ha sido eliminada, o si se ha añadido una

nueva máquina.

e) Primitivas de mensajes de error

pvm_error(): Imprime el estado de error de la última primitiva PVM.

pvm_serror(): Seleccionar esta rutina permite enviar mensajes de error de

forma automática, y de esta forma cualquier error que se

produzca, automáticamente notificará el mensaje de error

asociado.

f) Envío y recepción de mensajes

El envío de mensajes conlleva los pasos siguientes:

· Se debe inicializar un buffer de envío a través de una primitiva particular.

· Los datos que van a ser enviados deben ser empaquetados (primitivas de

empaquetado).

· El mensaje se envía a otro proceso (primitivas de emisión).

Un mensaje podrá ser recibido a través de una primitiva de recepción con o sin

bloqueo. Después se debe desempaquetar cada elemento del mensaje. En la PVM, sólo existe un buffer de envío y otro de recepción activos por cada proceso en un instante dado. El usuario es responsable de gestionar qué tipo de mensaje está activo en cada momento, pudiendo crear los que sean necesarios.

pvm_mkbuf(): Crea un buffer de envío vacío y especifica un código para

designarlo. Existen varias opciones para la codificación de

los datos en este mensaje, dependiendo del valor de la

constante encoding:

· PvmDataDefault. Codificación estándar XDR.

· PvmDataRaw. No realizar codificación.

· PvmDataInPlace. Los datos se quedan en el mismo EP.

pvm_initsend(): Limpia el buffer de envío y lo prepara para empaquetar

nuevos datos. Esta primitiva debe ejecutarse antes de

empaquetar los datos. Los valores de encoding son los

mismos que en la función anterior.

pvm_freebuf(): Elimina el buffer identificado por el parámetro bufid. Se

debe ejecutar esta primitiva siempre que se deje de utilizar

este buffer.

pvm_getsbuf(): Devuelve el número del buffer de envío activo en ese

momento.

pvm_getrbuf(): Devuelve el número del buffer de recepción activo.

pvm_setsbuf(): Selecciona el nuevo buffer de envío activo y devuelve el

identificador del anterior.

pvm_setrbuf(): Selecciona el nuevo buffer de recepción activo, retornando el

identificador del anterior. El empaquetado de los datos se

realiza con diferentes primitivas que empaquetan un

conjunto de elementos del mismo tipo en el buffer de envío

activo. Estas primitivas pueden ser llamadas múltiples veces

y en cualquier orden. De esta forma, un mensaje puede

contener varios vectores de datos de distintos tipos. No

existen restricciones relativas a cuan complejos pueden ser

estos mensajes. La única condición que existe es que se

deben desempaquetar en el mismo orden en que fueron em

paquetados. Se dispone de primitivas para empaquetar

bytes, enteros, reales, complejos, caracteres, etc.

El envío y recepción de datos se lleva a cabo con las siguientes primitivas.

pvm_send(): Esta primitiva etiqueta un mensaje con un valor entero,

msgtag, que indica un número de mensaje, y lo envía a una

tarea especificada por un tid.

pvm_mcast(): Etiqueta el mensaje con un identificador entero, msgtag, y lo

envía a las tareas especificadas por tids.

pvm_nrecv(): Recepción sin bloqueo. Si el mensaje solicitado no ha sido

recibido, esta primitiva devuelve un cero. Esta rutina puede

ser invocada repetidamente para solicitar el mensaje y

comprobar si ha llegado. Mientras el mensaje llega, se

puede seguir realizando otro trabajo entre dichas llamadas.

Si llega un mensaje con etiqueta específica desde una tarea

tid concreta, entonces se colocará el mensaje en el buffer

activo.

pvm_recv(): Primitiva de recepción con bloqueo. Espera hasta que un

mensaje con la etiqueta especificada y/o con tid

determinado haya llegado.

pvm_bufinfo(): Devuelve información acerca del mensaje con el

identificador especificado.

pvm_recvf(): Uso de definiciones propias de la primitiva de recepción de

mensajes.

g) Primitivas de grupos de procesos

Estas funciones permiten controlar un conjunto de procesos que por cuestiones del problema a resolver, interesa que estén agrupadas. Cuestiones como la sincronización de los procesos, se pueden realizar permitiendo que todos los procesos pertenezcan a un grupo. Dentro de un grupo, se pueden realizar diferentes funciones que aquí comentamos. Cualquier tarea PVM puede incorporarse o abandonar un grupo de procesos en cualquier momento sin tener que informar al resto de tareas del grupo.

pvm_joingroup (): Permite que una tarea se incorpore al grupo. Crea un

grupo con el nombre especificado y asigna la tarea a ese

grupo. A cada tarea, al incorporarse a un grupo, se le

asigna un número, a través del cual se gestionan los

grupos.

pvm_lvgroup(): Una tarea abandona un grupo invocando a esta primitiva.

En caso de volver a incorporarse, el número asignado

será posiblemente distinto al que tenía anteriormente.

Los números se asignan dinámicamente.

pvm_gettid(): Devuelve el tid del proceso que está en un grupo con un

número determinado.

pvm_getinst(): Devuelve el número que tiene una tarea dentro de un grupo.

pvm_gsize(): Devuelve el número de miembros que existen en un grupo.

pvm_barrier(): Cuando se invoca a esta función, el proceso se bloquea en

espera de que todas las tareas implicada ejecuten esta

función.

pvm_cast(): Etiqueta un mensaje con un identificador entero, y envía el

mensaje a todas las tareas de un grupo determinado. Si una

tarea se incorpora a un grupo durante la llegada de este

tipo de mensajes, podría no recibirlo.

0 comentarios: