canezzy

Untitled

Jun 2nd, 2018
102
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 4.05 KB | None | 0 0
  1. #include <iostream>
  2. #include <mutex>
  3. #include <thread>
  4. #include <condition_variable>
  5. #include <map>
  6. #include <vector>
  7. using namespace std;
  8. using namespace chrono;
  9. const int OKVIRA_PO_PROCESU = 3;
  10.  
  11. mutex m;
  12. class UpravljacMemorijom {
  13. private:
  14. int brOkvira;
  15. map<int, vector<int>> procesOkviri;
  16. map<int, vector<bool>> procesFlag;
  17. map<int, condition_variable> redovi;
  18. condition_variable cv;
  19. bool potrebnaZamena;
  20. bool zamenaUToku;
  21. int idProcesaMenjaza;
  22. int stanicaKojuTrazi;
  23.  
  24. public:
  25. UpravljacMemorijom(int okviraPoProcesu) : brOkvira(okviraPoProcesu), potrebnaZamena(false), zamenaUToku(0), idProcesaMenjaza(0), stanicaKojuTrazi(0)
  26. {
  27. procesOkviri = map<int, vector<int>>(); procesFlag = map<int, vector<bool>>();
  28. }
  29.  
  30. void izvrsi_proces(int id_procesa, vector<int>& naredbe) //elementi vektora naredbe su indeksi stranica koji se referenciraju u naredbi
  31. {
  32. cout << "Proces " << id_procesa << ": krenuo u izvrsavanje!" << endl;
  33.  
  34. procesOkviri[id_procesa] = vector<int>(brOkvira);
  35. procesFlag[id_procesa] = vector<bool>(brOkvira);
  36. //redovi[id_procesa] = condition_variable;
  37.  
  38. for (int n : naredbe)
  39. {
  40.  
  41. cout << "Proces " << id_procesa << ": izvrsava svoju naredbu (" << n << ")" << endl;
  42. bool found = false;
  43. for (int i = 0; i < procesOkviri[id_procesa].size(); ++i)
  44. {
  45. if (procesOkviri[id_procesa].at(i) != n)
  46. {
  47. procesFlag[id_procesa].at(i) = false;
  48. }
  49. else
  50. {
  51. procesFlag[id_procesa].at(i) = true;
  52. found = true;
  53. break;
  54. }
  55. }
  56.  
  57. if (found) {
  58.  
  59. cout << "Proces " << id_procesa << ": vec je imao stranicu ucitanu, krece u izvrsavanje!" << endl;
  60. this_thread::sleep_for(milliseconds(300));
  61. }
  62. else {
  63.  
  64. cout << "Proces " << id_procesa << ": nije imao stranicu ucitanu, mora da je pribavi iz memorije!" << endl;
  65. unique_lock<mutex> l(m);
  66. while (zamenaUToku) {
  67. cout << "Proces " << id_procesa << ": ceka na oslobadjanje kontrolera." << endl;
  68. cv.wait(l);
  69. }
  70. cout << "Proces " << id_procesa << ": Salje zahtev kontroleru za dobavljanje stranice" << endl;
  71. potrebnaZamena = true;
  72. idProcesaMenjaza = id_procesa;
  73. stanicaKojuTrazi = n;
  74. cout << "Proces " << id_procesa << ": ceka da se dobavi stranica" << endl;
  75. redovi[id_procesa].wait(l);
  76. cout << "Proces " << id_procesa << ": stranica mu je dobavljena. ona se budi!" << endl;
  77. l.unlock();
  78. this_thread::sleep_for(milliseconds(300));
  79. cout << "Proces " << id_procesa << ": ima sve potrebstine. izvrsava!" << endl;
  80. }
  81.  
  82. }
  83. }
  84. void zameniStranicu()
  85. {
  86. if (!potrebnaZamena) {
  87. return;
  88. }
  89. cout << "VIRTUELNA MEMORIJA " << ": dobila zahtev od procesa " << idProcesaMenjaza << " i krece da trazi neki kurac (" << stanicaKojuTrazi << ")!" << endl;
  90. unique_lock<mutex> l(m);
  91. zamenaUToku = true;
  92.  
  93. for (int i = 0; i < procesOkviri[idProcesaMenjaza].size(); ++i)
  94. {
  95. if (!procesFlag[idProcesaMenjaza].at(i))
  96. {
  97. procesOkviri[idProcesaMenjaza].at(i) = stanicaKojuTrazi;
  98. procesFlag[idProcesaMenjaza].at(i) = true;
  99. break;
  100. }
  101. }
  102.  
  103.  
  104. l.unlock();
  105. this_thread::sleep_for(milliseconds(300));
  106. cout << "VIRTUELNA MEMORIJA " << ": unistila se trazeci za proces " << idProcesaMenjaza << " i sada ide na lagani odmor!" << endl;
  107.  
  108. l.lock();
  109. stanicaKojuTrazi = 0;
  110. zamenaUToku = false;
  111. potrebnaZamena = false;
  112. idProcesaMenjaza = 0;
  113. redovi[idProcesaMenjaza].notify_one();
  114. cv.notify_one();
  115. }
  116. };
  117.  
  118. void proces(UpravljacMemorijom& um, int id_procesa, vector<int> naredbe) {
  119. um.izvrsi_proces(id_procesa, naredbe);
  120. }
  121.  
  122. void vm(UpravljacMemorijom& um) {
  123. while (true) {
  124. um.zameniStranicu(); //zamenu stranice uvek vrsi nit vm na zahtev procesa kojem je stranica potrebna
  125. }
  126. }
  127.  
  128.  
  129. int main() {
  130. UpravljacMemorijom um(OKVIRA_PO_PROCESU);
  131. vector<int> naredbe1 = { 2,3,2,1,5,2,4,5,3,2,5,2 };
  132. vector<int> naredbe2 = { 1,2,3,4,5,1,2,3,4,5,1,2 };
  133. thread p1(proces, ref(um), 1, naredbe1);
  134. thread p2(proces, ref(um), 2, naredbe2);
  135.  
  136. thread vm_thread(vm, ref(um));
  137. vm_thread.detach();
  138.  
  139. p1.join();
  140. p2.join();
  141. }
Advertisement
Add Comment
Please, Sign In to add comment