Russinovici Mark

NOTĂ Procesul de subsistem Windows este numit Csrss.exe, deoarece în Windows NT toate subsistemele au fost inițial destinate să ruleze ca fire într-un singur proces la nivel de sistem. Când subsistemele POSIX și OS / 2 au fost alocate propriilor procese, numele fișierului procesului subsistemului Windows a rămas același.







Este imposibil să se amestece apelurile de funcții ale diferitelor subsisteme. Cu alte cuvinte, aplicațiile POSIX pot apela numai servicii exportate de subsistemul POSIX, iar aplicațiile Windows sunt numai servicii exportate de subsistemul Windows. Cum se face chiar această restricție a fost unul dintre motivele pentru care subsistemul POSIX al originalului, care pune în aplicare un set foarte limitat de funcții (numai POSIX 1003.1), nu a devenit un mediu de util pentru transferul în ea bazate pe UNIX Applications.
Am spus deja că aplicațiile personalizate nu pot apela direct serviciile de sistem Windows. În schimb, accesează DLL-ul subsistemelor. Aceste DLL-uri oferă o interfață documentată între programele și subsistemul pe care îl apelează. Deci, DLL-ul subsistemului Windows (Kernel32.dll, Advapi32.dll, User32.dll și Gdi32.dll) implementează funcțiile Windows API. Subsistemul POSIX DLL (Psxdll.dll) implementează API-ul POSIX.

Aceasta arată că Notepad este un program GUI, iar Cmd este un program de consolă sau un program de mod text. Deși ieșirea utilitarului Exetype raportează existența a două subsisteme diferite pentru programele GUI și consola, de fapt, există un singur subsistem de Windows. În plus, Windows nu suportă procesorul Intel 386 (sau 486, dacă are vreo valoare) - textul mesajelor de ieșire de la Exetype pur și simplu nu a fost actualizat.
Când aplicația solicită una dintre funcțiile DLL ale subsistemului, una dintre cele trei este posibilă.
(o) Funcția este implementată pe deplin în modul utilizator în interiorul DLL-ului subsistemului. Cu alte cuvinte, nu sunt trimise mesaje la procesul subsistemului de mediu și nu există apel la serviciile sistemului executiv Windows. După ce executați funcția în modul utilizator, rezultatul este returnat programului care îl numește. Exemple de aceste caracteristici pot fi GetCurrentProcess (întotdeauna se întoarce -1, valoarea determinată prin referire la procesul curent în toate funcțiile legate de procesele) și GetCurrentProcessId (ID proces nu se schimbă în timpul vieții sale, astfel că poate fi obținut din memoria cache, care permite evitați comutarea la modul kernel).
(o) Funcția necesită una sau mai multe apeluri către sistemul executiv Windows. De exemplu, funcțiile Windows ReadFile și WriteFile se referă la serviciile I / O interne nedocumentate - respectiv la NtReadFile și NtWriteFile.
(o) Funcția necesită efectuarea unor operațiuni în procesul subsistemului de mediu (astfel de procese care rulează în modul utilizator sunt responsabile de întreținerea aplicațiilor client care funcționează sub controlul acestora). B acest caz, solicitarea dată de client-server de mediu subsistem prin mesajul cu cerința de a efectua o operație, și subsistemul DLL de control înainte de a reveni la programul apelant așteaptă un răspuns adecvat.
Unele funcții precum CreateProcess și CreateThread pot necesita execuția celui de-al doilea și celui de-al treilea element.
Deși cadrul Windows permite ca mai multe subsisteme de mediu independente să fie suportate, din punct de vedere practic ar fi incomod să se includă în fiecare subsistem codul său pentru prelucrarea ferestrelor și afișarea I / O. Acest lucru ar duce la dublarea funcțiilor sistemului și, în cele din urmă, ar afecta negativ volumul și performanța sistemului. Deoarece subsistemul principal era Windows, dezvoltatorii au decis să plaseze aceste funcții de bază în el. Deci, alte subsisteme pentru afișarea I / O provoacă serviciile Windows corespunzătoare. (Apropo, analizând tipul subsistemului din anteturile fișierelor, veți vedea că acestea sunt de fapt fișiere executabile Windows).
Acum, să ne familiarizăm cu fiecare subsistem al mediului.

Subsistem Windows

Deci, ceea ce rămâne în acea parte a procesului subsistemului Windows care funcționează în modul utilizator? Deoarece programele de consolă nu redrajează ferestrele, toate operațiunile de redare și actualizare a ferestrelor de consolă și de text sunt efectuate de această parte a Windows. Pentru a vedea activitatea sa nu este dificilă: deschideți fereastra de comandă și trageți o altă fereastră peste ea. Veți vedea că procesul subsistemului Windows începe să-și petreacă timpul procesorului, redând fereastra consolei. Pe lângă susținerea ferestrelor consolei, doar o mică parte din funcțiile Windows trimite mesaje către procesul subsistemului Windows. Acestea includ funcții care sunt responsabile pentru crearea și terminarea proceselor și a firelor, atribuirea de scrisori unităților de rețea, crearea de fișiere temporare. În mod obișnuit, o aplicație Windows schimba rareori contextul (în cazul în care există toate comutatoarele) la procesul subsistemului Windows.







Stabilitatea Windows a suferit de la traducerea USER și GDI în modul kernel?


Unii se întreabă dacă stabilitatea sistemului nu va traduce o parte atât de mare a codului în modul kernel. Riscul de a reduce stabilitatea sistemului este minim. Faptul este că, înainte de Windows NT 4 (ca și acum) ca o eroare de violare acces (acces încălcare) în timpul utilizării modului subsistem pentru Windows (The csrss.exe) a condus la un accident de sistem, deoarece procesul subsistemului Windows a fost și rămâne vitală important pentru funcționarea întregului sistem. Deoarece structurile de date care definesc fereastra de pe ecran, conține în acest proces, distrugerea acestuia duce la distrugerea interfeței cu utilizatorul. Cu toate acestea, chiar și atunci când Windows funcționează ca un server fără un sistem de proces interactiv nu putea funcționa fără Csrss, deoarece procesele de server folosesc uneori mesaje fereastra pentru a controla starea internă a cererii. Deci, în Windows erori, cum ar fi încălcări de acces în același cod rulează numai în modul kernel, pur și simplu duce rapid la un accident - excepții în modul de kernel necesită încetarea sistemului.
Cu toate acestea, teoretic există un alt pericol. Deoarece acest cod este rulat în modul kernel, o eroare (de exemplu, folosind un pointer incorect) poate afecta structurile de date protejate de modul kernel. Înainte de Windows NT 4, acest lucru ar putea duce la o încălcare a accesului, deoarece scrierea în paginile modulului kernel din modul de utilizare nu este permisă. Dar rezultatul ar fi o prăbușire a sistemului. Acum când executați codul în modul kernel, scrierea pe orice pagină de memorie pe un pointer greșit nu produce neapărat un accident de sistem imediat. Ho, în cazul în care unele structuri de date sunt deteriorate, accidentul este probabil să se întâmple. Cu toate acestea, există riscul ca, datorită unui astfel de indicator, tamponul de date să nu fie corupt, ci tamponul de memorie, iar acest lucru va determina scrierea pe disc a unui program de utilizator sau a unor date incorecte.
Există încă o consecință negativă a transferării driverelor grafice în modul kernel. Anterior, anumite părți ale driverului grafic au fost executate în Csrss, iar restul componentelor au fost în modul kernel. Acum, întregul driver funcționează numai în modul kernel. Deoarece nu toate driverele dispozitivelor grafice Windows suportate sunt dezvoltate de Microsoft, aceasta lucrează îndeaproape cu producătorii de hardware pentru a se asigura că ei dezvoltă drivere fiabile și eficiente. Toți șoferii livrați împreună cu sistemul sunt testați la fel de atent ca și alte componente ale sistemului executiv.
În cele din urmă, este important să înțelegem că o astfel de schemă (în care subsistemul pentru susținerea ferestrelor și a graficelor rulează în modul kernel) nu este inerent riscant. Aceeași abordare este utilizată pentru multe alte drivere de dispozitive (de exemplu, carduri de rețea și unități de hard disk). Toate aceste drivere care rulează în modul kernel nu au redus niciodată fiabilitatea Windows NT
Unele dintre ele se ocupă de reducerea eficienței multitasking-ului preventiv al Windows datorită traducerii managerului de ferestre și a GDI în modul kernel. Teoria din spatele acestui punct de vedere mărește timpul petrecut pentru prelucrarea suplimentară a Windows în modul kernel. Acest aviz a rezultat dintr-o neînțelegere a arhitecturii Windows. Într-adevăr, în multe alte sisteme de operare care acceptă în mod formal multitasking preemptiv, programatorul nu înlocuiește niciodată firele care rulează în mod kernel sau dispune, dar numai în anumite situații. Cu toate acestea, în Windows, toate firele care rulează în modul kernel sunt planificate și înlocuite în același mod ca și firele în modul utilizator, codul sistemului executiv este complet reentrant. În plus față de multe alte considerente, acest lucru este pur și simplu necesar pentru a atinge un nivel ridicat de scalabilitate a sistemului pentru echipamentul cu funcție SMR.
O altă direcție de speculație a fost aceea de a reduce scalabilitatea SMP ca urmare a schimbărilor deja descrise. Studii teoretice au fost: devreme în interacțiunea dintre cererea și managerul de ferestre sau GDI a implicat două-Flow, una - în anexă, și unul - în csrss.exe. Prin urmare, în sistemele SMP, unde aceste fluxuri pot fi executate în paralel, debitul crește. Acest lucru indică o lipsă de înțelegere a tehnologiilor aplicate la Windows NT 4. B cele mai multe cazuri, cauza procesului de aplicații client subsistem pentru Windows sincronă, adică. Server de procesare apel în așteptare E. Firul client este complet blocat, iar debitul este reluat numai după aceea. Deci, nici un paralelism în sistemele SMP nu este de atins. Acest fenomen este ușor de observat în sistemele SMP prin exemplul aplicațiilor care lucrează intens cu grafica. În acest caz, se va constata că într-un sistem dual procesor fiecare procesor este încărcat cu 50%; De asemenea, este ușor să vedeți un singur flux de Csrss separat de firul aplicației. Intr-adevar, din moment ce cele doua thread-uri interactioneaza indeaproape si sunt intr-o stare similara, procesoarele trebuie sa reseta constant cache-ul pentru a mentine sincronizarea. Din acest motiv, aplicațiile grafice cu un singur fir în sistemele SMP care rulează Windows NT 3.51 sunt de obicei efectuate mai lent decât în ​​sistemele cu un singur procesor.
B din cauza modificărilor aduse Windows NT 4, a fost posibil să se mărească debitul de SMP-sisteme de manager de ferestre aplicatii intensive si GDI, - mai ales atunci când o aplicație are mai mult de un fir. În cazul în care există două fluxuri de aplicații pe o mașină dual-procesor care rulează Windows NT 3.51 pentru timpul CPU pentru a concura într-un total de patru fire (două - în anexă, și două - în Csrss). Deși în fiecare moment gata pentru a efectua, de regulă, doar două fluxuri, nepotrivirii lor duce la pierderea de localizare de referință și de sincronizare cache. Acest lucru se datorează cel mai probabil comutării fluxurilor de aplicații de la un procesor la altul. B Windows NT 4, fiecare dintre cele două fluxuri de aplicații, de fapt, are propriul procesor, și automate fluxuri mecanism de legare în Windows încearcă în mod constant să efectueze firul pe același procesor, maximizând localitatea de referință și prin minimizarea nevoia de sincronizare cache de procesoare individuale .
B În cele din urmă, observăm că creșterea productivității, ca urmare a managerul de ferestre de transfer și GDI din modul utilizator la modul nucleu se realizează fără nici o reducere semnificativă a stabilității și a fiabilității sistemului - chiar și în cazul mai multor sesiuni create în configurația cu suport pentru Terminal Services.

Subsistemul POSIX
Subsistemul OS / 2

După cum se va arăta în detaliu în capitolul 6, firele sunt elementele programului executabil și, prin urmare, sunt supuse programării (conectarea la procesor conform unei anumite scheme). B OS / 2 64 niveluri de prioritate (de la 0 la 63), iar în Windows - 32 (de la 0 la 31). În ciuda acestui fapt, 64 de niveluri de prioritate OS / 2 sunt proiectate în funcție de prioritățile dinamice ale Windows de la 1 la 15. Firele OS / 2 care rulează pe Windows nu primesc niciodată priorități în timp real (16-31).







Articole similare

Trimiteți-le prietenilor: