Schimbarea contextului
Versiunea actuală a paginii nu a fost încă examinată de colaboratori experimentați și poate diferi semnificativ de
versiunea revizuită la 31 ianuarie 2019; verificările necesită
7 modificări .
Schimbarea contextului ( în engleză context switch ) - în sistemele de operare și medii multitasking - procesul de terminare a execuției unei sarcini (proces, fir, fir) de către procesor, salvând în același timp toate informațiile și starea necesare pentru continuarea ulterioară din locul întrerupt , și restabilirea și încărcarea stării sarcinii care urmează să fie executată de procesor.
Procedura de schimbare a contextului include așa-numita programare a sarcinilor - procesul de decizie la care sarcină să transfere controlul.
Descriere
O comutare de context salvează și restaurează următoarele informații:
- Contextul de înregistrare al registrelor de uz general (inclusiv registrul pavilionului )
- Contextul stării registrului în virgulă mobilă/ MMX ( x86 )
- Starea registrului SSE , AVX ( x86 )
- Starea registrului segmentului (x86)
- Starea unor registre de control (de exemplu, registrul CR3 responsabil pentru memoria procesului de paginare) (x86)
În nucleul sistemului de operare , următoarele structuri sunt asociate fiecărui fir de execuție:
- Informații generale pid, tid, uid, gid, euid, egid etc.
- Stare proces/fir
- Drepturi de acces
- Resurse și blocaje utilizate de thread
- Contoare de utilizare a resurselor (de exemplu, cronometre CPU utilizate)
- Regiunile de memorie alocate unui proces
Schimbarea contextului și performanța
În plus, și foarte important, următoarele acțiuni hardware invizibile de software care afectează performanța au loc în timpul comutării de context:
- Canalul de instrucțiuni al procesorului și datele sunt șterse
- TLB este șters , care este responsabil pentru paginarea adreselor liniare la cele fizice.
În plus, trebuie luate în considerare următoarele fapte care afectează starea sistemului:
- Conținutul cache -ului (în special cache-ul de prim nivel), acumulat și „optimizat” pentru execuția unui fir, se dovedește a fi complet inaplicabil noului fir de execuție la care este comutat.
- Când se face o comutare de context la un proces care nu a fost folosit de mult timp (vezi paginarea ), este posibil ca multe pagini să nu fie disponibile fizic în memoria principală, ceea ce face ca paginile schimbate să fie încărcate din memoria secundară.
Schimbarea contextului și sistemul de operare
Din punctul de vedere al stratului de aplicație, schimbarea contextului poate fi împărțită în voluntară (voluntară) și forțată (nevoluntară): un proces/fir în rulare poate transfera el însuși controlul unui alt fir sau nucleul poate lua forțat controlul de la aceasta.
- Nucleul sistemului de operare poate prelua controlul de la un proces/un fir de execuție atunci când expiră timpul. Din punctul de vedere al programatorului, asta înseamnă că controlul ar putea scăpa de fir în cel mai „prost” moment, când structurile de date ar putea fi într-o stare inconsistentă, deoarece modificarea lor nu a fost finalizată.
- Executați un apel de sistem de blocare . Când o aplicație efectuează I/O, nucleul poate decide că poate ceda controlul unui alt fir/proces în timp ce așteaptă finalizarea I/O-ului pe disc sau rețea solicitat de acel fir. Această opțiune este cea mai productivă.
- Primitive de sincronizare a nucleului. Mutexuri , semafore , etc. Aceasta este principala sursă de probleme de performanță. Lucrul insuficient gândit cu primitivele de sincronizare poate duce la zeci de mii și, în cazuri mai ales neglijate, la sute de mii de comutări de context pe secundă.
- Un apel de sistem care așteaptă în mod explicit să apară un eveniment (select, sondaj, epoll, pauză, așteptare, ...) sau un moment în timp (sleep, nanosleep, ...). Această opțiune este relativ productivă, deoarece nucleul sistemului de operare are informații despre procesele de așteptare.
Caracteristicile procedurii de planificare
Diferența dintre sistemele de operare în timp real și de partajare a timpului este văzută cel mai clar în diferența de logica de programare pentru comutarile de context: planificatorul sistemului de partajare a timpului încearcă să maximizeze performanța întregului sistem, posibil în detrimentul performanței procese individuale. Sarcina programatorului de sistem în timp real este de a se asigura că procesele critice individuale rulează cu prioritate, indiferent cât de grea este suprasarcina pentru restul sistemului în ansamblu.
Implementări de schimbare a contextului în sistemele de operare moderne
După cum se poate observa din cele de mai sus, o comutare de context este o operațiune foarte intensivă în resurse și cu cât procesorul este mai „fantezist”, cu atât această operațiune devine mai intensivă în resurse. Pe baza acestui lucru, nucleul folosește o serie de strategii pentru, în primul rând, pentru a reduce numărul de comutări de context și, în al doilea rând, pentru a face ca schimbarea de context să consume mai puțin resurse.
Metode de reducere a numărului de comutări de context:
- Este posibil să se configureze cuantumul de timp al procesorului alocat unui fir. Când construiți nucleul Linux, este posibil să specificați Server/Desktop/Low-Latency Desktop. Pentru configurațiile de server, acest cuantum este mai mare.
Metode pentru reducerea intensității resurselor de comutare de context:
- Atunci când contextul comută între firele de execuție care partajează același spațiu de adrese în cadrul aceluiași proces, nucleul nu atinge registrul CR3, salvând astfel TLB
- În multe cazuri, nucleul se află în același spațiu de adrese ca și procesul utilizatorului. La comutarea contextului între spațiul utilizator și spațiul kernel (și invers), ceea ce, de exemplu, are loc la executarea apelurilor de sistem, nucleul nu atinge registrul CR3, salvând astfel TLB
- La programare, nucleul încearcă să minimizeze mișcarea procesului între nucleele de procesare din sistemul SMP , îmbunătățind astfel eficiența cache-ului L2.
- Salvarea/restaurarea propriu-zisă a contextului coprocesorului în virgulă mobilă și a registrelor de context MMX/SSE are loc la prima accesare a unui nou thread, care este optimizat pentru cazul în care majoritatea thread-urilor efectuează numai operațiuni cu registre de uz general.
Exemplele de mai sus se referă la kernel-ul Linux , totuși și alte sisteme de operare folosesc metode similare, deși în cazul sistemelor de operare proprietare este problematic să se dovedească/infirma utilizarea acestuia.
Note terminologice
Link -uri