Rozbor programu pre meranie efektívnosti prioritných tried vlákien a procesov

Z Kiwiki
Skočit na navigaci Skočit na vyhledávání

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.

Číselné hodnoty reťazcov prioritných tried a priorít vlákien
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.