Advertisement
Asynchronousx

Untitled

Apr 20th, 2018
69
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C 4.40 KB | None | 0 0
  1. 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 detemrminata zona, il veicolo parte per la zona assegnata. Nel caso in cui non ci siano pių posti disponibili su un veicolo, gli utenti in eccesso si mettono in attesa della prossima corsa per la zona desiderata.
  2.  
  3. Var
  4. N,M: int
  5. Automobile[N] = M : Array di Semaforo Contatore //Array di semafori contatori nel quale, ogni posizione equivarrà ad una zona (Array[0] = macchina 0 con M posti per la zona 0, ECC..)
  6. Partenza[N] = 0: Array di Semaforo Binario //Array di semafori binari che conta quale macchina sta partendo
  7. PronteAPartire[N] = 0: Array di interi // Array di interi inizializzato a 0 che farà capire al gestore quale auto vuole partire se il suo indice sia impostato ad 1
  8. Tornata[N] = 0: Array di semafori Binari // Array di semafori binari che tiene conto quando una macchina è in giro o è tornata in deposito
  9. Arrivo = 0: Semaforo binario //semaforo binario che tiene conto di quando una macchina arriva alla sua destinazione
  10. ContatoreFair: int //contatore che servirà al gestore per permettere a tutte le auto di partire prima o poi, controllando l'array delle pronte a partire in modo circolare
  11. UtentiAttendenti: int //contatore che indica quanti utenti stanno aspettando per una macchina che deve tornare dal giro
  12. Mutex = 1: Mutex //Semaforo mutex per permettere la mutua esclusione sulle variabili globali
  13.  
  14. Utente() {
  15. begin
  16.  
  17.  i = rand 0 % N //assegna una zona casuale ad un utente
  18.  
  19.  if(Automobile[i] == 0) { //se i posti per una determinata zona non sono disponibili
  20.      wait(Mutex) //entra nella sezione critica
  21.      UtentiAttendenti++ //comunica che ci sono utenti che stanno attendendo
  22.      signal(Mutex) //esci dalla sezione critica
  23.      wait(Automobile[i]); //prenota la partenza
  24.      wait(Tornata) //aspetta che sia tornata
  25.  } else {
  26.     wait(Automobile[i]) //scegli l'automobile per portarti nella zona i e prenota il posto
  27.  }
  28.  
  29.  wait(Mutex) //entra nella sezione critica
  30.  PronteAPartire[i] = 1; //una delle macchine è pronta a partire
  31.  signal(Mutex) //esci dalla sezione critica
  32.  
  33.  Wait(Partenza[i]) //se c'è ancora posto, aspetta che parta
  34.  Wait(Arrivo) //aspetta che la macchina arrivi a destinazione
  35.  
  36.  //esci
  37.  
  38.  
  39. end
  40. }
  41.  
  42.  
  43. GestorePoolCar() {
  44. begin
  45. NumeroUtenti = 0; //variabile che tiene conto degli utenti che scenderanno ad ogni femrata
  46. ContatoreFair = 0; //contatore che sarà inizializzato a 0, in maniera circolare
  47.  
  48.  loop
  49.   T = rand 10%20 //aspetta un tempo random prima di partire
  50.  
  51.   while(PronteAPartire[ContatoreFair] == 0) { //finche non trovi auto da far paritre
  52.     ContatoreFair = (ContatoreFair+1) % N //fai avanzare in maniera circolare il contatore
  53.   }
  54.  
  55.  while(Automobile[ContatoreFair] > 0) { //se la macchina pronta a partire trovata nell'indice del contatore fair ha ancora posti disponibili
  56.     if(T == 0) { //se è arrivato il tempo di partenza
  57.         break; //esci dal ciclo e parti
  58.     }
  59.  
  60.  sleep(1); //addormentati 1 secondo
  61.  T--; //decrementa il tempo di attesa
  62.    
  63.  }
  64.  
  65.  Signal(Partenza[i]) //che sia stato raggiunto il tempo limite o che sia pieno, parti
  66.  
  67.  sleep(rand 1%5) //aspetta che la macchina arrivi alla zona desiderata
  68.  
  69.  NumeroUtenti = Automobile[ContatoreFair] //assegna al numero utenti da far scendere il numero di utenti che hanno preso la macchina
  70.  
  71.  for(i = 0; i < NumeroUtenti; i++) { //per il numero di utenti che hanno preso questa macchina
  72.     signal(Arrivo) //fai scendere l'utente
  73.     signal(Automobile[ContatoreFair]) //decrementa il posto nella macchina
  74.    
  75.  }
  76.  
  77.  PronteAPartire[ContatoreFair] = 0 //la macchina non è piu pronta a partire perchè è vuota
  78.  
  79.  wait(Mutex) //entra nella sezione critica
  80.  for(i = 0; i < M; i++) { //per il numero di utenti posti disponibili della macchina
  81.      signal(Tornata[ContatoreFair]) //comunica agli utenti che la macchina è tornata e pronta ad essere riempita per il suo quantitativo di posti
  82.      UtentiAttendenti-- //diminuisci il numero di clienti in attesa perchè sono riusciti ad entrare in macchina
  83.  }
  84.  signal(Mutex) //esci dalla sezione critica
  85.  forever
  86. end
  87. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement