. Conceptul general al procesului discutat mai sus în secțiunea 4.2.1, pentru Windows așa cum se împarte în două concepte: procesul real și firul (fir, fluxul de termen este folosit în unele cărți). În acest caz, firul este o unitate de lucru, este implicat în competiția pentru timp CPU, se schimbă statutul și prioritatea sa, așa cum este descris mai sus pentru procesul. În ceea ce privește procesul de pe Windows, acesta poate consta din mai multe fire care utilizează memoria partajată, fișiere deschise, și alte resurse deținute de proces. Într-un cuvânt: procesul - are (memorie, fișiere), fir - locul de muncă, în timp ce partajarea resurselor procesului său. Cu toate acestea, firul de asemenea, deține ceva: ferestre, coadă de mesaje, o stivă.
Procesul creează un program de pornire (EXE-files). În același timp, procesul a creat un fir (nu are pe cineva să lucreze!). Crearea unui proces efectuat de CreateProcess API-funcție. Principalii parametri ai invocarea funcției sunt după cum urmează.
· Numele de fișier pentru a rula programe.
· Șir de comandă a trecut procesul în timpul pornirii.
· Atribute de protectie pentru proces nou creat și ață. Iar procesul și firul sunt obiecte de Windows kernel, și, ca atare, pot fi protejate împotriva accesului neautorizat (de exemplu, încercările prin alte procese intervin în proces).
· Diferite steaguri, clarificarea procesului de creare modul. Printre acestea este procesul de clasă de prioritate, pavilion modul de depanare (în acest caz, sistemul va notifica procesul părinte al acțiunii generate de proces), precum și crearea procesului de pavilion suspendat, care nu va începe până când funcția este numit reluarea activității.
· Fluid de proces bloc.
· Directorul curent al procesului.
· Parametrii prima fereastră care urmează să fie deschisă atunci când începe procesul.
Dacă procesul este creat cu succes, funcția CreateProcess returnează o valoare non-zero.
După ce creați un proces singur fir începe executarea programului de proces, care funcționează în paralel cu alte fire de procese care rulează. În cazul în care logica programului presupune executarea în paralel a oricărei acțiuni în cadrul unui singur proces, pot fi create firele suplimentare. Acesta utilizează funcția CreateThread. Principalele parametrii săi sunt după cum urmează:
· Protecția atributele la firul nou creat;
· Dimensiunea stivei firului;
· Stabilirea unui indicator pentru a trece un fir atunci când rulați o anumită valoare ca argument;
· Flag crea fir într-o stare suspendată;
· Pointer la o variabilă în care funcția trebuie să returneze ID-ul firului creat.
Valoarea funcției de retur CreateThread este mânerul creat de firul sau nul, în cazul în care nu a fost posibil să se creeze un fir.
Un exemplu perfect al unui program multi-threaded este Microsoft Word. În timp ce firul principal procesează de intrare de la tastatură, un fir separat poate calcula dinamic partiția textului de pe pagina, un alt fir poate, în același timp, pentru a imprima documentul sau salvați-l.
Pentru a închide firul folosind funcția de apel ExitThread. Pentru a finaliza întregul proces de oricare dintre firele sale pot apela o funcție ExitProcess. Singurul parametru al fiecăreia dintre aceste funcții este un cod complet al unui fir sau proces.
Finalizarea procesului conduce la eliberarea tuturor resurselor care au fost deținute de proces: memorie, fișierele deschise, etc.
La finalizarea procesului este terminat toate firele sale. Pe de altă parte, atunci când procesul este complet, iar ultimul fir se termină procesul.
Nu este cunoscut faptul că firul nu este cea mai mică unitate de algoritmi. De fapt, Windows vă permite să creați în câteva fire de fibre (fibre), care, în termeni generali pot fi descrise ca să aibă corutine sau ca o problemă cu o programare non-preemptiv, care lucrează în cadrul uneia și aceeași problemă cu programarea preemptiv. fibra de comutare se efectuează numai în mod explicit cu ajutorul funcției SwitchToFiber. La utilizarea de a se vedea să aibă corutine. / Eroare! Sursa de referință nu a fost găsit. /.
Task Scheduler este alegerea firului de lângă care urmează să fie executat. Programatorul este invocată în trei cazuri:
· Dacă felie de timp expiră, firul curent selectat;
· Dacă firul curent a cauzat funcția (de exemplu, WaitForMultipleObjects sau readfile) de blocare și a trecut la starea de așteptare;
· Dacă firul cu prioritate mai mare trezit din regimul de așteptare sau tocmai a fost lansat.
Pentru a selecta este utilizat algoritmul de coadă de prioritate fir. Pentru fiecare sistem de nivel de prioritate conduce toate thread-urile active (de exemplu fire de care sunt într-o stare de pregătire). Este selectat pentru a rula un alt fir dintr-o coadă nevidă cu cea mai mare prioritate.
Coadă de fire active sunt completate de fire, trezirea după o stare de așteptare și fire deplasată de planificator. De regulă, firul este plasat în coada. O excepție se face pentru firul de deplasat înainte de expirarea timpului său felie un fir de prioritate mai mare. Acest „ofensată“ firul este plasată în capul de coadă.
Valoarea feliei de timp pentru instalațiile de Windows pentru servere de obicei egal cu 120 ms, pentru stații de lucru - 20 ms.
Ce crezi, de ce felie de timp de server mai mult?
Toate nivelele de prioritate firele sunt numerotate de la 0 (cea mai mică prioritate) la 31 (cea mai mare). Nivelurile 16 până la 31 sunt numite priorități în timp real. acestea sunt proiectate pentru a efectua operațiuni de sistem critice de timp. Numai sistemul în sine sau un utilizator cu drepturi de administrator pot utiliza prioritățile grupului. Nivelurile de la 0 la 15 sunt numite priorități dinamice.
Windows utilizează o schemă de două etape de prioritizare. Când creați un proces este numit (și poate fi modificată ulterior de program sau de către utilizator), una din cele patru clase de prioritate. fiecare dintre acestea fiind asociat cu prioritate de bază:
· Realtime (prioritate 24 de bază) - cea mai înaltă clasă de prioritate, valabilă numai pentru procesele de sistem care ocupă CPU pentru un timp foarte scurt;
· (Prioritate de bază din 13) de mare - clasa de procese de înaltă prioritate;
· Normal (prioritate de bază 8) - clasa de prioritate obișnuită la care majoritatea proceselor de aplicare lansate;
· (Prioritatea de bază a 4) Idle - inferior (literal - „idle“ sau „inactiv“) clasă de prioritate, tipic pentru screensavere, monitorizează performanța, și alte programe care nu interferează cu un program de viață mai important.
De fapt, nu este o prioritate asociată cu procesul, și cu fiecare din firul său. determina prioritatea de bază fir prioritate a procesului, la care se adaugă prioritatea relativă a firului - cantitatea -2-2. Prioritatea relativă este atribuit firul atunci când este creat și poate fi modificat, dacă este necesar. Există, de asemenea, posibilitatea de a atribui fir de prioritate critică (31, 15 pentru procesul pentru restul în timp real) sau cu prioritate unică (16 procese în timp real 0 pentru restul).
Pentru timp real procesele prioritățile firului sunt statice, în sensul că sistemul nu încearcă să le schimbe pe cont propriu. Se presupune că pentru acest grup de procese priorități relative ar trebui să fie exact ca programator planificat.
Pentru procesele din cele trei clase inferioare ale priorităților lor nu este întâmplător sunt numite dinamice. Programatorul poate schimba prioritățile, și, împreună cu intervalele de timp pentru a filamentelor în cursul punerii în aplicare a acestora, în scopul de a obține o distribuție mai echitabilă a timpului CPU. Reguli schimbări în prioritățile dinamice sunt după cum urmează.
· Când un fir de așteptare blocat pentru evenimentul potrivit ei, la prioritatea firului valoarea adăugată în funcție de așteptările motive. Această creștere se poate ajunge la 6 unități (prioritate, dar nu trebuie să depășească 15), în cazul în care firul este activat din cauza faceți clic pe tastare sau mouse-ul. În acest fel, sistemul tinde să reducă timpul de răspuns la acțiunile utilizatorului. Ori de câte ori un fir folosește complet felie de timp, câștigul scade cu 1 până la prioritatea firului nu a revenit la valoarea țintă.
· Dacă firul deține fereastra de prim-plan (adică cele cu care utilizatorul este de lucru), de dragul de a reduce timpul de reacție, planificatorul poate crește felie de timp pentru fire, cu 20 până la 40 ms sau 60 ms, în funcție de setările sistemului.
· În cazul în care planificatorul detectează că un anumit fir este în linie pentru mai mult de 3 secunde, apoi ridică prioritatea până la 15 și dublează cuantumul acesteia. Dar această caritate singur: atunci când firul Cenușăreasa va petrece un cuantum crescut sau blocat, prioritatea sa, și randamentul cuantic la valorile anterioare. Sensul de acțiune este clar: sistemul încearcă să asigure cel puțin unele progrese, chiar și pentru fir de prioritate redusă.