Advertisement
canezzy

Untitled

Jun 2nd, 2018
110
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.  
  77. cout << "Proces " << id_procesa << ": stranica mu je dobavljena. ona se budi!" << endl;
  78. l.unlock();
  79. this_thread::sleep_for(milliseconds(300));
  80. cout << "Proces " << id_procesa << ": ima sve potrebstine. izvrsava!" << endl;
  81. }
  82.  
  83. }
  84. }
  85. void zameniStranicu()
  86. {
  87. if (!potrebnaZamena) {
  88. return;
  89. }
  90. cout << "VIRTUELNA MEMORIJA " << ": dobila zahtev od procesa " << idProcesaMenjaza << " i krece da trazi neki kurac (" << stanicaKojuTrazi << ")!" << endl;
  91. unique_lock<mutex> l(m);
  92. zamenaUToku = true;
  93.  
  94. for (int i = 0; i < procesOkviri.at(idProcesaMenjaza).size(); ++i)
  95. {
  96. if (!procesFlag[idProcesaMenjaza].at(i))
  97. {
  98. procesOkviri[idProcesaMenjaza].at(i) = stanicaKojuTrazi;
  99. procesFlag[idProcesaMenjaza].at(i) = true;
  100. break;
  101. }
  102. }
  103.  
  104.  
  105. l.unlock();
  106. this_thread::sleep_for(milliseconds(300));
  107. cout << "VIRTUELNA MEMORIJA " << ": unistila se trazeci za proces " << idProcesaMenjaza << " i sada ide na lagani odmor!" << endl;
  108.  
  109. l.lock();
  110. stanicaKojuTrazi = 0;
  111. zamenaUToku = false;
  112. potrebnaZamena = false;
  113. redovi[idProcesaMenjaza].notify_one();
  114. idProcesaMenjaza = 0;
  115. cv.notify_one();
  116. }
  117. };
  118.  
  119. void proces(UpravljacMemorijom& um, int id_procesa, vector<int> naredbe) {
  120. um.izvrsi_proces(id_procesa, naredbe);
  121. }
  122.  
  123. void vm(UpravljacMemorijom& um) {
  124. while (true) {
  125. um.zameniStranicu(); //zamenu stranice uvek vrsi nit vm na zahtev procesa kojem je stranica potrebna
  126. }
  127. }
  128.  
  129.  
  130. int main() {
  131. UpravljacMemorijom um(OKVIRA_PO_PROCESU);
  132. vector<int> naredbe1 = { 2,3,2,1,5,2,4,5,3,2,5,2 };
  133. vector<int> naredbe2 = { 1,2,3,4,5,1,2,3,4,5,1,2 };
  134. thread p1(proces, ref(um), 1, naredbe1);
  135. thread p2(proces, ref(um), 2, naredbe2);
  136.  
  137. thread vm_thread(vm, ref(um));
  138. vm_thread.detach();
  139.  
  140. p1.join();
  141. p2.join();
  142. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement