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 >
Text File  |  1998-01-11  |  6KB  |  208 lines

  1.  
  2. SECONDA ESERCITAZIONE DI SISTEMI OPERATIVI 1997-1998
  3. FACOLTATIVA
  4.  
  5. Si chiede di realizzare un sistema parallelo con un insieme minimo di
  6. funzionalita', come descritto nella sezione: Macchina Parallela
  7. Virtuale (MPV).
  8. Deve essere consegnato un floppy contenente i file sorgente, compreso
  9. il test proposto e completato, e i file eseguibili, assieme ad una
  10. documentazione cartacea.
  11.  
  12. Data di scadenza: venerdi' 30 gennaio 1998.
  13.  
  14. Inserire il materiale in una busta chiusa con sopra scritti numero del
  15. gruppo e nome-cognome-login di ogni componente e consegnarla IN PORTINERIA.
  16. Tutto il materiale consegnato (documentazione e dischetti) dovra' essere
  17. identificato allo stesso modo (onde evitare disastri se qualcosa cadesse
  18. per terra, si rimescolasse il contenuto delle buste ecc). 
  19.  
  20. Documentazione
  21. --------------
  22. La documentazione, contenente il listato dei file, puo' essere consegnata
  23. manoscritta (purche' chiara e leggibile) oppure scritta con word
  24. processors, oppure meta' e meta',  ecc.  Essa  deve essere sintetica,
  25. massimo 1 pagina, e contenere una "copertina" che riporti nome, cognome,
  26. login e firma dei componenti il gruppo che hanno effettivamente svolto
  27. l'esercitazione.  
  28.  
  29. Nel testo della documentazione devono essere presenti in modo chiaro e
  30. sintetico le informazioni necessarie per ricreare il programma.
  31.  
  32.  
  33. ========================================
  34.  
  35. Macchina Parallela Virtuale
  36. ===========================
  37.  
  38. Dal punto di vista dell'utente:
  39. Si vuole avere a disposizione una macchina parallela formata da piu' nodi
  40. per eseguire programmi distribuiti.
  41. Ogni processo ha un singolo identificatore indicato come "tid" (task
  42. identifier) nella macchina virtuale.
  43. Ogni nodo esegue un solo processo MPV.
  44.  
  45. 1. Si scrive nel file "mpv_config" il numero di nodi (num_nodi) seguito
  46.    dal loro nome. Ad esempio:
  47.  
  48.         4
  49.         pluto
  50.         pippo
  51.         orazio
  52.         minnie
  53.  
  54.    Il file deve essere leggibile su tutte le macchine elencate.
  55.    Il primo nodo e' il master, attivato per primo.
  56.    La macchina puo' contenere al massimo 32 nodi.
  57.  
  58. 2. Si lancia il programma utente sul nodo master della MPV.
  59.  
  60. 3. Si puo' scrivere un programma che attiva diversi processi (al massimo
  61.    1 per ogni nodo) utilizzando 4 funzioni della libreria mpvlib (tutte
  62.    bloccanti):
  63.  
  64.    a. mpv_enroll(&mytid, &num_nodi);
  65.       -----------------------------
  66.       E' la prima funzione di MPV che DEVE essere chiamata da ogni
  67.       processo, quindi prima di ogni altra.
  68.       Restituisce il tid del processo e il numero di nodi della
  69.       macchina.
  70.  
  71.    b. tid = mpv_spawn (nome_eseguibile);
  72.       ---------------------------------
  73.       Puo' essere richiesta solo dal processo sul nodo master.
  74.       Attiva 1 processo sul primo nodo libero della macchina parallela
  75.            (a partire dalla seconda macchina del file mpv_config)
  76.       nome eseguibile: nome del file eseguibile (deve essere presente
  77.            tutti i nodi)
  78.       tid: tid del processo attivato. Se <0 errore (sono stati gia'
  79.            attivati num_proc-1 processi, e quindi non ne possono essere
  80.            attivati altri, oppure non e' il nodo master).
  81.  
  82.    c. mpv_send (tid, &msg, num_byte);
  83.       ------------------------------
  84.       Invia il messaggio msg formato da num_byte byte al processo tid.
  85.  
  86.    d. mpv_recv (&tid, &msg, &num_byte);
  87.       --------------------------------
  88.       Riceve un messaggio msg formato da num_byte byte dal processo tid.
  89.  
  90. Non riportare altri errori d'uso oltre a quelli esposti esplicitamente
  91. sopra.
  92.  
  93.  
  94. ESEMPIO
  95. =======
  96.  
  97. Programma utente da lanciare su master MPV.
  98. Il file eseguibile si chiama "master".
  99. Calcola il massimo di un array di numeri.
  100. Da completare.....
  101.  
  102. #include "pvm.h"
  103. #define SLAVENAME "slave"        /* esecutable file */
  104.  
  105. main()
  106. {
  107.    int  mytid;          /* my MPV id */
  108.    int  tids[31];       /* slave task ids */
  109.    int  num_nodi;       /* cardinality of MPV */
  110.    int  i, num, max;
  111.    int  data[10], results[31];  /* application dependent data */
  112.  
  113.    /* enroll in MPV */
  114.    mpv_entroll(&mytid, &num_nodi);
  115.  
  116.    /* start up slave tasks */
  117.    for (i=1; i<num_nodi; i++)
  118.         tid[i] = mpv_spawn (SLAVENAME);
  119.  
  120.    /* begin user program */
  121.    for (i=1; i<num_nodi; i++)
  122.      { 
  123.        initialize_data(data, 10);   /* to be completed */
  124.        mpv_send (tids[i], data, sizeof(data));
  125.      }
  126.  
  127.    /* wait for results from slaves */
  128.    for (i=1; i<num_nodi; i++)
  129.        mpv_recv (&tids[i], &results[i], &num);
  130.  
  131.  
  132.    /* prints results */
  133.    for (i=1; i<num_nodi; i++)
  134.      printf("ricevuto risultato %d da processo %d \n",
  135.              results[i], tids[i]);
  136.  
  137.    max=search_max(results, num_nodi-1);
  138.    printf("\n massimo = %d \n", max);
  139.  
  140.    /* mpv_exit()  not implemented.
  141.       stop MPV !!!!            */
  142.  
  143.    exit(0);
  144. }
  145.  
  146. Codice "slave" di un processo slave
  147.  
  148. #include "pvm.h"
  149.  
  150. main()
  151. {
  152.    int  num, mytid, from_tid;
  153.    int  data[10], result;       /* application dependent data */
  154.    int  num_nodi; 
  155.  
  156.    /* enroll in MPV */
  157.    mpv_enroll(&mytid, &num_nodi);
  158.  
  159.    /* receive data */
  160.    mpv_recv(&from_tid, data, &num);
  161.  
  162.    result=search_max(data, 10);
  163.  
  164.    /* reply result */
  165.    mpv_send (from_tid, data, sizeof(data));
  166.  
  167.    sleep(4);   /* tapullo */
  168.  
  169. }
  170.  
  171.    
  172. =========================================
  173.  
  174.  
  175. IMPLEMENTAZIONE
  176. ===============
  177.  
  178. La porta X000 (X001) sta per "numero_gruppo"000 (idem).
  179.  
  180. a. Funzione mpv_enroll(...);
  181.    - legge file mpv_config
  182.    - construisce l'array HOSTS contenente i nome dei nodi (ogni nodo
  183.      ha come identificatore l'indice nell'array, da 1 a num_nodi)
  184.    - myhost=indice del nodo all'interno della tavola HOSTS. 
  185.      Sara' anche l'identificatore unico (tid) del processo attivato 
  186.      su quel nodo.
  187.    - if myhost=1 then host_index=2.
  188.                  else send ACK to (HOSTS[1], port X000)
  189.    - attiva port X001
  190.    - ritorna myhost e num_nodi.
  191.  
  192. b. funzione mpv_spawn(...);
  193.    if (host_index>num_nodi) or (myhost<>1)
  194.       then return -1
  195.       else
  196.         lancia "nome_eseguibile" su HOSTS(host_index);
  197.         receive ACK from port X000;
  198.         return host_index;
  199.         host_index=host_index+1;
  200.  
  201. c. funzione mpv_recv(...);
  202.    riceive msg from port X001;
  203.    return index in HOSTS s.t. HOSTS(index)=from_host;
  204.    return msg and sizeof(msg).
  205.  
  206. d. funzione mpv_send(...);
  207.    invia messaggio a (HOSTS(tid), portX001);
  208.