Lauda

kernel sim.

Apr 24th, 2013
132
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.44 KB | None | 0 0
  1. /*
  2. Napraviti konkurentni program koji simulira ponasanje kernela operativnog sistema pri dodelu 2-jezgarnog procesora nitima.
  3.  
  4. Niti pokusavaju da zauzmu jedno od jezgara procesora. Ukoliko je bar jedno jezgro slobodno, ono se dodeljuje niti na koriscenje odredjeni vremenski period delta koji iznosi 1 sekundu. Ukoliko su oba jezgra zauzeta nit ceka na jezgru na kome ceka manje niti (kako bi se raspodelilo opterecenje).
  5.  
  6. Nakon koriscenja jezgra delta (1) sekundi nit prepusta jezgro nekoj drugoj niti koja ceka za njegovo koriscenje (bilo da je u pitanju nit koja je tek dosla na cekanje ili neka druga nit kojoj je bio istekao vremenski period delta) i ulazi u cooldown (cekanje pre ponovnog pokusaja zauzimanja procesora kako bi se dala sansa drugim nitima da koriste procesor).
  7.  
  8. Nakon cooldown perioda (10 ms) nit ponovo pokusava da zauzme procesor. Data sekvenca zauzimanje-otpustanje procesora se izvrsava minimalno jednom ili vise puta u zavisnosti koliko sekundi nit pokusava da koristi procesor.
  9.  
  10. Da bi se ispratio rad programa potrebno zabeleziti trenutak pocetka koriscenjas (nakon zauzimanja) procesora od strane niti kao i trenutak kraja koriscenja procesora. Dati trenuci se koriste u niti radi izracunavanja trajanja operacije koriscenja procesora.
  11.  
  12. Kreirati 1 procesor i 10 niti. Svaka nit treba da pokusava da zauzme procesor proizvoljan vremenski
  13. period od 1-4 sekunde.
  14.  
  15. Napomena: Obratiti paznju da nit u toku rada ne mora uvek zauzimati isto jezgro procesora.
  16.  
  17. Komentari su obavezni.
  18. */
  19.  
  20. #include <thread>
  21. #include <iostream>
  22.  
  23. #define DELTA 1
  24. #define COOLDOWN 10
  25.  
  26. using namespace std;
  27. using namespace chrono;
  28.  
  29.  
  30.  
  31. struct vremena {
  32.     monotonic_clock::time_point pocetak;
  33.     monotonic_clock::time_point kraj;
  34. };
  35.  
  36. class Procesor {
  37.     int broj_niti[2];
  38.     bool jezgro_zauzeto[2];
  39.     condition_variable jezgro_cv[2];
  40.     mutex m;
  41. public:
  42.     Procesor() {
  43.         for (int i = 0; i < 2; i++) {
  44.             broj_niti[i] = 0;
  45.             jezgro_zauzeto[i] = false;
  46.         }
  47.     }
  48.    
  49.     vremena zauzmi_procesor(int sekundi) {
  50.         int br_jezgra = 0;
  51.         bool poceo = false;
  52.         vremena vr;
  53.         for (int i = 0; i < sekundi; i++) {
  54.             {
  55.                 unique_lock<mutex> l(m);
  56.                 br_jezgra = (broj_niti[0] < broj_niti[1]) ? 0 : 1;
  57.                 broj_niti[br_jezgra]++;
  58.                 while  ((jezgro_zauzeto[0] == true) && (jezgro_zauzeto[1] == true)) {
  59.                     jezgro_cv[br_jezgra].wait(l);
  60.                 }
  61.                 if (!poceo) {              
  62.                     vr.pocetak = monotonic_clock::now();
  63.                     poceo = true;
  64.                 }
  65.                 jezgro_zauzeto[br_jezgra] = true;
  66.             }
  67.             this_thread::sleep_for(seconds(DELTA));
  68.             {          
  69.                 lock_guard<mutex> l(m);
  70.                 broj_niti[br_jezgra]--;
  71.                 jezgro_zauzeto[br_jezgra] = false;
  72.                 jezgro_cv[br_jezgra].notify_one();
  73.             }
  74.             this_thread::sleep_for(milliseconds(COOLDOWN));    
  75.         }
  76.         vr.kraj = monotonic_clock::now();
  77.         return vr;
  78.     }
  79. };
  80.  
  81. mutex term_mx;
  82.  
  83. void nit(Procesor & p, int rbr, int sekundi) {
  84.     vremena vr = p.zauzmi_procesor(sekundi);
  85.     double multiplier = 1;
  86.     if (sekundi > 1)  multiplier = 1.01;
  87.     duration<double> s = vr.kraj - vr.pocetak;
  88.  
  89.     lock_guard<mutex> l(term_mx);
  90.     cout << "Nit broj: " << rbr << " provela u cekanju i koriscenju procesora: "
  91.          << s.count() << " sekundi od planiranih: " << sekundi*multiplier << " sekundi."
  92.          << endl;
  93. }
  94.  
  95. int br_niti = 10;
  96.  
  97. int main () {
  98.     thread niti[br_niti];
  99.     Procesor p;
  100.     srand(time(NULL));
  101.     for (int i = 0; i < br_niti; i++) {
  102.         niti[i] = thread(nit, ref(p), i, (rand()%4+1));
  103.     }
  104.     for (int i = 0; i< br_niti; i++) {
  105.         niti[i].join();
  106.     }
  107. }
Advertisement
Add Comment
Please, Sign In to add comment