Advertisement
191x7

DvijeNiti_rasporedjivanje_v1

Sep 6th, 2012
80
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 4.92 KB | None | 0 0
  1. /*Višekriterijsko raspoređivanje resursa na višejezgrenom procesoru
  2.  
  3. Višenitan program koji traži od korisnika unos broja zadataka i trajanja svakog zadatka u milisekundama
  4. nakon čega započinje dvije niti pri čemu se jedna odvija na jednoj procesorskoj jezgri druga na drugoj.
  5.  
  6. Niti (a time i jezgre) uzimaju zadatatke tako da prva nit uzima raditi vremenski najkraci zadatak (shortest
  7. job first) a druga zadatak koji dolazi po redu (first come first served).
  8.  
  9. Kao opterečenje koristi se računanje decimala broja Pi, tj zadatci se sastoje od toga da se potražuju decimale
  10. broja Pi zadan broj vremenskih jedinica. Time se procesorske jezgre optimalno opterete.
  11.  
  12. Najosnovniji primjer višekriterijskog raspoređivanja (dva kriterija) na višejezgrenom procesoru (dvojezgreni
  13. procesor ili višejezgreni pri čemu se za program koriste samo prve dvije jezgre).
  14. */
  15.  
  16. #include <iostream>
  17. #include <windows.h>
  18. #include <process.h>
  19. #include <conio.h>
  20.  
  21. using namespace std;
  22.  
  23. typedef unsigned int (__stdcall *FUNKCIJA)(void*);
  24.  
  25. typedef struct
  26. {
  27.     int broj;
  28.     int vrijeme;
  29.     bool dovrsen;
  30.     void *argumenti;
  31.     FUNKCIJA funkcija;
  32. } ZADATAK, *PZADATAK;
  33.  
  34. typedef struct
  35. {
  36.     int broj;
  37.     ZADATAK **zadatci;
  38.     int broj_zadataka;
  39.     unsigned long vrijeme_izvrsavanja;
  40. } DRETVA_INFO, *PDRETVA_INFO;
  41.  
  42. void thread_manager(void*);
  43. void sortiraj(ZADATAK**, int);
  44. unsigned int WINAPI zadatak_f(void*);
  45.  
  46. CRITICAL_SECTION modifikacija_polja, ispis_u_konzolu;
  47.  
  48. int main()
  49. {
  50.     int broj_zadataka=0;
  51.     ZADATAK zadatci[256]={0};
  52.     DRETVA_INFO manager1, manager2;
  53.     HANDLE managers[2];
  54.  
  55.     InitializeCriticalSection(&modifikacija_polja);
  56.     InitializeCriticalSection(&ispis_u_konzolu);
  57.  
  58.     cout<<"Unesite broj zadataka: ";
  59.     cin>>broj_zadataka;
  60.  
  61.     for (int n=0; n<broj_zadataka && n<256; n++)
  62.     {
  63.         cout<<"\nZadatak "<<n<<"."<<endl;
  64.         cout<<"   Unesite trajanje u milisekundama: ";
  65.         cin>>zadatci[n].vrijeme;
  66.         zadatci[n].broj=n;
  67.         zadatci[n].funkcija=zadatak_f;
  68.     }
  69.  
  70.     manager1.broj=1;
  71.     manager1.broj_zadataka=broj_zadataka;
  72.     manager1.zadatci=new PZADATAK[broj_zadataka];
  73.  
  74.     manager2.broj=2;
  75.     manager2.broj_zadataka=broj_zadataka;
  76.     manager2.zadatci=new PZADATAK[broj_zadataka];
  77.  
  78.     for (int n=0; n<broj_zadataka; n++)
  79.     {
  80.         manager1.zadatci[n]=&zadatci[n];
  81.         manager2.zadatci[n]=&zadatci[n];
  82.     }
  83.     sortiraj(manager1.zadatci, broj_zadataka);
  84.  
  85.     managers[0]=(HANDLE)_beginthread(thread_manager, 0, (void*)&manager1);
  86.     managers[1]=(HANDLE)_beginthread(thread_manager, 0, (void*)&manager2);
  87.     WaitForMultipleObjects(2, managers, TRUE, INFINITE);
  88.  
  89.     cout<<"\nThread1 se izvrsavao "<<manager1.vrijeme_izvrsavanja<<"ms.\n";
  90.     cout<<"Thread2 se izvrsavao "<<manager2.vrijeme_izvrsavanja<<"ms.\n";
  91.  
  92.     DeleteCriticalSection(&modifikacija_polja);
  93.     DeleteCriticalSection(&ispis_u_konzolu);
  94.  
  95.     delete manager1.zadatci;
  96.     delete manager2.zadatci;
  97.  
  98.     cout<<"\nPritisnite bilo koju tipku za zatvaranje programa";
  99.     getch();
  100.  
  101.     return 0;
  102. }
  103.  
  104. void thread_manager(void *arg)
  105. {
  106.     ZADATAK **zadatci=((PDRETVA_INFO)arg)->zadatci;
  107.     HANDLE thread;
  108.     unsigned long pocetno_vrijeme=GetTickCount();
  109.  
  110.     for (int n=0; n<((PDRETVA_INFO)arg)->broj_zadataka; n++)
  111.     {
  112.         EnterCriticalSection(&modifikacija_polja);
  113.         if (!zadatci[n]->dovrsen)
  114.         {
  115.             zadatci[n]->dovrsen=1;
  116.             LeaveCriticalSection(&modifikacija_polja);
  117.         }
  118.         else
  119.         {
  120.             LeaveCriticalSection(&modifikacija_polja);
  121.             continue;
  122.         }
  123.  
  124.         EnterCriticalSection(&ispis_u_konzolu);
  125.         cout<<"\nThread"<<((PDRETVA_INFO)arg)->broj<<": zadatak"<<zadatci[n]->broj<<" trajanje "<<zadatci[n]->vrijeme<<"ms\n";
  126.         LeaveCriticalSection(&ispis_u_konzolu);
  127.  
  128.         thread=(HANDLE)_beginthreadex(NULL, 0, zadatci[n]->funkcija, zadatci[n]->argumenti, CREATE_SUSPENDED, NULL);
  129.         SetThreadAffinityMask(thread, 1ul<<(((PDRETVA_INFO)arg)->broj-1));
  130.         ResumeThread(thread);
  131.         WaitForSingleObject(thread, zadatci[n]->vrijeme);
  132.         TerminateThread(thread, 0);
  133.     }
  134.  
  135.     ((PDRETVA_INFO)arg)->vrijeme_izvrsavanja=GetTickCount()-pocetno_vrijeme;
  136.  
  137.     return;
  138. }
  139.  
  140. unsigned int WINAPI zadatak_f(void *arg)
  141. {
  142.     double Pi=1.0;
  143.     long long int div=3;
  144.     long long int i=0;
  145.  
  146.     while (1)
  147.     {
  148.         if ((i%2))
  149.            Pi-=1.0/div;
  150.         else
  151.            Pi+=1.0/div;
  152.  
  153.         div+=2;
  154.         i++;
  155.     }
  156.  
  157.     return 0;
  158. }
  159.  
  160. void sortiraj(ZADATAK **zadatci, int broj_zadataka)
  161. {
  162.     PZADATAK privremeni;
  163.  
  164.     for (int n=0; n<broj_zadataka; n++)
  165.         for (int i=0; i<broj_zadataka-1; i++)
  166.         {
  167.             if (zadatci[i]->vrijeme>zadatci[i+1]->vrijeme)
  168.             {
  169.                 privremeni=zadatci[i];
  170.                 zadatci[i]=zadatci[i+1];
  171.                 zadatci[i+1]=privremeni;
  172.             }
  173.         }
  174.  
  175.     return;
  176. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement