CATEGORII DOCUMENTE |
Manipularea spatiului de adrese al unui proces - UNIX
In continuare acest capitol descrie cum schimba nucleul contextul intre procese si cum sunt depuse si scoase din stiva cadrele context, privind cadrul context de nivel utilizator ca un obiect static care nu poate fi schimbat pe timpul refacerii contextului procesului.
Totusi, diferite apeluri sistem manipuleaza spatiul de adrese virtuale al procesului, cum se va vedea in capitolul urmator, prin intermediul unor operatii bine definite asupra regiunilor. Aceasta sectiune descrie structura de date a regiunii si operatiile cu regiuni; urmatorul capitol se ocupa de apelurile sistem care folosesc operatiile cu regiuni.
Intrarea in tabela de regiuni contine informatiile necesare pentru a descrie o regiune. In detaliu ea contine urmatoarele campuri:
pointer catre inodul fisierului al carui continut a fost incarcat
initial in regiune,
tipul regiunii (text, memorie partajata, date private sau stiva),
marimea regiunii,
localizarea regiunii in memoria fizica,
starea regiunii care poate fi o combinatie de
blocata
in asteptarea rezolvarii cererii
in incarcare
valida, incarcata in memorie
contorul de referinta, da numarul de procese care refera
regiunea.
Operatiunile de manipulare a regiunilor sunt: blocare regiune, deblocarea unei regiuni, alocarea unei regiuni, atasarea unei regiuni la spatiul de memorie al unui proces, schimbarea dimensiunii unei regiuni, incarcarea unei regiuni dintr-un fisier in spatiul de memorie al unui proces, eliberarea unei regiuni, detasarea unei regiuni din spatiul de memorie al unui proces, duplicarea continutului unei regiuni. De exemplu, apelul sistem exec care suprascrie spatiul de adrese al utilizatorului cu continutul unui fisier executabil, detaseaza vechile regiuni, le elibereaza daca nu sunt partajate, aloca regiuni noi, le ataseaza si le incarca cu continutul fisierului.
In continuare sunt descrise in detaliu operatiunile cu regiuni, presupunand modelul de gestiune a memoriei descris mai devreme (tabele de pagini si seturile de registrii tripli) si existenta algoritmilor pentru alocarea tabelelor de pagini si a paginilor de memorie fizica (Capitolul 12).
Blocarea si deblocarea unei regiuni
Nucleul contine operatiile de blocare si deblocare a unei regiuni, independent de operatiile de alocare si eliberare a regiunii, asa cum sistemul de fisiere contine operatii de blocare-deblocare si alocare-eliberare pentru inoduri (algoritmii iget si iput). Astfel nucleul poate bloca si aloca o regiune si mai tarziu o poate debloca fara sa o elibereze. Similar daca el vrea sa manipuleze o regiune alocata, o poate bloca pentru a preveni accesarea ei de catre alte procese si ulterior o deblocheaza.
Alocarea unei regiuni
Nucleul aloca o regiune noua (algoritmul allocreg, Figura 7.16) pe durata apelurilor sistem fork, exec si shmget (memorie partajata). Nucleul contine o tabela de regiuni ale carei intrari apar fie intr-o lista inlantuita de intrari libere fie intr-o lista inlantuita de intrari active. Atunci cand aloca o intrare din tabela de regiuni nucleul elimina prima intrare disponibila din lista celor libere, o plaseaza in lista celor active, blocheaza regiunea si ii marcheaza tipul (partajata sau privata). Cu cateva exceptii fiecare proces este asociat cu un fisier executabil ca urmare a unui apel exec anterior, si functia allocreg stabileste ca valoarea campului inode din intrarea in tabela de regiuni sa pointeze catre inodul fisierului executabil. Inodul indica nucleului regiunea astfel incat alte procese o pot partaja daca este nevoie. Nucleul incrementeaza contorul de referinta a inodului pentru a evita ca alte procese sa elimine din memorie continutul inodului atunci cand il elibereaza. Functia allocreg returneaza o regiune alocata si blocata.
algoritmul allocreg /* aloca o regiune */
intrare pointer catre inod
(2) tipul regiunii
iesire: regiune blocata
Figura 7.16. Algoritm pentru alocarea unei regiuni
Atasarea unei regiuni unui proces
Nucleul ataseaza o regiune in timpul apelurilor sistem fork, exec si shmat, pentru a o conecta la spatiul de adrese al unui proces (cu algoritmul attachreg, Figura 7.17.). Regiunea poate fi o regiune proaspat alocata sau o regiune existenta pe care procesul o va partaja cu alte procese. Nucleul aloca o intrare libera in tabela privata de regiuni ( pregion ), seteaza campul tip la text, date, memorie partajata sau activa si inregistreaza adresa virtuala la care va fi plasata regiunea in spatiul de adrese al procesului. Procesul nu trebuie sa depaseasca limitele impuse de sistem pentru cea mai mare adresa virtuala, iar adresele virtuale ale noii regiuni nu trebuie sa se suprapuna cu adresele unor regiuni existente. De exemplu, daca sistemul restrictioneaza cea mai mare adresa virtuala la 8 Mo, ar fi ilegal sa se ataseze o regiune cu dimensiunea de 1 Mo la adresa virtuala 7,5 Mo. Daca este legal sa se ataseze o regiune, nucleul incrementeaza campul dimensiune din intrarea in tabela de procese in functie de dimensiunea regiunii si incrementeaza contorul de referinta al regiunii.
algoritmul attachreg /* ataseaza o regiune unui proces */
intrare (1) pointer catre regiunea ce trebuie atasata
(2) procesul la care trebuie atasata regiunea
(3) adresa virtuala in proces unde va fi atasata regiunea
(4) tipul regiunii
iesire: intrare in tabela privata de regiuni
Figura 7.17. Algoritm pentru atasarea unei regiuni.
In continuare algoritmul attachreg initializeaza un nou set de registrii tripli pentru gestiunea memoriei procesului: daca regiunea nu este deja atasata altui proces nucleul aloca tabele de pagini pentru aceasta intr-un apel ulterior al functiei growreg (sectiunea urmatoare); in caz contrar va folosi tabelele de pagina existente. In final attachreg returneaza un pointer catre intrarea in tabela privata de regiuni pentru noua regiune atasata. De exemplu sa presupunem ca nucleul doreste sa ataseze o regiune existenta (partajata) de text cu dimensiunea de 7 Ko la adresa virtuala 0 a unui proces (Figura 7.18): el va aloca un nou registru triplu de gestiune a memoriei si il va initializa cu adresa tabelei de pagina a regiunii, adresa virtuala 0 si cu dimensiunea tabelei de pagini intrari).
Schimbarea dimensiunii unei regiuni
Un proces isi poate mari sau micsora spatiul adreselor virtuale prin intermediul apelului sistem sbrk. Similar stiva unui proces creste automat (adica procesul nu apeleaza explicit nici un apel sistem) in functie de numarul de apeluri de proceduri. Intern nucleul invoca algoritmul growreg pentru schimbarea dimensiunii unei regiuni (Figura 7.19). Atunci cand o regiune se mareste, nucleul verifica daca adresele virtuale ale regiunii marite nu se suprapun cu cele ale altei regiuni si daca cresterea regiunii nu va face ca dimensiunea procesului sa devina mai mare decat spatiul de adrese virtuale permis. Nucleul nu apeleaza niciodata algoritmul growreg pentru a mari dimensiunea unei regiuni partajate care este deja atasata mai multor procese, de aceea nu va trebui sa va faceti probleme pentru faptul ca marirea dimensiunii unei regiuni ar produce marirea dimensiunii altor procese peste dimensiunile permise.
Figura 7.18. Un exemplu de atasare a unei regiuni de text existenta.
Cele doua cazuri in care nucleul foloseste growreg pentru o regiune existenta sunt sbrk pentru regiunea de date a unui proces si cresterea automata a stivei utilizator. Amandoua regiunile sunt private. Regiunile de text si de memorie partajata nu pot fi marite dupa ce au fost initializate. Aceste cazuri vor fi clarificate in capitolul urmator.
Nucleul aloca acum tabele de pagini (sau extinde tabelele de pagini existente) pentru marirea regiunii si aloca memorie fizica pe sistemele care nu accepta paginare la cerere. La alocarea memoriei fizice nucleul verifica daca aceasta memorie este disponibila inainte de apelarea functiei growreg; daca nu mai este memorie disponibila va apela la alte masuri necesare pentru marirea dimensiunii unei regiuni. Daca procesul micsoreaza regiunea nucleul va elibera pur si simplu memoria asignata regiunii.
algoritmul growreg /* schimba marimea unei regiuni */
intrare (1) pointer catre intrarea in tabela privata de regiuni
(2) marimea cu care se schimba dimensiunea regiunii (poate fi
pozitiva sau negativa)
iesirea:niciuna
}
else /* dimensiunea regiunii descreste */
face o (alta) initializare a tabelelor auxiliare, daca este necesar;
seteaza campul dimensiune din tabela de procese;
Figura 7.19 Algoritmul growreg pentru schimbarea dimensiunii
unei regiuni
In ambele cazuri el va ajusta dimensiunea procesului si dimensiunea regiunii si va reinitializa intrarea in tabela privata de regiuni si registrii tripli de gestiune a memoriei in conformitate cu noua mapare.
De exemplu, presupunem ca regiunea de stiva a unui proces incepe la adresa virtuala 128K si contine de obicei 6Ko, si nucleul doreste sa extinda dimensiunea regiunii cu 1Ko (1 pagina).
Daca marimea procesului este acceptabila si adresele virtuale de la 134K la 135K -1 nu apartin altei regiuni atasate procesului, nucleul extinde dimensiunea regiunii. El extinde tabela de pagini, aloca o pagina de memorie, si initializeaza o noua intrare in tabela de pagini. Figura 7.20 ilustreaza acest caz.
Incarcarea unei regiuni
Intr-un sistem care suporta paginare la cerere, nucleul poate "mapa" un fisier in spatiul de adrese al procesului in timpul apelului sistem exec, aranjand sa citeasca paginile fizice individual mai tarziu la cerere, asa cum va fi explicat in capitolul 12. Daca nucleul nu suporta paginarea la cerere, el trebuie sa copieze fisierul executabil in memorie, incarcand regiunile procesului la adresele virtuale specificate in fisierul executabil. Nucleul poate atasa o regiune la o adresa virtuala diferita fata de unde el incarca continutul fisierului, creand un spatiu liber in tabela de pagini (revezi Figura 7.18).
De exemplu, aceasta trasatura este folosita pentru a produce erori de memorie cand programele utilizator acceseaza adresa 0 ilegal. Programele cu variabile pointer folosesc uneori acesti pointeri fara sa verifice valoarea lor este 0 si, din acest motiv folosirea lor este ilegala.
Prin protejarea paginii care contine adresa 0, procesele care gresesc accesand pagina cu adresa 0 produc o eroare si se termina fortat, permitand programatorilor sa descopere aceste greseli mari repede.
Figura 7.20 Cresterea regiunii de stiva cu 1Ko
La incarcarea unui fisier intr-o regiune, algoritmul loadreg (Figura 7.21) calculeaza spatiul liber dintre adresa virtuala la care este atasata regiunea la procesul si adresa virtuala de inceput a datelor din regiune si extinde regiunea in conformitate cu cantitatea de memorie de care are nevoie regiunea. Apoi pune regiunea in starea "in incarcare" si citeste datele regiunii in memorie din fisier, folosind o varianta interna a algoritmului apelului sistem read.
Daca nucleul a incarcat o regiune text care poate fi partajata de mai multe procese, este posibil ca alt proces sa poata gasi regiunea si sa incerce sa o utilizeze inainte ca ea sa fie complet incarcata, deoarece primul proces poate fi in asteptare cat timp este citit fisierul.
Pentru a evita problema, nucleul verifica un indicator de stare al regiunii pentru a vedea daca regiunea este complet incarcata si, daca regiunea nu este incarcata, procesul asteapta. La sfarsitul algoritmului loadreg, nucleul reactiveaza procesele care asteapta ca regiunea sa se incarce si schimba starea regiunii in valida si in memorie.
algoritmul loadreg /* incarca o portiune dintr-un fisier intr-o regiune */
intrare pointer catre intrarea in tabela privata de regiuni
(2) adresa virtuala a regiunii de incarcat
(3) pointerul catre inodul fisierului ce trebuie incarcat in regiune
(4) deplasamentul in fisier pentru inceputul regiunii
(5) contorul de octeti pentru cantitatea de date incarcat
iesire: niciuna
Figura 7.21 Algoritmul loadreg
De exemplu, presupunem ca nucleul doreste sa incarce un text de dimensiunea 7Ko intr-o regiune care este atasata la adresa virtuala 0 a unui proces dar vrea sa lase un spatiu liber de 1Ko la inceputul regiunii (Figura 7.21). Din acest moment, nucleul va aloca o intrare in tabela de regiuni si va atasa regiunea la adresa 0 folosind algoritmii allocreg si attachreg. Acum nucleul apeleaza loadreg, care apeleaza growreg de doua ori - prima data pentru a lasa un spatiu liber de 1Ko de la inceputul regiunii, si a doua oara, la alocarea spatiului pentru continutul regiunii - si growreg aloca o tabela de pagini pentru regiune. Nucleul seteaza campurile in u area pentru a citi fisierul: el citeste 7Ko din fisier de la un deplasament specificat (furnizat ca parametru) la adresa virtuala 1Ko a procesului.
Figura 7.22 Incarcarea unei regiuni text
6 Eliberarea unei regiuni
Cand o regiune nu mai este atasata la un proces, nucleul o poate elibera si o repune in lista regiunilor libere (Figura 7.23). Daca regiunea este asociata cu un inod, nucleul elibereaza inodul folosind algoritmul iput, in acord cu incrementarea contorului de referinta al inodului in allocreg. Nucleul elibereaza resursele fizice asociate cu regiunea, cum ar fi tabelele de pagini si paginile de memorie. De exemplu, presupunem ca nucleul doreste sa elibereze regiunea de stiva din figura 7.20. Presupunand ca, contorul regiunii este 0, el elibereaza 7 pagini din memoria fizica si tabela de pagini.
algoritmul freereg /* elibereaza o regiune alocata */
intrare pointer la regiune (blocata)
iesire: niciuna
if (regiunea a avut un inod asociat)
elibereaza inodul (algoritmul iput)
elibereaza memoria fizica asociata regiunii
elibereaza tabelele auxiliare asociate regiunii;
sterge campurile regiunii;
pune regiunea in lista regiunilor libere;
deblocheaza regiunea;
Figura 7.23 Algoritmul pentru eliberarea regiunilor
algoritmul detachreg /* detaseaza o regiune de la un proces */
intrare: pointer catre intrarea din tabela privata de regiuni
iesire niciuna
}
Figura 7.24 Algoritmul pentru detasarea regiunilor
Detasarea unei regiuni de la un proces
Nucleul detaseaza regiunile in apelurile sistem exec, exit, si shmdt (detaseaza memoria partajata). El actualizeaza intrarea din tabela privata de regiuni si rupe legatura cu memoria fizica prin invalidarea registrului triplu de gestiune a memoriei asociat (algoritmul detachreg , Figura 7.24). Mecanismul de translatare a adresei astfel invalidate se aplica procesului, nu regiunii (ca in algoritmul freereg). Nucleul decrementeaza contorul de referinta al regiunii si campul dimensiune din intrarea in tabela de procese in conformitate cu dimensiunea regiunii. Daca contorul de referinte al regiunii ajunge la 0 si daca nu este nici un motiv sa se pastreze regiunea (regiunea nu este o regiune de memorie partajata sau o regiune text cu bitul "sticky " activ, asa cum se va vedea in sectiunea 8.5), nucleul elibereaza regiunea folosind algoritmul freereg. El elibereaza regiunea si inodul blocat, care a fost blocat pentru a preveni conditiile de concurenta asa cum se va prezenta in sectunea 8.5 dar pastreaza regiunea si resursele alocate.
Figura 7.25 Duplicarea unei regiuni
algoritmul dupreg /* duplica o regiune existenta */
intrare: pointer catre intrarea in tabela de procese
iesire pointer catre o regiune blocata identica cu regiunea de duplicat
Figura 7.26 Algoritmul pentru duplicarea unei regiuni
8 Duplicarea regiunii
Apelul sistem fork cere ca nucleul sa dubleze regiunile unui proces. Daca o regiune este partajata (text partajat sau memorie partajata), totusi, nucleul nu are nevoie de o copie fizica a regiunii; in schimb, el incrementeaza contorul de referinta al regiunii, permitand proceselor parinte si fiu sa foloseasca in comun regiunea. Daca regiunea nu este partajata iar nucleul trebuie sa copie fizic regiunea, el aloca o noua intrare in tabela de regiuni, o tabela de pagini si memorie fizica pentru regiune. In figura 7.25 de exemplu, procesul A creeaza procesul B si isi duplica regiunile. Regiunea de text a procesului A este partajata, deci procesul B o poate folosi in comun cu procesul A. Dar regiunile de date si de stiva ale procesului A sunt private, deci procesul B le duplica prin copierea continutului lor in noi regiuni alocate. Chiar pentru regiuni private, copierea fizica a regiuni nu este mereu necesara. Figura 7.26 prezinta algoritmul pentru dupreg.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1158
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved