Distribuirea timpului procesorului între fire

Sistemul alocă timp CPU pentru toate firele active, pe baza nivelurilor lor de prioritate, care variază de la 0 la 31.

Cel mai mic nivel este rezervat și atribuit unui flux special de sistem de zeroare a paginii.







Când sistemul conectează procesorul la un flux, acesta procesează fire cu aceeași prioritate ca și peer (pe principiul caruselului). Odată ce toate firele cu această prioritate sunt cuantizate și cu condiția ca acestea să nu mai necesite timp de procesor, sistemul de operare trece la fire cu o prioritate mai mică.

Există posibilitatea ca procesorul să proceseze în mod constant fluxuri, de exemplu cu prioritate 31. Prin urmare, firele cu prioritate mai mică nu au șanse să se conecteze la procesor. Această situație se numește supraîncărcare (înfometare).

Crearea unui fir cu un inactiv prioritar relativ:

HANDLE hThread = CreareThreadă (NULL, 0, ThreadFunc, NULL, CREATE_SUSPENDED, dwThreadID); SetThreadPriority (hThread, THREAD_PRIORITY_IDLE); ResumeThread (hThread);

CreateThread creează întotdeauna un fir cu o prioritate relativă a normalei.

Pentru a atribui thread-ului o prioritate relativă la inactiv, trebuie să creați un fir suspendat prin trecerea steagului CREATE_SUSPENDED la CreateThread, apoi apelați SetThreadPriority și setați prioritatea dorită.







Suspendarea și reluarea firelor:

De asemenea, puteți întrerupe execuția firului apelând funcția

DWORD SuspendThread (HANDLE hThread);

ceea ce mărește contorul de timp de oprire. Dacă este reușită, funcția returnează valoarea anterioară a contorului de oprire sau $ FFFFFFFF.

Pentru a relua execuția firului, trebuie să apelați o funcție dintr-un alt fir

DWORD ResumeThread (HANDLE hThread);

care va reduce numărul de timpi de întrerupere cu unul, iar dacă acesta este 0, acesta va porni firul pentru execuție.

Puteți suspenda fluxul de cel mult 127 de ori.

Apoi, trebuie să apelați ResumeThread, iar firul va fi inclus în numărul programat. Să se spună în avans când thread-ul va primi timp CPU, este imposibil, dar planificatorul ia deja în considerare noua sa prioritate

Un fir poate spune sistemului să nu aloce un timp procesorului pentru o anumită perioadă, cauzând:

VOID Sleep (DWORD dwMillisecunde);

Această funcție suspendă fluxul pe milisecunde de milisecunde.

Calling Sleep, firul refuză în mod voluntar restul cuantumului temporal alocat acestuia.

Sistemul oprește alocarea timpului CPU firului pentru o perioadă aproximativ egală cu cea specificată, deoarece Windows nu este un sistem în timp real.

Puteți apela Sleep și treceți valoarea INFINITE la dwMilliseconds, interzicând, în general, programarea fluxului.

Puteți să sunați la Sleep și să treceți o valoare zero la dwMillisecunde. Apoi, veți abandona restul timpului cuantic și veți forța sistemul să se conecteze la un alt fir de procesor.







Trimiteți-le prietenilor: