Advertisement
Guest User

Untitled

a guest
May 25th, 2015
241
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.30 KB | None | 0 0
  1. /*Napisati konkurentni program koji modeluje izvrsavanje procesa u multiprogramiranom
  2. okruzenju na jednom procesoru.
  3.  
  4. Procesi su predstavljeni nitima. Svaki proces ima skup instrukcija koje treba da izvrsi, pri
  5. cemu postoje dva tipa naredbi: NORMAL (instrukcija zahteva odredjeno izracunavanje od procesora) i
  6. IO (instrukcija zahteva operaciju ulazno/izlaznog uredjaja).
  7.  
  8. U sistemu je definisan maksimalan broj instrukcija koje proces moze uzastopno da izvrsi.
  9. Nakon sto izvrsi taj niz instrukcija, proces prelazi u stanje spreman i drugi
  10. spreman proces dobija procesor.
  11. Iz skupa spremnih procesa, naredni proces za izvrsavanje se bira bez odredjenog pravila.
  12. Bilo koji od spremnih procesa prelazi u izvrsavanje.
  13.  
  14. Ako proces izvrsava NORMAL instrukciju, instrukcija traje slucajan vremenski period izmedju
  15. 10 i 50 ms.
  16.  
  17. U sistemu postoji jedan UI uredjaj koji opsluzuje zahteve procesa. UI uredjaj redom opsluzuje pristigle zahteve
  18. kada postoje zahtevi.
  19.  
  20. Ako proces izvrsava IO instrukciju, proces salje zahtev UI uredjaju i odlazi u stanje blokiran.
  21. Tada drugi proces dobija procesor.
  22. Kada UI uredjaj zavrsi posao, postavlja prekid i tada se proces prevodi u red spremnih
  23. procesa. Operacija UI uredjaja traje slucajan period izmedju 100 i 300 ms.
  24.  
  25. */
  26.  
  27. #include <vector>
  28. #include <iostream>
  29. #include <thread>
  30. #include <mutex>
  31. #include <condition_variable>
  32. #include <queue>
  33.  
  34. using namespace std;
  35. using namespace chrono;
  36.  
  37. enum INS_TYPE {NORMAL = 0, IO};
  38.  
  39. struct Process {
  40. vector<INS_TYPE>* instructions;
  41. int id;
  42. Process(vector<INS_TYPE>* in, int i): instructions(in), id(i) {}
  43. ~Process() {
  44. delete instructions;
  45. }
  46. };
  47.  
  48. struct UiRequest {
  49. int processId;
  50. bool finished;
  51. condition_variable cv;
  52. UiRequest(int i): processId(i), finished(false) {}
  53. };
  54.  
  55. class System {
  56. private:
  57. mutex m;
  58. int maxInst;
  59. int activeProcess;
  60. queue<UiRequest*> uiRequests;
  61. condition_variable ready; //red spremnih procesa
  62. condition_variable ui; //cekanje ui uredjaja da neko zatrazi operaciju
  63. public:
  64. System(int max): maxInst(max), activeProcess(-1) {}
  65. void executeProcess(Process& p) {
  66. int successive = 0;
  67. for (auto it = p.instructions->begin(); it != p.instructions->end(); it++) {
  68. unique_lock<mutex> l(m);
  69. if (activeProcess == -1) {
  70. activeProcess = p.id; //ako je procesor slobodan zauzmi procesor
  71. cout << "Proces " << p.id << " zauzeo procesor." << endl;
  72. }
  73.  
  74. while (activeProcess != p.id) {
  75. cout << "Proces " << p.id << " se uvezuje u red spremnih procesa." << endl;
  76. ready.wait(l);
  77. if (activeProcess == -1) {
  78. activeProcess = p.id; //zauzmi procesor
  79. cout << "Proces " << p.id << " zauzeo procesor." << endl;
  80. }
  81. }
  82. if (*it == NORMAL) {
  83. l.unlock();
  84. this_thread::sleep_for(milliseconds(rand()%40 + 10));
  85. l.lock();
  86. //ako je izvrsen maksimalan broj uzastopnih instrukcija ili su izvrsene sve instrukcije procesa
  87. if (++successive == maxInst) {
  88. cout << "Proces " << p.id << " oslobadja procesor. Broj uzastopnih instrukcija: "
  89. << successive << endl;
  90. successive = 0;
  91. activeProcess = -1; //oslobodi procesor
  92. ready.notify_one(); //aktiviraj sledeci iz reda spremnih
  93. //cooldown period da ne uzme ovaj isti proces odmah procesor
  94. l.unlock();
  95. this_thread::sleep_for(milliseconds(100));
  96. }
  97. } else {
  98. UiRequest* req = new UiRequest(p.id);
  99. uiRequests.push(req);
  100. ui.notify_one();
  101. cout << "Proces " << p.id << " odlazi u cekanje zbog UI operacije." << endl;
  102. while (!req->finished) {
  103. successive = 0;
  104. activeProcess = -1;
  105. ready.notify_one();
  106. req->cv.wait(l);
  107. cout << "UI uredjaj iz blokiranja probudio proces " << p.id << endl;
  108. }
  109. delete req;
  110. cout << "Proces " << p.id << " vise nije blokiran." << endl;
  111. }
  112.  
  113. }
  114. //kada zavrsi izvrsavanje, naredni proces zauzima procesor
  115. unique_lock<mutex> l(m);
  116. if (activeProcess == p.id) {
  117. activeProcess = -1;
  118. ready.notify_one();
  119. }
  120.  
  121. }
  122. void executeUi() {
  123. while (true) {
  124. unique_lock<mutex> l(m);
  125. while (uiRequests.empty()) {
  126. cout << "Uredjaj ide u cekanje" << endl;
  127. ui.wait(l);
  128. }
  129.  
  130. UiRequest* req = uiRequests.front();
  131. uiRequests.pop();
  132. cout << "Ui uredjaj obradjuje zahtev procesa " << req->processId << endl;
  133. l.unlock();
  134. this_thread::sleep_for(milliseconds(rand()%200 + 100));
  135. l.lock();
  136. req->finished = true;
  137. req->cv.notify_one();
  138.  
  139. cout << "Ui uredjaj izvrsio zahtev procesa " << req->processId << endl;
  140. }
  141. }
  142. };
  143.  
  144. mutex term_m;
  145.  
  146. void p(System& s, int id) {
  147. vector<INS_TYPE>* instructions = new vector<INS_TYPE>();
  148. for (int i = 0 ; i < 10; i++) {
  149. instructions->push_back((INS_TYPE)(rand()%10 == 1)); //9:1 sanse da ce biti NORMAL instrukcija
  150. }
  151.  
  152. Process p(instructions, id);
  153. s.executeProcess(p);
  154. unique_lock<mutex> l(term_m);
  155. cout << "Proces " << id << " se zavrsio." << endl;
  156. }
  157.  
  158. void uiDevice(System& s) {
  159. s.executeUi();
  160. }
  161.  
  162. int main() {
  163.  
  164. srand(time(NULL));
  165.  
  166. System system(3);
  167. thread t[5];
  168.  
  169. thread uiThread = thread(uiDevice, ref(system));
  170. uiThread.detach();
  171.  
  172. for (int i = 0; i < 5; i++) {
  173. t[i] = thread(p, ref(system), i+1);
  174. }
  175.  
  176. for (int i = 0; i < 5; i++) {
  177. t[i].join();
  178. }
  179. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement