Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- /*Višekriterijsko raspoređivanje resursa na višejezgrenom procesoru
- Višenitan program koji traži od korisnika unos broja zadataka i trajanja svakog zadatka u milisekundama
- nakon čega započinje dvije niti pri čemu se jedna odvija na jednoj procesorskoj jezgri druga na drugoj.
- Niti (a time i jezgre) uzimaju zadatatke tako da prva nit uzima raditi vremenski najkraci zadatak (shortest
- job first) a druga zadatak koji dolazi po redu (first come first served).
- Kao opterečenje koristi se računanje decimala broja Pi, tj zadatci se sastoje od toga da se potražuju decimale
- broja Pi zadan broj vremenskih jedinica. Time se procesorske jezgre optimalno opterete.
- Najosnovniji primjer višekriterijskog raspoređivanja (dva kriterija) na višejezgrenom procesoru (dvojezgreni
- procesor ili višejezgreni pri čemu se za program koriste samo prve dvije jezgre).
- */
- #include <iostream>
- #include <windows.h>
- #include <process.h>
- #include <conio.h>
- using namespace std;
- typedef unsigned int (__stdcall *FUNKCIJA)(void*);
- typedef struct
- {
- int broj;
- int vrijeme;
- bool dovrsen;
- void *argumenti;
- FUNKCIJA funkcija;
- } ZADATAK, *PZADATAK;
- typedef struct
- {
- int broj;
- ZADATAK **zadatci;
- int broj_zadataka;
- unsigned long vrijeme_izvrsavanja;
- } DRETVA_INFO, *PDRETVA_INFO;
- void thread_manager(void*);
- void sortiraj(ZADATAK**, int);
- unsigned int WINAPI zadatak_f(void*);
- CRITICAL_SECTION modifikacija_polja, ispis_u_konzolu;
- int main()
- {
- int broj_zadataka=0;
- ZADATAK zadatci[256]={0};
- DRETVA_INFO manager1, manager2;
- HANDLE managers[2];
- InitializeCriticalSection(&modifikacija_polja);
- InitializeCriticalSection(&ispis_u_konzolu);
- cout<<"Unesite broj zadataka: ";
- cin>>broj_zadataka;
- for (int n=0; n<broj_zadataka && n<256; n++)
- {
- cout<<"\nZadatak "<<n<<"."<<endl;
- cout<<" Unesite trajanje u milisekundama: ";
- cin>>zadatci[n].vrijeme;
- zadatci[n].broj=n;
- zadatci[n].funkcija=zadatak_f;
- }
- manager1.broj=1;
- manager1.broj_zadataka=broj_zadataka;
- manager1.zadatci=new PZADATAK[broj_zadataka];
- manager2.broj=2;
- manager2.broj_zadataka=broj_zadataka;
- manager2.zadatci=new PZADATAK[broj_zadataka];
- for (int n=0; n<broj_zadataka; n++)
- {
- manager1.zadatci[n]=&zadatci[n];
- manager2.zadatci[n]=&zadatci[n];
- }
- sortiraj(manager1.zadatci, broj_zadataka);
- managers[0]=(HANDLE)_beginthread(thread_manager, 0, (void*)&manager1);
- managers[1]=(HANDLE)_beginthread(thread_manager, 0, (void*)&manager2);
- WaitForMultipleObjects(2, managers, TRUE, INFINITE);
- cout<<"\nThread1 se izvrsavao "<<manager1.vrijeme_izvrsavanja<<"ms.\n";
- cout<<"Thread2 se izvrsavao "<<manager2.vrijeme_izvrsavanja<<"ms.\n";
- DeleteCriticalSection(&modifikacija_polja);
- DeleteCriticalSection(&ispis_u_konzolu);
- delete manager1.zadatci;
- delete manager2.zadatci;
- cout<<"\nPritisnite bilo koju tipku za zatvaranje programa";
- getch();
- return 0;
- }
- void thread_manager(void *arg)
- {
- ZADATAK **zadatci=((PDRETVA_INFO)arg)->zadatci;
- HANDLE thread;
- unsigned long pocetno_vrijeme=GetTickCount();
- for (int n=0; n<((PDRETVA_INFO)arg)->broj_zadataka; n++)
- {
- EnterCriticalSection(&modifikacija_polja);
- if (!zadatci[n]->dovrsen)
- {
- zadatci[n]->dovrsen=1;
- LeaveCriticalSection(&modifikacija_polja);
- }
- else
- {
- LeaveCriticalSection(&modifikacija_polja);
- continue;
- }
- EnterCriticalSection(&ispis_u_konzolu);
- cout<<"\nThread"<<((PDRETVA_INFO)arg)->broj<<": zadatak"<<zadatci[n]->broj<<" trajanje "<<zadatci[n]->vrijeme<<"ms\n";
- LeaveCriticalSection(&ispis_u_konzolu);
- thread=(HANDLE)_beginthreadex(NULL, 0, zadatci[n]->funkcija, zadatci[n]->argumenti, CREATE_SUSPENDED, NULL);
- SetThreadAffinityMask(thread, 1ul<<(((PDRETVA_INFO)arg)->broj-1));
- ResumeThread(thread);
- WaitForSingleObject(thread, zadatci[n]->vrijeme);
- TerminateThread(thread, 0);
- }
- ((PDRETVA_INFO)arg)->vrijeme_izvrsavanja=GetTickCount()-pocetno_vrijeme;
- return;
- }
- unsigned int WINAPI zadatak_f(void *arg)
- {
- double Pi=1.0;
- long long int div=3;
- long long int i=0;
- while (1)
- {
- if ((i%2))
- Pi-=1.0/div;
- else
- Pi+=1.0/div;
- div+=2;
- i++;
- }
- return 0;
- }
- void sortiraj(ZADATAK **zadatci, int broj_zadataka)
- {
- PZADATAK privremeni;
- for (int n=0; n<broj_zadataka; n++)
- for (int i=0; i<broj_zadataka-1; i++)
- {
- if (zadatci[i]->vrijeme>zadatci[i+1]->vrijeme)
- {
- privremeni=zadatci[i];
- zadatci[i]=zadatci[i+1];
- zadatci[i+1]=privremeni;
- }
- }
- return;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement