Orice cod executabil, precum și codul de conducător auto care rulează în contextul unui flux. Noi nu am discutat încă modalitățile în care conducătorul auto poate crea propriul flux, astfel încât se presupune că fluxul în care este executat codul de conducător auto, aparține unei anumite aplicații. Acest lucru înseamnă că aplicația creează un fir pentru a executa codul, nu codul șoferilor. În cazul în care codul de conducător auto produce un proces de lungă durată, sau conducătorul auto utilizează un mecanism de sincronizare cu speranța de eliberare a unor resurse de cod, cerere, pentru care performanța și de a crea fire, nu este îndeplinită. În cazul în care acest flux este singura în procesul de aplicare, aplicarea programului „se blochează“.
În cazul în care situația descrisă are loc în funcțiile de control ale unui șofer de nivel superior, am „doar“ o „agățate“ program de aplicație interacționează direct cu șoferul. În acest caz, cererea este conștient de această posibilitate, și poate pune funcționarea interacțiune cu conducătorul auto (citi, scrie, trimite codurile de control) într-un fir separat. În acest caz, conducătorul auto nu poate avea să vă faceți griji cu privire la aplicarea. Cu toate acestea, această situație este destul de rar. Foarte des, codul de conducător auto care rulează în contextul unui flux aleator, adică orice flux arbitrar în sistem. Acest fir nu știe nimic despre șoferul nostru și situația de mai sus este inacceptabilă. În acest caz, conducătorul auto trebuie să creeze propriul flux în care pentru a face un tratament pe termen lung și o eliberare de resurse de așteptare.
O altă situație posibilă care impune crearea obligatorie a debitului - în cazul în care conducătorul auto are nevoie pentru a efectua operațiuni la nivel de ICCV
[12.2] fluxuri de sistem (System Worker WorkItems subiect)
În timpul inițializării sistemului NT creează mai multe fire în procesul de sistem. Aceste fluxuri sunt folosite doar pentru a efectua lucrările solicitate de alte fire. Aceste fluxuri sunt cele mai utile în cazurile în care este necesară curgerea cu IRQL ridicată pentru a efectua munca la nivel IRQL PASSIVE_LEVEL.
În principiu, puteți crea un nou fir, dar crearea unui nou planificator fir și de planificare este mai intens de resurse, decât cu ajutorul unui flux existent. Cele mai multe dintre componentele sistemului de operare standard, cum ar fi componente de sistem de fișiere utilizate pentru nevoile lor fluxuri de lucru complete de sistem.
Există situații în care utilizarea fluxurilor de lucru ale sistemului este inacceptabilă în vederea organizării lor. O astfel de situație este necesitatea pe termen lung (câteva sute de microsecunde), prelucrarea datelor în flux sau lunga așteptare pentru eliberarea unei resurse sau eveniment. În aceste situații, șoferul trebuie să creeze propriul fir.
Există trei tipuri de fluxuri de lucru ale sistemului: temporizat (întârziat), critică (critică) și hipercritic (supercritice). Toate tipurile de fire create la nivel de ICCV PASSIVE_LEVEL. Pentru fiecare tip de flux va fi diferit:
· Numărul de fire de tip
· Prioritatea de bază programarea fluxului referitoare la tipul
· Toate elementele de operare
Numărul fiecărui tip de fluxuri depinde de capacitatea și tipul de sistem de operare. Tabelul 1 prezintă numărul de fluxuri, și prioritatea de programare pentru sistemul de operare de bază Win2K Professional și Server.
Tabelul Filet sistem 1.Number lucrător
tipul de flux de lucru
Trebuie remarcat faptul că utilizarea unui singur tip de flux hipercritic nu documentată. Sistem de operare foloseste acest thread pentru a executa funcția - curățare, care eliberează curge atunci când finalizate.
La stabilirea elementului de operare, la rândul său indică tipul de curgere, care este elementul de operare.
Pentru a lucra cu un fir muncitor sistem, există 2 seturi de funcții - funcții cu prefixul Ex. și funcționează cu prefixul Io. Funcții Ex prefix utilizat în sistemul de operare NT 4.0 și versiunile anterioare, și în Win2K considerate depășite.
În orice caz, primul pilot trebuie să inițializa elementul de operare prin intermediul ExInitializeWorkItem () sau IoAllocateWorkItem (), plasați elementul de muncă în coada de așteptare prin ExQueueWorkItem () sau IoQueueWorkItem (), iar la funcția de pornire specificată în elementul de operare, această funcție trebuie să resurse element de lucru eliberați prin ExFreePool () sau IoFreeWorkItem ().