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.