Rozbor programu pre meranie efektívnosti prioritných tried vlákien a procesov
Obsah
Program meria časy trvania výpočtu pri nastavených rôznych prioritných triedach procesu a prioritách vlákien. Program využíva systémové funkcie operačného systému Windows, ide o konzolovú aplikáciu.
Vytvorenie vlákna
V programe sa vytvorí predefinovaný počet vlákien pomocou premennej max_threads. Pomocou funkcie
HANDLE CreateThread (LPSECURITY_ATTRIBUTES secAttr, SIZE_T stackSize, LPTHREAD_START_ROUTINE threadFunc, LPVOID param, DWORD flags, LPDWORD threadID)
sa vytvoria vlákna programu. Funkcia musí obsahovať nasledovné parametre:
- secAttr je ukazovateľ na súbor bezpečnostných atribútov, ak je nastavený na hodnotu NULL je používaný základný súbor atribútov,
- stackSize určuje veľkosť zásobníka vlákna v bytoch, ak je nastavený na hodnotu 0 má rovnakú veľkosť zásobníka ako vytvárajúce vlákno. V prípade nutnosti bude zásobník rozšírený,
- threadFunc tento parameter je názov rutiny vykonávania vlákna t.j. názov funkcie ktorú chceme, aby vlákno vykonávalo. Musí mať nasledovný tvar:
DWORD WINAPI threadfunc (LPVOID param)
- param je návratová hodnota funkcie vlákna,
- Flags určuje stav vlákna po vytvorení. Ak je nastavený parameter 0 vlákno sa začne okamžite po vytvorení vykonávať, ak je nastavený parameter CREATE_SUSPEND vlákno sa nachádza v tzv. úspornom režime kde je pripravené na spracovanie alebo ukončenie,
- threadID je premenná v ktorej je uložené identifikačné číslo vlákna.
Každé vlákno po vytvorení je kontrolované, či sa vytvorilo. Ak sa vlákno nevytvorí program vráti chybové hlásenie pomocou funkcie GetLastError.
Synchronizácia vlákien
Po vytvorení vlákien vlákno vykonáva svoju funkciu. Vlákno, ktoré skončilo svoju funkciu čaká dokiaľ sa nedokončia všetky spustené vlákna. Toto je realizované funkciou
DWORD WINAPI WaitForMultipleObjects ( DWORD nCount, HANDLE *lpHandles, BOOL bWaitAll, DWORD dwMilliseconds).
Funkcia obsahuje parametre:
- nCount reprezentuje počet vlákien,
- lpHandles je ukazovateľ na zoznam vlákien,
- bWaitAll ak je nastavený na parameter TRUE musia sa ukončiť všetky vlákna, ktoré sú nastavené v parametre lpHandles. Ak je nastavený na hodnotu FALSE stačí ak sa ukončí jediné vlákno zo zoznamu vlákien. Funkcia vráti hodnotu, ktoré vlákno spôsobilo návratovú hodnotu.
- dwMIlliseconds je interval v milisekundách. Táto hodnota určuje koľko sa má čakať na všetky vlákna. Ak je nastavený na hodnotu INFINITE čaká pokiaľ sa všetky určené vlákna neukončia.
Meranie časov funkcie vlákna
Funkciu vlákna reprezentuje sčítavanie čísiel v definovanom cykle. Počet opakovaní cyklu je definovaný premennou cyklus. Meranie časov prebieha vo funkcii vlákna
DWORD WINAPI MyThreadFunction (LPVOID lpParam).
Meranie času zabezpečujú funkcie QueryPerformance, sú to vysoko rýchlostné čítače tikov, ktoré vracajú hodnoty v dátovom type LARGE_INTEGER. Pred samotným meraním času prebehne funkcia
BOOL QueryPerformanceFrequency (LARGE_INTEGER* lpFrequency)
, táto funkcia vracia pomocou ukazovateľa na premennú maximálny počet tikov za sekundu na procesore. Pred začatím meraného úseku programu spustíme funkciu
BOOL QueryPerformanceCounter (LARGE_INTEGER *lpPerformanceCount)
, ktorá nám vráti počet tikov, ktoré uplynuli od spustenia programu až do zavolania tejto systémovej funkcie.
Po vykonaní meranej operácie programu sa opätovne zavolá táto funkcia. Výpočet času v milisekundách sa realizuje výpočtom:
Vysledný čas = (koncový stav - počiatočný stav počítadla)/(maximálny počet tikov)/(1000)
Po dokončení všetkých vlákien je vypočítaný čas uložený do súboru na pevnom disku.
Nastavenie prioritných tried procesu a priorít vlákien
Nastavovanie prioritných tried procesu prebieha pred vytváraním vlákien. Nastavenie je reprezentované funkciou
SetPriorityClass (GetCurrentProcess(), ProcessPrio)
. Táto funkcia obsahuje funkciu GetCurrentProcess ktorá zabezpečuje nastavenie prioritu bežiacemu procesu. Premenná ProcessPrio obsahuje nastavovacie reťazce triedy priorít. Nastavovacie reťazce tried priorít sú nasledovné:
- IDLE_PRIORITY_CLASS, t.j. voľná prioritná trieda,
- BELOW_NORMAL_PRIORITY_CLASS, t.j. nižšia normálová prioritná trieda,
- NORMAL_PRIORITY_CLASS, t.j. normálová prioritná trieda,
- ABOVE_NORMAL_PRIORITY_CLASS ,t.j. vyššia normálová prioritná trieda,
- HIGH_PRIORITY_CLASS, t.j. vyššia prioritná trieda,
- REALTIME_PRIORITY_CLASS, t.j. prioritná trieda reálneho času.
Nastavovanie priority vlákien prebieha v cykle vytvárania vlákien pomocou funkcie
SetThreadPriority (GetCurrentThread(), ThreadPrio)
. Funkcia GetCurrentThread zabezpečuje nastavenie priority vytvorenému vláknu. Premenná ThreadPrio obsahuje nastavovacie reťazce priority pre vlákno. Nastavovacie reťazce pre priority vlákien sú nasledovné:
- THREAD_PRIORITY_IDLE, t.j. voľná priorita vlákna,
- THREAD_PRIORITY_LOWEST, t.j. nižšia priorita vlákna,
- THREAD_PRIORITY_BELOW_NORMAL, t.j. nižšia priorita vlákna,
- THREAD_PRIORITY_NORMAL, t.j. normálová priorita vlákna,
- THREAD_PRIORITY_ABOVE_NORMAL, t.j. vyššia normálová priorita vlákna,
- THREAD_PRIORITY_HIGHEST, t.j. najvyššia priorita vlákna,
- THREAD_PRIORITY_TIME_CRITICAL, t.j. priorita vlákna kritického času.
Nastavovacie reťazce prioritných tried a priorít vlákien sa dajú nahradiť predefinovanými číselnými hodnotami.
Prioritné triedy procesu | Priority vlákna | ||
---|---|---|---|
IDLE | 64 | IDLE | -15 |
BELLOW NORMAL | 16384 | LOWEST | -2 |
NORMAL | 32 | BELLOW NORMAL | -1 |
ABOVE NORMAL | 32768 | NORMAL | 0 |
HIGH | 128 | ABOVE NORMAL | 1 |
REAL TIME | 256 | HIGHEST | 2 |
TIME CRITICAL | 15 |
Pri spustený programu sa trieda priority procesu nastaví na hodnotu NORMAL_PRIORITY_CLASS a priorita vlákien sa nastaví na hodnotu THREAD_PRIORITY_NORMAL. Pre všetky prioritné triedy procesu sa vykonajú merania na každej priorite vlákna. Program skončí po ukončení vlákien v prioritnej triede reálneho času a zároveň pri nastavenej priorite vlákna kritického času. Kontrolu aktuálnej nastavenej prioritnej triedy procesu sa realizuje pomocou systémovej funkcie GetPriorityClass a pre kontrolu priority vlákna GetThreadPriority.