Partajarea memoriei

În sistemele cu un singur task, memoria principală este împărțită în două părți: o parte a sistemului de operare (monitorul rezident, kernelul) și al doilea pentru programul în desfășurare. În sistemele de multitasking, partea "utilizator" a memoriei trebuie să fie alocată pentru a acoperi mai multe procese. Această sarcină de distribuție este efectuată dinamic de sistemul de operare și este cunoscută sub denumirea de gestionare a memoriei.







Gestionarea eficientă a memoriei este vitală pentru sistemele multi-tasking. Dacă în memorie este localizat doar un număr mic de procese, majoritatea acestor procese vor aștepta finalizarea operațiunilor I / O, iar încărcarea procesorului va fi scăzută. Astfel, este de dorit să alocați memoria în mod eficient, permițându-vă să plasați cât mai multe procese în ea.

Când se iau în considerare diferitele mecanisme și strategii asociate gestionării memoriei, este util să ne amintim cerințele pe care trebuie să le îndeplinească:

Într-un sistem multitasking, memoria principală disponibilă este împărțită în mai multe procese. De obicei, programatorul nu știe în prealabil ce programe vor locui în memoria principală în timp ce programul în curs de dezvoltare se execută. Pentru a maximiza utilizarea procesorului, este de dorit să existe multe procese gata pentru execuție, ceea ce necesită capacitatea de încărcare a proceselor active din memoria principală. Cerința ca programul descărcat să fie reîncărcat în același loc unde a fost localizat și lucrat ar fi o restricție prea puternică. Este foarte de dorit ca acesta să poată fi mutat (mutat) într-o altă zonă a memoriei. Astfel, nu se cunoaște în prealabil unde va fi programat programul. În plus, programul poate fi mutat dintr-o zonă de memorie în alta atunci când se schimbă.

Modulele pot fi create și compilate independent unul de celălalt, iar toate legăturile de la un modul la cel de-al doilea sunt rezolvate de sistem în timp ce programul se execută.

Diferite module pot primi diferite grade de protecție (numai pentru citire, numai pentru execuție) datorită supraîncărcării foarte moderate.

Este posibil să se utilizeze un mecanism care să asigure partajarea modulelor prin diferite procese. Principalul avantaj al partajării la nivel de modul este că ele corespund viziunii programatorului asupra sarcinii și, prin urmare, este mai ușor pentru el să determine dacă un modul trebuie sau nu să fie împărțit.

Instrumentul care îndeplinește cel mai bine aceste cerințe este segmentarea, care va fi discutată în acest capitol printre alte metode de gestionare a memoriei.







Memoria calculatorului este împărțită în cel puțin două niveluri: primar și secundar. Memoria principală oferă acces rapid la un preț relativ ridicat; În plus, este volatilă, adică nu oferă stocare pe termen lung. Memoria secundară este mai lentă și mai ieftină decât memoria principală și este de obicei non-volatilă. În consecință, memoria secundară de mare capacitate poate servi la stocarea pe termen lung a programelor și a datelor, iar memoria principală a unei capacități mai mici este stocarea programelor și a datelor utilizate în prezent.

Într-o astfel de structură pe două nivele, principala preocupare a sistemului este organizarea fluxurilor de informații între memoria primară și cea secundară. Responsabilitatea pentru aceste fluxuri poate fi atribuită unui programator individual, dar acest lucru este impracticabil și nedorit din următoarele motive:

- Este posibil ca memoria principală să nu fie suficientă pentru program și pentru datele sale.

- Într-un mediu de multitasking, programatorul nu știe cât de multă memorie va fi disponibilă pentru program în timpul dezvoltării programului și unde va fi localizată această memorie.

Astfel, este evident că sarcina de a muta informații între două niveluri de memorie trebuie să fie încredințată sistemului de operare. Această sarcină este esența gestionării memoriei.

În microprocesoarele i80x86 nu există două, ci patru niveluri de privilegii. Adesea, nivelurile de privilegii sunt numite inele de protecție, deoarece uneori acestea explică principiul de funcționare a mecanismului însuși; prin urmare, spune că un anumit modul de program "este executat în ringul de protecție cu un astfel de număr".

Principalele obiecte ale sistemului pe care procesorul le manipulează atunci când lucrează în modul protejat sunt descriptorii. Descriptorii segmentului conțin informații despre nivelul de privilegii al segmentului sau datelor de cod corespunzătoare. Nivelul de privilegii al unei sarcini de execuție este determinat de valoarea câmpului privilegiat din descriptorul segmentului său de cod curent. Rețineți că în fiecare descriptor de segment (vezi Fig.3.3) există un câmp DPL în octetul permisiunii de acces, care determină nivelul de privilegii al segmentului asociat cu acesta. Astfel, câmpul DPL al segmentului de cod curent devine câmpul C PL2. Atunci când accesați un segment, în selectorul corespunzător este indicat privilegiul RPL3 selector (vezi Figura 3.4).

Într-o singură sarcină se utilizează segmente cu diferite niveluri de privilegii și, în anumite momente, se execută sau se prelucrează segmente cu niveluri de privilegii corespunzătoare. Mecanismul de verificare a privilegiilor funcționează în situații care pot fi numite tranziții între segmente (apeluri). Aceasta este accesul la un segment de date sau un segment de stivă, transferuri de control între segmente în caz de întreruperi (și situații speciale), când se utilizează comenzile CALL, JMP, INT, IRET, RET. În astfel de apeluri intersegmentale, sunt implicate două segmente: segmentul țintă (la care ne adresăm) și segmentul curent al codului din care se face solicitarea.

Primul pas în crearea unui proces activ este de a încărca programul în memorie RAM și de a crea o imagine a procesului. Aplicația constă dintr-un număr de module compilate sau asamblate în formă de cod obiect. Aceste module sunt conectate pentru a rezolva toate legăturile dintre ele, precum și pentru apelurile către rutinele bibliotecii (care pot fi încorporate în program sau pot fi partajate de codul reprezentat de sistemul de operare). Funcțiile principale ale accesului și distribuției sistemului RAM sunt utilizate de încărcătoare și linkere. Sarcina lor este de a organiza alocarea și comunicarea între ele a modulelor individuale ale programului (procesului).

Partajarea memoriei







Articole similare

Trimiteți-le prietenilor: