Questo sito utilizza cookies solo per scopi di autenticazione sul sito e nient'altro. Nessuna informazione personale viene tracciata. Leggi l'informativa sui cookies.
Username: Password: oppure
Algoritmi - Esercizio di sincronizzazione..
Forum - Algoritmi - Esercizio di sincronizzazione..

Avatar
comtel (Member)
Pro


Messaggi: 145
Iscritto: 08/04/2011

Segnala al moderatore
Postato alle 12:27
Venerdì, 18/05/2018
Buongiorno, per la preparazione ad un esame universitario sto svolgendo alcuni esercizi di sincronizzazione. La traccia di uno di questi è la seguente:

Un servizio di pool-car ha a disposizione N automobili, ognuna assegnata ad una zona della città. Gli utenti del servizio si recano al punto di partenza e prenotano un posto sull'automobile per la zona desiderata. Ogni automobile ha a disposizione M posti. Una volta occupati gli M posti, il veicolo parte per la zona stabilita. Nel caso in cui sia trascorso un tempo T, a partire dalla prima prenotazione per una determinata zona, il veicolo parte per la zona assegnata. Nel caso in cui non ci siano posti disponibili su un veicolo, gli utenti in eccesso si mettono in attesa della prossima corsa per la zona desiderata.

La mia implementazione in uno pseudo-linguaggio è la seguente, e desidererei conoscere il vostro parere e gli eventuali (certi) errori di logica in essa:

Codice sorgente - presumibilmente Delphi

  1. // Dichiarazioni delle variabili e delle strutture dati condivise tra i processi.
  2.  
  3. mutex: semaforo binario:= 1;
  4. mutex1: semaforo binario:= 1;
  5. tempo: int:= 10;
  6.  
  7. struct AUTO {
  8.         cont_posti: int:= M;
  9.         posti: semaforo generico:= M;
  10.         piena: semaforo binario:= 0;
  11. } auto;
  12. auto automobili[N];
  13.  
  14. PROCESSO UTENTE i:
  15.         repeat
  16.                 begin
  17.                         wait(mutex);  
  18.                         if(automobili[ 0 <= i <= N].cont_posti > 0)
  19.                                 // Nel caso in cui ci sono dei posti disponibili per quella vettura, allora l’utente
  20.                                 // se ne impossessa di uno. Inoltre decrementiamo il semaforo generico in modo
  21.                                 // che quando questo arriva a 0, tutti gli altri utenti dovranno attendere su di
  22.                                 // esso per poter usufruire della vettura.
  23.  
  24.                                 automobili[ 0 <= i <= N].cont_post;
  25.                                 wait(automobili[ 0 <= i <= N].posti);
  26.                         else
  27.                                 signal(mutex);
  28.                                 wait(automobili[ 0 <= i <= N].posti);
  29.                         end if
  30.                         signal(mutex);
  31.                 end
  32.         forever
  33. FINE PROCESSO
  34.  
  35. PROCESSO AUTO j:
  36.         repeat
  37.                 begin
  38.                         for (i to tempo)
  39.                                 if(automobili[ 0 <= i <= N].cont_posti < M-1 AND automobili[ 0 <= i <= N].cont_posti != 0)
  40.                                         sleep(tempo);
  41.                                         signal(automobili[ 0 <= i <= N].piena);
  42.                                         break;
  43.                                 end if
  44.                         end for
  45.                        
  46.                         // Nel caso in cui l’auto venga schedulata dopo che tutti i posti sono stati presi, allora si deve
  47.                         // segnalare che l’auto è piena e pronta a partire.
  48.  
  49.                         if(automobili[ 0 <= i <= N].cont_posti == 0)
  50.                                 signal(automobili[ 0 <= i <= N].piena);
  51.                         end if
  52.  
  53.                         wait(automobili[ 0 <= i <= N].piena);
  54.                         viaggia per un tempo Q qualsiasi;
  55.  
  56.                         // Quando l’auto ritorna, allora deve essere svuotata e quindi le variabili precedenti ed i semafori
  57.                         // devono essere riportati ai valori precedenti.
  58.  
  59.                         wait(mutex1);
  60.                         for(i to M)
  61.                                 automobili[ 0 <= i <= N].cont_posti++;
  62.                                 signal(automobili[ 0 <= i <= N].posti);
  63.                         end for
  64.                         signal(mutex1);
  65.                 end
  66.         forever
  67. FINE PROCESSO


PM Quote