Advertisement
canezzy

Untitled

Jun 2nd, 2018
110
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 5.66 KB | None | 0 0
  1. #include <iostream>
  2. #include <mutex>
  3. #include <condition_variable>
  4. #include <vector>
  5. #include <thread>
  6. #include <map>
  7. #include <algorithm>
  8.  
  9. #include "math.h"
  10.  
  11. using namespace std;
  12. using namespace chrono;
  13. mutex m;
  14. class Kompir {
  15. public:
  16. int id;
  17. int velicina;
  18. Kompir(int _id, bool _velicina) : id(_id), velicina(_velicina) {}
  19. };
  20. bool wayToSort(Kompir i, Kompir j) { return i.velicina > j.velicina; }
  21.  
  22. int odrediStepen(int i)
  23. {
  24. int brojac = 0;
  25. while(true){
  26. if(pow(2,brojac) >= i)
  27. return brojac;
  28. brojac++;
  29.  
  30. }
  31. }
  32.  
  33.  
  34. class cv_tag {
  35. private:
  36. struct cv_data {
  37. condition_variable c;
  38. bool fulfilled;
  39. cv_data(): fulfilled(false) {}
  40. };
  41. map<size_t, cv_data*> waiting;
  42. public:
  43. cv_tag() {}
  44. ~cv_tag();
  45. void wait(unique_lock<mutex>& ,size_t);
  46. void notify(size_t tag);
  47. void notify_all();
  48. };
  49.  
  50. cv_tag::~cv_tag() {
  51. for (auto i = waiting.begin(); i!=waiting.end(); ++i)
  52. delete (*i).second;
  53. }
  54.  
  55. void cv_tag::wait(unique_lock<mutex>& l, size_t tag) {
  56. waiting.insert(pair<size_t,cv_data*>{tag,new cv_data});
  57. while (!waiting[tag]->fulfilled)
  58. waiting[tag]->c.wait(l);
  59. delete waiting[tag];
  60. waiting.erase(tag);
  61. }
  62.  
  63. void cv_tag::notify(size_t tag) {
  64. if (waiting.find(tag) != waiting.end()) {
  65. waiting[tag]->fulfilled = true;
  66. waiting[tag]->c.notify_one();
  67. }
  68. }
  69.  
  70. void cv_tag::notify_all() {
  71. for (auto i = waiting.begin(); i!=waiting.end(); ++i) {
  72. (*i).second->fulfilled = true;
  73. (*i).second->c.notify_one();
  74. }
  75. }
  76.  
  77. class Komat {
  78. public:
  79. int velicina;
  80. bool zauzeto;
  81. int kuj;
  82. Komat(int _velicina, bool _zauzeto, int _kuj) : velicina(_velicina), zauzeto(_zauzeto), kuj(_kuj) {}
  83. };
  84.  
  85.  
  86. inline bool operator==(const Komat& lhs, const Komat& rhs) {return lhs.velicina == rhs.velicina;}
  87. class RadnaMemorija {
  88. private:
  89. vector<Komat> komati;
  90. int U;
  91.  
  92. vector<Kompir> kompiri;
  93. cv_tag red;
  94.  
  95. void namakni(int i, int kolikoGodina) // 22, '90 godiste
  96. {
  97. vector<Komat> noviKomati;
  98. for(int k = 0; k < kolikoGodina; ++k){
  99. noviKomati = vector<Komat>();
  100.  
  101. for(int j = 0; j < komati.size(); ++j)
  102. {
  103. if(j != i)
  104. noviKomati.push_back(komati[j]);
  105. else
  106. {
  107. noviKomati.push_back(Komat(komati[j].velicina / 2, false, komati[j].kuj));
  108. }
  109. }
  110.  
  111. komati = noviKomati;
  112. }
  113. }
  114.  
  115. void razapni(bool& fnd, int& ind, int& step)
  116. {
  117. while(step < U && !fnd){
  118. for(int i = 0; i < komati.size(); i++)
  119. {
  120. if(komati[i].velicina == step && !komati[i].zauzeto)
  121. {
  122.  
  123. fnd = true;
  124. ind = i;
  125. break;
  126. }
  127. }
  128. step++;
  129. }
  130. }
  131.  
  132. void razjebi()
  133. {
  134. vector<Komat> novi = komati;
  135.  
  136. do
  137. {
  138. komati = novi;
  139. novi = vector<Komat>();
  140. for(int i = 0; i < komati.size(); ++i)
  141. {
  142. if(komati[i].velicina = komati[i+1].velicina && !komati[i].zauzeto && !komati[i+1].zauzeto)
  143. {
  144. novi.push_back(Komat(komati[i].velicina * 2, false, komati[i].kuj));
  145. i++;
  146. }else{
  147. novi.push_back(komati[i]);
  148. }
  149. }
  150.  
  151. }while(novi != komati);
  152. }
  153. public:
  154. RadnaMemorija(int _U) : U(_U)
  155. {
  156. komati.push_back(Komat(_U, false, 0));
  157. }
  158.  
  159. //Zauzimanje memorije
  160. //Parametar id_procesa - identifikator procesa koji se smesta u memoriju
  161. //Parametar potrebno - koja kolicina memorije je potrebna da se proces smesti (broj potrebnih kilobajta, a ne stepen broja 2)
  162. void zauzmi(int id_procesa, int potrebno)
  163. {
  164. int stepen = odrediStepen(potrebno);
  165. int step = stepen;
  166. bool found;
  167. int indeks = -1;
  168. unique_lock<mutex> l(m);
  169. razapni(found, indeks, step);
  170. while(!found)
  171. {
  172. kompiri.push_back(Kompir(id_procesa, stepen));
  173. red.wait(l, id_procesa);
  174. razapni(found, indeks, step);
  175. }
  176.  
  177. if(step != stepen)
  178. namakni(indeks, step - stepen);
  179.  
  180. komati[indeks].zauzeto = true;
  181. komati[indeks].kuj = id_procesa;
  182.  
  183. }
  184. void oslobodi(int id_procesa)
  185. {
  186. unique_lock<mutex> l(m);
  187. for(Komat k : komati)
  188. {
  189. if(k.kuj == id_procesa)
  190. k.zauzeto = false;
  191. }
  192.  
  193. razjebi();
  194.  
  195. sort(kompiri.begin(), kompiri.end(), wayToSort);
  196. for(Kompir krkr : kompiri){
  197. red.notify(krkr.id);
  198. }
  199.  
  200. }
  201. };
  202.  
  203. mutex term_m;
  204.  
  205. void proces(RadnaMemorija& rm, int id_procesa, int potrebno, int kasnjenje, int trajanje) {
  206. this_thread::sleep_for(chrono::seconds(kasnjenje));
  207. {
  208. unique_lock<mutex> l(term_m);
  209. cout << "Proces " << id_procesa << " zeli da zauzme " << potrebno << " KB memorije." << endl;
  210. }
  211. rm.zauzmi(id_procesa, potrebno);
  212. {
  213. unique_lock<mutex> l(term_m);
  214. cout << "Proces " << id_procesa << " zauzeo " << potrebno << " KB memorije." << endl;
  215. }
  216. this_thread::sleep_for(chrono::seconds(trajanje));
  217. {
  218. unique_lock<mutex> l(term_m);
  219. cout << "Proces " << id_procesa << " oslobadja memoriju." << endl;
  220. }
  221. rm.oslobodi(id_procesa);
  222. {
  223. unique_lock<mutex> l(term_m);
  224. cout << "Proces " << id_procesa << " zavrsio." << endl;
  225. }
  226. }
  227.  
  228. int BROJ_PROCESA = 5;
  229.  
  230. int main() {
  231. RadnaMemorija rm(10);
  232. vector<int> velicine = {100, 240, 64, 256, 75};
  233. vector<int> kasnjenje = {0, 1, 2, 3, 6};
  234. vector<int> trajanje = {5, 3, 5, 6, 2};
  235. thread procesi[BROJ_PROCESA];
  236.  
  237. for (int i = 0; i < BROJ_PROCESA; ++i)
  238. procesi[i] = thread(proces, ref(rm), i+1, velicine[i], kasnjenje[i], trajanje[i]);
  239.  
  240. for (int i = 0; i < BROJ_PROCESA; ++i)
  241. procesi[i].join();
  242. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement