home
***
CD-ROM
|
disk
|
FTP
|
other
***
search
/
ftp.disi.unige.it
/
2015-02-11.ftp.disi.unige.it.tar
/
ftp.disi.unige.it
/
pub
/
.person
/
GianuzziV
/
SysOp
/
esame97
/
esercitazione_2.txt
< prev
next >
Wrap
Text File
|
1998-01-11
|
6KB
|
208 lines
SECONDA ESERCITAZIONE DI SISTEMI OPERATIVI 1997-1998
FACOLTATIVA
Si chiede di realizzare un sistema parallelo con un insieme minimo di
funzionalita', come descritto nella sezione: Macchina Parallela
Virtuale (MPV).
Deve essere consegnato un floppy contenente i file sorgente, compreso
il test proposto e completato, e i file eseguibili, assieme ad una
documentazione cartacea.
Data di scadenza: venerdi' 30 gennaio 1998.
Inserire il materiale in una busta chiusa con sopra scritti numero del
gruppo e nome-cognome-login di ogni componente e consegnarla IN PORTINERIA.
Tutto il materiale consegnato (documentazione e dischetti) dovra' essere
identificato allo stesso modo (onde evitare disastri se qualcosa cadesse
per terra, si rimescolasse il contenuto delle buste ecc).
Documentazione
--------------
La documentazione, contenente il listato dei file, puo' essere consegnata
manoscritta (purche' chiara e leggibile) oppure scritta con word
processors, oppure meta' e meta', ecc. Essa deve essere sintetica,
massimo 1 pagina, e contenere una "copertina" che riporti nome, cognome,
login e firma dei componenti il gruppo che hanno effettivamente svolto
l'esercitazione.
Nel testo della documentazione devono essere presenti in modo chiaro e
sintetico le informazioni necessarie per ricreare il programma.
========================================
Macchina Parallela Virtuale
===========================
Dal punto di vista dell'utente:
Si vuole avere a disposizione una macchina parallela formata da piu' nodi
per eseguire programmi distribuiti.
Ogni processo ha un singolo identificatore indicato come "tid" (task
identifier) nella macchina virtuale.
Ogni nodo esegue un solo processo MPV.
1. Si scrive nel file "mpv_config" il numero di nodi (num_nodi) seguito
dal loro nome. Ad esempio:
4
pluto
pippo
orazio
minnie
Il file deve essere leggibile su tutte le macchine elencate.
Il primo nodo e' il master, attivato per primo.
La macchina puo' contenere al massimo 32 nodi.
2. Si lancia il programma utente sul nodo master della MPV.
3. Si puo' scrivere un programma che attiva diversi processi (al massimo
1 per ogni nodo) utilizzando 4 funzioni della libreria mpvlib (tutte
bloccanti):
a. mpv_enroll(&mytid, &num_nodi);
-----------------------------
E' la prima funzione di MPV che DEVE essere chiamata da ogni
processo, quindi prima di ogni altra.
Restituisce il tid del processo e il numero di nodi della
macchina.
b. tid = mpv_spawn (nome_eseguibile);
---------------------------------
Puo' essere richiesta solo dal processo sul nodo master.
Attiva 1 processo sul primo nodo libero della macchina parallela
(a partire dalla seconda macchina del file mpv_config)
nome eseguibile: nome del file eseguibile (deve essere presente
tutti i nodi)
tid: tid del processo attivato. Se <0 errore (sono stati gia'
attivati num_proc-1 processi, e quindi non ne possono essere
attivati altri, oppure non e' il nodo master).
c. mpv_send (tid, &msg, num_byte);
------------------------------
Invia il messaggio msg formato da num_byte byte al processo tid.
d. mpv_recv (&tid, &msg, &num_byte);
--------------------------------
Riceve un messaggio msg formato da num_byte byte dal processo tid.
Non riportare altri errori d'uso oltre a quelli esposti esplicitamente
sopra.
ESEMPIO
=======
Programma utente da lanciare su master MPV.
Il file eseguibile si chiama "master".
Calcola il massimo di un array di numeri.
Da completare.....
#include "pvm.h"
#define SLAVENAME "slave" /* esecutable file */
main()
{
int mytid; /* my MPV id */
int tids[31]; /* slave task ids */
int num_nodi; /* cardinality of MPV */
int i, num, max;
int data[10], results[31]; /* application dependent data */
/* enroll in MPV */
mpv_entroll(&mytid, &num_nodi);
/* start up slave tasks */
for (i=1; i<num_nodi; i++)
tid[i] = mpv_spawn (SLAVENAME);
/* begin user program */
for (i=1; i<num_nodi; i++)
{
initialize_data(data, 10); /* to be completed */
mpv_send (tids[i], data, sizeof(data));
}
/* wait for results from slaves */
for (i=1; i<num_nodi; i++)
mpv_recv (&tids[i], &results[i], &num);
/* prints results */
for (i=1; i<num_nodi; i++)
printf("ricevuto risultato %d da processo %d \n",
results[i], tids[i]);
max=search_max(results, num_nodi-1);
printf("\n massimo = %d \n", max);
/* mpv_exit() not implemented.
stop MPV !!!! */
exit(0);
}
Codice "slave" di un processo slave
#include "pvm.h"
main()
{
int num, mytid, from_tid;
int data[10], result; /* application dependent data */
int num_nodi;
/* enroll in MPV */
mpv_enroll(&mytid, &num_nodi);
/* receive data */
mpv_recv(&from_tid, data, &num);
result=search_max(data, 10);
/* reply result */
mpv_send (from_tid, data, sizeof(data));
sleep(4); /* tapullo */
}
=========================================
IMPLEMENTAZIONE
===============
La porta X000 (X001) sta per "numero_gruppo"000 (idem).
a. Funzione mpv_enroll(...);
- legge file mpv_config
- construisce l'array HOSTS contenente i nome dei nodi (ogni nodo
ha come identificatore l'indice nell'array, da 1 a num_nodi)
- myhost=indice del nodo all'interno della tavola HOSTS.
Sara' anche l'identificatore unico (tid) del processo attivato
su quel nodo.
- if myhost=1 then host_index=2.
else send ACK to (HOSTS[1], port X000)
- attiva port X001
- ritorna myhost e num_nodi.
b. funzione mpv_spawn(...);
if (host_index>num_nodi) or (myhost<>1)
then return -1
else
lancia "nome_eseguibile" su HOSTS(host_index);
receive ACK from port X000;
return host_index;
host_index=host_index+1;
c. funzione mpv_recv(...);
riceive msg from port X001;
return index in HOSTS s.t. HOSTS(index)=from_host;
return msg and sizeof(msg).
d. funzione mpv_send(...);
invia messaggio a (HOSTS(tid), portX001);