Advertisement
canezzy

Untitled

Jun 3rd, 2018
88
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.96 KB | None | 0 0
  1. /*
  2. Napisati konkurentni program koji simulira prioritetni rasporedjivac
  3. u jednoprocesorskom sistemu. Procesi su predstavljeni nitima. Da bi se izvrsili pozivaju
  4. metodu izvrsi deljene promenljive tipa Rasporedjivac.
  5. Svaki proces sadrzi odredjeni broj naredbi.
  6. Naredbe se izvrsavaju jedna po jedna. Za svaku naredbu, proces mora da saceka da procesor bude slobodan.
  7. Izvrsavanje jedne naredbe traje 300 ms. Nakon izvrsavanja naredbe,
  8. proces odlazi u stanje spreman, a drugi spreman proces dobija procesor.
  9. Procesi su klasifikovani prema prioritetu.
  10. Za svaki prioritet, postoji odvojen red cekanja na procesor.
  11. Prednost u koriscenju procesora imaju procesi sa visim prioritetom.
  12. Medju procesima istog prioriteta, rasporedjivanje se obavlja po FIFO principu.
  13.  
  14. Prioritet procesa je odredjen staticki u trenutku kreiranja procesa.
  15.  
  16. Na kraju izvrsavanja svake naredbe proces treba da ispise:
  17. Proces X izvrsio naredbu broj Y.
  18.  
  19. Napomena: Za uspostavljanje reda cekanja po FIFO principu koristiti datu klasu cv_hrono
  20. */
  21.  
  22. #include <iostream>
  23. #include <thread>
  24. #include <mutex>
  25. #include <condition_variable>
  26. #include <deque>
  27. #include <vector>
  28. using namespace std;
  29. using namespace chrono;
  30.  
  31.  
  32.  
  33.  
  34. /*
  35. #####################################################################################################################
  36. #####################################################################################################################
  37. #####################################################################################################################
  38. */
  39.  
  40.  
  41.  
  42. class cv_chrono {
  43. struct cv_pair {
  44. condition_variable cv;
  45. bool fulfilled;
  46. cv_pair() : fulfilled(false) {}
  47. };
  48. deque<cv_pair*> ccv;
  49.  
  50. public:
  51.  
  52. void wait(unique_lock<mutex>& lock)
  53. {
  54. cv_pair* pair = new cv_pair;
  55. ccv.push_back(pair);
  56. while (!pair->fulfilled)
  57. pair->cv.wait(lock);
  58. while (ccv.front() != pair)
  59. {
  60. lock.unlock();
  61. this_thread::yield();
  62. lock.lock();
  63. }
  64. ccv.pop_front();
  65. delete pair;
  66. }
  67.  
  68. cv_status wait_for(unique_lock<mutex>& lock, int sekundi)
  69. {
  70. cv_pair* pair = new cv_pair;
  71. ccv.push_back(pair);
  72. cv_status status;
  73. while (!pair->fulfilled) {
  74. status = pair->cv.wait_for(lock, seconds(sekundi));
  75. if (status == cv_status::timeout) {
  76. break;
  77. }
  78. }
  79. ccv.pop_front();
  80. delete pair;
  81. return status;
  82. }
  83.  
  84. bool notify_one()
  85. {
  86. if (ccv.empty())
  87. return false;
  88. ccv.front()->fulfilled = true;
  89. ccv.front()->cv.notify_one();
  90. return true;
  91. }
  92.  
  93. void notify_all()
  94. {
  95. for (auto i = ccv.begin(); i != ccv.end(); ++i) {
  96. (*i)->fulfilled = true;
  97. (*i)->cv.notify_one();
  98. }
  99. }
  100. };
  101.  
  102.  
  103.  
  104. /*
  105. #####################################################################################################################
  106. #####################################################################################################################
  107. #####################################################################################################################
  108. */
  109.  
  110.  
  111. mutex term_m;
  112. mutex m;
  113. class Rasporedjivac {
  114. public:
  115. int brPr;
  116. vector<cv_chrono> cv;
  117. bool zauzet = false;
  118. vector<int> cek;
  119. condition_variable triger;
  120.  
  121. Rasporedjivac(int broj_nivoa_prioriteta) : brPr(broj_nivoa_prioriteta) { cv = vector<cv_chrono>(broj_nivoa_prioriteta); cek = vector<int>(broj_nivoa_prioriteta); }
  122. void izvrsi(int id_procesa, int broj_naredbi, int prioritet)
  123. {
  124. for (int i = 0; i < broj_naredbi; ++i)
  125. {
  126. unique_lock<mutex> l(m);
  127. if (zauzet)
  128. {
  129. cek[prioritet]++;
  130. cv[prioritet].wait(l);
  131. cek[prioritet]--;
  132. }
  133. zauzet = true;
  134. l.unlock();
  135. this_thread::sleep_for(seconds(1));
  136. l.lock();
  137. {
  138. cout << "proces " << id_procesa << " prioriteta " << prioritet << " svrsi ti u usta naredbo " << i + 1 << endl;
  139. unique_lock<mutex> l(term_m);
  140. }
  141. triger.notify_one();
  142. zauzet = false;
  143. cek[prioritet]++;
  144. cv[prioritet].wait(l);
  145. }
  146. }
  147. };
  148.  
  149.  
  150. const int BROJ_PROCESA = 5;
  151. const int BROJ_PRIORITETA = 3;
  152.  
  153. void proces(Rasporedjivac& r, int id_procesa, int broj_naredbi) {
  154. int prioritet = rand() % BROJ_PRIORITETA;
  155. {
  156. unique_lock<mutex> l(term_m);
  157. cout << "Kreira se proces " << id_procesa << " prioriteta " <<
  158. prioritet << " sa brojem naredbi " << broj_naredbi << endl;
  159. }
  160. r.izvrsi(id_procesa, broj_naredbi, prioritet);
  161. unique_lock<mutex> l(term_m);
  162. cout << "Proces " << id_procesa << " sa prioritetom " <<
  163. prioritet << " se zavrsio." << endl;
  164. }
  165.  
  166. void t(Rasporedjivac& r)
  167. {
  168. while (true)
  169. {
  170. unique_lock<mutex> l(m);
  171. r.triger.wait(l);
  172. for (int i = 0; i < r.brPr; i++) {
  173. if (r.cek[i] > 0) {
  174. r.cv[i].notify_one();
  175. break;
  176. }
  177. }
  178. }
  179. }
  180. int main() {
  181. srand(time(NULL));
  182.  
  183. Rasporedjivac r(BROJ_PRIORITETA);
  184. thread procesi[BROJ_PROCESA];
  185. thread tr = thread(t, ref(r));
  186. for (int i = 0; i < BROJ_PROCESA; i++)
  187. procesi[i] = thread(proces, ref(r), i + 1, rand() % 10 + 1);
  188.  
  189. for (int i = 0; i < BROJ_PROCESA; i++)
  190. procesi[i].join();
  191.  
  192. tr.detach();
  193. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement