1. Procesele firelor și OSWindows din fibre
Un proces denumit în mod obișnuit ca o instanță a unui program care rulează. Deși la prima vedere, se pare că noțiunea de program și procesul este aproape la fel, ele sunt în mod fundamental diferite unele de altele. Programul este un set static de instrucțiuni, iar procesul este un set de resurse și a datelor utilizate în timpul execuției programului. Procesul în Windows este format din următoarele componente:
- structură de date care conține toate informațiile despre acest proces, inclusiv o listă de deschis se ocupă de o varietate de resurse de sistem, un ID unic proces, informații statistice diferite, etc;.
- un identificator unic al filetului;
- conținutul CPU înregistrează un set care reflectă starea procesorului;
- două stive, dintre care unul este utilizat atunci când se efectuează fir în modul nucleu și altul - în modul de utilizare;
- a acoperit o zonă de memorie numită fir de stocare locală (fir de stocare locală, TLS) și subsistemele utilizate, biblioteci run-time și DLL.
Pentru toate lucrările fire, sistemul de operare atribuie fiecare dintre ele un anumit procesor. Astfel, creând iluzia de fire de execuție simultane (desigur, paralelismul adevărat posibil pentru calculatoare multiprocesor). În sistemul Windows este pus în aplicare de planificare preemptive, bazată pe priorități, care se efectuează întotdeauna cu cea mai mare prioritate firul gata pentru a rula. Selectate pentru a efectua rulează firul de execuție pentru o anumită perioadă, numită cuantică. Quantum determină cât de mult timp un fir va rula până când sistemul de operare nu o va întrerupe. La sfârșitul cuantumului sistemului de operare verifică dacă gata să execute un alt fir cu aceeași (sau mai mare), nivelul de prioritate. În cazul în care astfel de fire nu au avut, firul curent este alocat un alt cuantic. Cu toate acestea, firul nu se poate folosi din plin cuantumul acesteia. De îndată ce celălalt fir cu prioritate mai mare este gata pentru a rula, firul curent este deplasat, chiar și în cazul în care cuantumul acesteia nu a expirat.
Ori de câte ori există o întrerupere cronometru, cuantumul firului se scade 3, și așa mai departe până când ajunge la zero. timer Răspuns în frecvență depinde de platforma hardware. De exemplu, pentru cele mai multe sisteme x86 uniprocesor este de 10 ms și la cele mai multe sisteme multiprocesor x 86 - 15 ms.
în planificarea Windows este realizată la nivelul firului și nu procese. Se pare clar, deoarece procesele în sine nu sunt îndeplinite, dar oferă doar resurse și un context pentru firul de execuție. Prin urmare, atunci când planificarea fir, sistemul nu acorde atenție la ceea ce fac parte ce proces. De exemplu, în cazul în care procesul A are 10 fire, și executabile procesul B - două filamente 12 și toate au aceeași prioritate, fiecare dintre ele va primi 1/12 de timp CPU.
În Windows există un nivel de 32 de prioritate, de la 0 la 31. Acestea sunt grupate după cum urmează: 31-16 - nivelurile în timp real; 15-1 - nivele dinamice; nivel de sistem, rezervat proces pagina aducerea la zero (fir-pagina zero) - 0.
Prioritatea fiecărui fir (prioritate de bază fir) suma priorității procesului său și prioritatea relativă a firului în sine. Există șapte dintre prioritățile relative de fire:
Normal: la fel ca în acest proces;
Mai sus normală: +1 pentru procesul de prioritate;
Timecritical: stabilește prioritatea de bază a unui fir pentru clasa Realtime 31,
pentru alte clase - 15;
Idle: stabilește prioritatea de bază a unui fir pentru Realtime clasa 16,
pentru alte clase - 1.
Dacă sistemul de operare se execută pe o mașină care are mai mult de un procesor, atunci în mod implicit, firul se execută pe orice procesor disponibil. Cu toate acestea, în unele cazuri, un set de procesoare pe care un fir poate rula, poate fi limitat. Acest fenomen se numește afinitate procesor (processoraffinity). Puteți schimba programul de afinitate prin intermediul procesorului Win32 # 8209; funcția de planificare.
Procesul 2. Crearea
- Deschide un fișier imagine (EXE), care va fi efectuată în acest proces. Dacă fișierul executabil nu este o aplicație Win32 validă, suportul de imagine este solicitată (imagine de sprijin) pentru a rula acest program. De exemplu, în cazul în care fișierul este executat cu rasshireniem.bat, executați cmd.exe etc.
- Creează un obiect Win32 „proces“.
- a crea un fir primar (stivă, context și "fir" obiect).
- subsistemul Win32 este notificat un nou proces și fir.
- Începe cu executarea firului primar.
3. Finalizarea procesului
Un proces încetează atunci când:
- Funcția de intrare a firului primar recapete controlul.
- Unul dintre firele din procesul cauzat funcția ExitProcess.
- Firul unui alt proces numit funcția TerminateProcess.
Exemplu: Programul creează un proces de „Calculator“.
int main (int argc, char * argv [])
ZeroMemory (si, sizeof (si));
ZeroMemory (pi, sizeof (pi));
în cazul în care (CreateProcess (NULL, «c: \\ ferestre \\ calc.exe» !, NULL, NULL, FALSE,
0, NULL, NULL, si, pi))
// Închide proces și mânere de fire.
4. Creați un fir
5. Finalizarea filamentelor
În cazul în care capetele de filet
- funcția firului se întoarce.
- Firul este autodistruge, provocând ExitThread.
- Altele filament sau un al treilea proces de a provoca TerminateThread.
- Procesul care conține acest thread.
6. Crearea de fibre
Fibra poate fi creat cu ajutorul unui apel de sistem de CreateFiber proces de fire de urzeală sau obținute prin transformarea firul curent prin intermediul funcției ConvertThreadToFiber. Comutarea între fibrele pot fi aranjate prin intermediul funcției SwitchToFiber. dar apelul poate fi făcută doar din fibra.
Exemplu: Programul creează patru fibre, fiecare dintre care efectuează trecerea la fibra următoare, în cazul în care numărul de comutatoare mai mari de 10, lucrarea este finalizată.
#define _WIN32_WINNT 0x0400
anula WinAPI func (void *)
( «Number Fiber% d \ n», Counter% 4) printf;
SwitchToFiber (fibra [Counter% 4]);
int main (int argc, char * argv [])
fibre [0] = CreateFiber (0, func, NULL);
fibre [1] = CreateFiber (0, func, NULL);
fibre [2] = CreateFiber (0, func, NULL);
fibre [3] = CreateFiber (0, func, NULL);
// pentru a comuta la prima fibră este necesară pentru a converti firul curent în fibră
7. fibre de distrugere
Pentru a forța distrugerea fibrelor utilizate funcția DeleteFiber. De asemenea, pentru distrugerea fibrelor pot fi folosite toate funcțiile pentru a distruge fire.
Pentru a suspenda executarea catenele de lucru pot fi utilizate în diverse moduri.
Sleep () funcția suspendă firul pe numărul specificat de milisecunde. Dacă argumentul pe care îl specificați 0 ms, apoi să se întâmple în continuare. Subiect renunța la cuantumul acesteia de timp CPU, dar apar imediat în lista de fire gata pentru a rula. Cu alte cuvinte vor intenționată firele de comutare (sau, mai degrabă, o încercare de a schimba - deoarece firul următor pentru a efectua bine poate fi la fel).
Exemplu. Programul creează un proces de „calculator“ și 15 secunde mai târziu ucide.
int main (int argc, char * argv [])
memset (StartUpInfo, 0, sizeof (STARTUPINFO));
Dacă (CreateProcess (NULL, «c: \\ ferestre \\ calc.exe», NULL, NULL, FALSE,
NORMAL_PRIORITY_CLASS, NULL, NULL, StartUpInfo, ProcessInfo))
TerminateProcess (ProcessInfo.hProcess, 0);
WaitForSingleObject () funcția suspendă firul până la până când unul dintre cele două evenimente:
- expiră timeout;
- obiectul de așteptat, intră în starea de alarmă (semnalizate).
Prin valoare de returnare este posibil să se înțeleagă care dintre cele două evenimente se întâmplă. Asteptati folosind așteptați # 8209, cele mai multe funcții pot fi obiecte de nucleu, de exemplu, obiectul „proces“ sau „fir“, pentru a determina momentul în care termina munca.
Funcția WaitForMultipleObjects este trecut o serie de obiecte dintr-o dată. Acesta poate fi de așteptat de funcționare o dată toate obiectele, sau oricare dintre ele.
Exemplu. Programul creează două fire identice și așteaptă finalizarea. Subiect pur și simplu a scrie un mesaj de tip text, care le este livrat în timpul inițializării.
nesemnate ThreadFunc (void * arg)
char ** str = (char **) arg;
MessageBox (0, str [0], str [1], 0);
int main (int argc, char * argv [])
char * InitStr1 [2] =; // string pentru primul fir
char * InitStr2 [2] =; // string pentru al doilea fir
uThreadIDs lungi fără semn [2];
hThreads [0] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc,
hThreads [1] = CreateThread (NULL, 0, (LPTHREAD_START_ROUTINE) ThreadFunc,
// Așteptați până când firele termina munca lor
WaitForMultipleObjects (2, hThreads, TRUE, INFINITE);
Prelegerea a discutat diverse funcții WIN API și secvență de pași pentru crearea și lucrul cu procesul, firul și vmindouz foloknami Când crearea de aplicații, utilizarea și caracteristicile acestora. Pentru informații complete cu privire la scopul, utilizarea și sintaxa tuturor funcțiilor API WIN32, folositi sistemul de ajutor MSSDK, care face parte din BorlandDelphi CBuilder sau medii de programare, precum și MSDN, furnizate ca parte a sistemului de programare VisualC.