Guest User

Untitled

a guest
Jul 20th, 2018
96
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 7.35 KB | None | 0 0
  1. package gestorerisorse;
  2.  
  3. // utilizzo i semafori della libreria concurrent
  4. import java.util.Vector;
  5. import java.util.concurrent.*;
  6. import java.util.concurrent.locks.*;
  7.  
  8. // dichiaro la classe GESTORE e costruisco il semaforo
  9. public class Manager extends Thread
  10. {
  11.  
  12. private Semaphore risorse; // Semaforo che simul le risosrse disponibili
  13. private Semaphore attesaProcessi[]; // Semaforo dove si mettono in attesa i processi in attesa di risosrse
  14. private Vector<Process> codaAttesa1; // Coda dei Processi in attesa di una risorsa
  15. private Vector<Process> codaAttesa2; // Coda dei Processi in attesa di due richieste
  16.  
  17. private int sumTime = 0;
  18.  
  19. private int count = 0;
  20.  
  21.  
  22. private Lock mutex;
  23.  
  24. // dichiaro il costruttore
  25. public Manager(int m , int n)
  26. {
  27. // Il semaforo si occupa di effettuare la sincronizzazione dei threads
  28. // e l'attesa perchè si liberino le risorse
  29.  
  30. this.risorse = new Semaphore(m);
  31.  
  32. this.codaAttesa1 = new Vector();
  33. this.codaAttesa2 = new Vector();
  34.  
  35. this.attesaProcessi = new Semaphore[n];
  36.  
  37. // Inizializzo i vari semafori dei Processi con 0 permessi
  38. for(int i = 0; i < n; i++)
  39. this.attesaProcessi[i] = new Semaphore(0);
  40.  
  41. this.mutex = new ReentrantLock();
  42. }
  43.  
  44. // definisco i metodi
  45. public void richiestaUno(Process p)
  46. {
  47.  
  48. // controllo il tempo iniziale di attesa che mi sarà utile poi
  49. // per controllare il suo valore dopo la richiesta di una risorsa
  50. this.mutex.lock();
  51.  
  52. System.out.println("Il processo" +p.pid +" richiede una risorsa");
  53. System.out.println("risorse: " +this.risorse.availablePermits());
  54.  
  55. try
  56. {
  57. if(this.risorse.tryAcquire(1))
  58. {
  59. this.risorse.acquire();
  60. System.out.println("Risorsa assegnata al processo" +p.pid);
  61. }
  62. else
  63. {
  64. System.out.println("Non sono disponibili risorse quindi metto in attesa il processo" +p.pid);
  65. // Non posso asseganre una risorsa al processo
  66. this.codaAttesa1.addElement(p);
  67. this.mutex.unlock();
  68. this.attesaProcessi[p.pid].acquire();
  69. }
  70.  
  71. }
  72. catch (InterruptedException ex)
  73.  
  74. {
  75. System.out.println(ex);
  76. }
  77. finally
  78. {
  79. this.mutex.unlock();
  80. this.count++;
  81. }
  82. }
  83.  
  84. public void richiestaDue(Process p)
  85. {
  86.  
  87. // come sopra faccio il calcolo del tempo prima della richiesta di due risorse
  88.  
  89. this.mutex.lock();
  90.  
  91. System.out.println("Il processo" +p.pid +" richiede due risorse");
  92. System.out.println("risorse: " +this.risorse.availablePermits());
  93.  
  94. try
  95. {
  96. if(this.risorse.tryAcquire(2))
  97. {
  98. this.risorse.acquire(2);
  99.  
  100.  
  101. System.out.println("Risorsa assegnata al processo" +p.pid);
  102. }
  103. else
  104. {
  105. System.out.println("Non sono disponibili risorse quindi metto in attesa il processo" +p.pid);
  106. this.codaAttesa2.addElement(p);
  107. this.mutex.unlock();
  108. this.attesaProcessi[p.pid].acquire();
  109. }
  110. }
  111. catch (InterruptedException ex)
  112. {
  113. System.out.println(ex);
  114. }
  115. finally
  116. {
  117. this.mutex.unlock();
  118. this.count++;
  119. }
  120.  
  121. }
  122.  
  123. public void rilascioUno()
  124. {
  125. // Rilaslio una risorsa
  126. this.risorse.release();
  127.  
  128. // Visto che un processo ha rilasciato una risorsa gestisco gli eventuali processi in attesa di risorse
  129. this.gestisciProcessi();
  130.  
  131. System.out.println(Thread.currentThread().getName() + " ha rilasciato 1 risorsa");
  132. System.out.println("risorse: " +this.risorse.availablePermits());
  133.  
  134. }
  135.  
  136. public void rilascioDue()
  137. {
  138. // Rilascio due risosrse
  139. this.risorse.release(2);
  140.  
  141. // Visto che un processo ha rilasciato una risorsa gestisco gli eventuali processi in attesa di risorse
  142. this.gestisciProcessi();
  143.  
  144. System.out.println(Thread.currentThread().getName() + " ha rilasciato 2 risorse");
  145. System.out.println("risorse: " +this.risorse.availablePermits());
  146. }
  147.  
  148. public void gestisciProcessi()
  149. {
  150. int minore = 0;
  151.  
  152. System.out.println("Controllo se ci sono processi in coda e le risorse rilasciate sono sufficienti");
  153.  
  154. // Controllo se ci sono 2 risorse disponibili e almeno un processo attende per due risorse
  155. while (this.risorse.tryAcquire(2) && !this.codaAttesa2.isEmpty())
  156. {
  157.  
  158. // Cerco il processo di pid minore
  159. for(int i = 0; i < this.codaAttesa2.size(); i++)
  160. {
  161. if (this.codaAttesa2.elementAt(minore).pid > this.codaAttesa2.elementAt(i).pid)
  162. {
  163. minore = i;
  164. }
  165. try
  166. {
  167. // Assegno le risorse al processo con indice nel vettore (minore)
  168. this.risorse.acquire(2);
  169. this.attesaProcessi[this.codaAttesa2.elementAt(minore).pid].release();
  170. System.out.println("Assegno 2 risorse al processo" +this.codaAttesa2.elementAt(minore).pid +" in coda alla posizione: " +minore);
  171. this.codaAttesa2.remove(minore);
  172. }
  173. catch(InterruptedException e)
  174. {
  175. System.out.println(e);
  176. }
  177. }
  178. }
  179.  
  180. // Azzero l'indice del processo con pid minore
  181. minore = 0;
  182.  
  183. // Controllo se c'è 1 risorsa disponibile e almeno un processo attende per una risorsa
  184. while (this.risorse.tryAcquire(1) && !this.codaAttesa1.isEmpty())
  185. {
  186.  
  187. // Cerco il processo di pid minore
  188. for(int i = 0; i < this.codaAttesa1.size(); i++)
  189. {
  190. if (this.codaAttesa1.elementAt(minore).pid > this.codaAttesa1.elementAt(i).pid)
  191. {
  192. minore = i;
  193. }
  194. try
  195. {
  196. // Assegno le risorse al processo con indice nel vettore (minore)
  197. this.risorse.acquire(1);
  198. this.attesaProcessi[this.codaAttesa1.elementAt(minore).pid].release();
  199. System.out.println("Assegno 1 risorsa al processo" +this.codaAttesa1.elementAt(minore).pid +" in coda alla posizione: " +minore);
  200. this.codaAttesa1.remove(minore);
  201. }
  202. catch(InterruptedException e)
  203. {
  204. System.out.println(e);
  205. }
  206. }
  207. }
  208. }
  209.  
  210. // Creo un metodo che per salvare il totale dei tempi di attesa dei vari processi
  211. // utile per calcolare poi il tempo medio di attesa
  212. public void sumTime(int currTime)
  213. {
  214. this.sumTime += currTime;
  215. }
  216.  
  217. // Con il metodo getCount ritorno il numero di volte che ho calcolato
  218. // un waiting time, ciclando n-volte e incrementando la variabile count
  219. public double getAvgTime()
  220. {
  221. return this.sumTime / count;
  222.  
  223. }
  224. }
Add Comment
Please, Sign In to add comment