CATEGORII DOCUMENTE |
Un proces poate mari sau micsora dimensiunea regiunii sale de date prin utilizarea apelului sistem brk. Sintaxa pentru apelul sistem este:
brk(endds);
unde endds devine valoarea celei mai mari adrese virtuale a regiunii de date a procesului (denumita valoare de intrerupere). Ca o alternativa, utilizatorul poate apela:
oldendds=sbrk(increment);
unde increment modifica valoarea curenta de intrerupere cu numarul de biti specificat si oldennds este valoarea de intrerupere inainte de apel. Sbrk este o subrutina din biblioteca C care apeleaza brk. Daca spatiul de date al procesului creste in urma apelului, noul spatiu de date alocat este virtual contiguu in vechiul spatiu de date. Nucleul verifica daca noua dimensiune a procesului este mai mica decat dimensiunea maxima permisa de sistem si daca noua regiune de date nu se suprapune peste spatiul de adrese virtual asignat anterior (Figura 8.26). Daca toate verificarile sunt executate cu succes, nucleul apeleaza growreg pentru a aloca memorie auxiliara (de exemplu, tabele de pagini) pentru regiunea de date si incrementeaza campul dimensiune proces. Pe un sistem cu swapping, el incearca de asemenea sa aloce memorie pentru noul spatiu si initializeaza continutul acesteia cu 0; daca nu exista spatiu de memorie, el evacueaza procesul pe disc pentru a obtine spatiul necesar (se va explica in detaliu in capitolul 11). Daca procesul apeleaza brk pentru a elibera spatiul alocat anterior, nucleul elibereaza memoria; daca procesul acceseaza adrese virtuale in spatiul de adrese al paginilor eliberate, se produce o intrerupere de memorie.
algoritmul brk
intrari: noua valoare de intrerupere
iesiri: vechea valoare de intrerupere
schimba dimensiunea regiunii (algoritmul growreg);
initializeaza la 0 adresele din noul spatiu de date;
deblocheaza regiunea de date a procesului;
}
Figura 8.26 Algoritmul pentru schimbarea dimensiunii unui proces
Figura 8.27 prezinta un program care utilizeaza algoritmul brk si datele de iesire rezultate in urma rularii pe un calculator AT&T 3B20. Dupa ce se aranjeaza interceptarea semnalului de violare a segmentarii prin apelul semnal signal, procesul apeleaza sbrk si tipareste valoarea sa initiala de intrerupere. Apoi el intra intr-un ciclu, incrementand un pointer catre caractere si scriindu-si continutul pana cand se incearca scrierea la o adresa in afara regiunii de date, provocand semnalul de violare a segmentarii. Interceptand semnalul, functia catcher apeleaza sbrk pentru a aloca alti 256 de octeti in regiunea de date; procesul continua de unde a fost intrerupt in ciclu, scriind in noul spatiu de adrese alocat. Cand se cicleaza din nou in afara regiunii de date, se repeta intreaga procedura. Un fenomen interesant apare la masinile a caror memorie este alocata prin pagini, asa cum este masina 3B20. O pagina este cea mai mica unitate de memorie care este protejata prin hardware si deci, prin hardware nu se poate detecta cand un proces scrie la adrese care sunt dincolo de valoarea de intrerupere. Acest lucru este aratat in figura 8.27: primul apel sbrk returneaza valoarea 140924, ceea ce inseamna ca sunt 388 octeti lasati in pagina, care contine 2Ko pe o masina 3B20.
#include <signal.h> char *cp; int callno; main() catcher (signo) int signo; Date de iesire: valoarea initiala returnata de apelul brk 140924 s-a interceptat semnalul 11 primul la adresa 141312 s-a interceptat semnalul 11 al 2-lea la adresa 141312 s-a interceptat semnalul 11 al 3-lea la adresa 143360 (unele adrese sunt tiparite la al 10-lea apel) s-a interceptat semnalul 11 al 10-lea la adresa 143360 s-a interceptat semnalul 11 al 11-lea la adresa 145408 (unele adrese sunt tiparite la al 18-lea apel) s-a interceptat semnalul 11 al 18-lea la adresa 145408 s-a interceptat semnalul 11 al 19-lea la adresa 145408 |
Figura 8.27 Exemplu de utilizare a algoritmului brk
Procesul va fi intrerupt doar cand se adreseaza pagina urmatoare, la adresa 141312.Functia catcher adauga 256 de octeti la valoarea de intrerupere, facand-o 141180, valoare inca mica pentru a fi adresa in pagina urmatoare. De aceea, procesul se intrerupe imediat, tiparind aceeasi adresa, 141312. Dupa urmatorul apel sbrk, nucleul aloca o noua pagina de memorie, asa ca nucleul poate accesa alti 2ko, la adresa 143360, chiar daca valoarea de intrerupere nu este asa mare. La urmatoarea intrerupere, procesul va apela sbrk de 8 ori (pana cand acesta poate continua). Astfel, un proces poate uneori sa se execute dincolo de adresa sa de intrerupere, cu toate ca acesta este un stil de programare necorespunzator.
Nucleul extinde automat dimensiunea stivei utilizator cand aceasta este depasita, urmand un algoritm similar algoritmului brk. Initial un proces contine destul spatiu pentru stiva utilizator pentru a pastra parametrii apelului exec, dar poate aparea o depasire a acestui spatiu in timp ce se depun date in stiva de-a lungul executiei procesului. Cand se depaseste stiva proprie, masina genereaza o intrerupere de memorie, deoarece procesul incearca sa acceseze o locatie in afara spatiului sau de adrese. Nucleul determina ca motivul pentru care a avul loc intreruperea de memorie a fost depasirea stivei prin compararea valorii indicatorului de stiva cu marimea regiunii de stiva. Nucleul aloca spatiu nou pentru regiunea de stiva asa cum aloca spatiu in algoritmul brk. Cand revine din intrerupere procesul are spatiu de stiva necesar pentru a continua.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1166
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved