CATEGORII DOCUMENTE |
Intreruperi de pagina - UNIX
Sistemul poate produce doua tipuri de intreruperi de pagina: de validitate si de protectie. Deoarece rutinele de tratare a intreruperilor de pagina trebuie sa citeasca pagina de pe disc in memorie si sa astepte pe parcursul operatiilor I/O, rutinele de tratare a intreruperilor reprezinta o exceptie de la regula generala potrivit careia rutinele de tratare a intreruperilor nu se pot pune in asteptare. Totusi, deoarece rutina se pune in asteptare in contextul procesului care a cauzat intreruperea, intreruperea este legata de procesul in executie; prin urmare, nu sunt puse in asteptare procese in mod arbitrar.
Intreruperi de validitate
Daca un proces incearca sa acceseze o pagina al carei bit validare nu este setat, apare o intrerupere de validitate si nucleul apeleaza rutina de tratare a intreruperii de validitate (Figura 12.10).
algoritm vfault /*rutina de tratare a intreruperii de validitate*/
intrare: adresa unde este intrerupt procesul;
iesire: nici una;
if ( adresa este valida acum)
/*este posibil ca procesul sa fi fost in asteptare mai inainte*/
goto la iesire;
if ( pagina este in memoria cache )
else /* pagina nu este in memoria cache */
trezeste procesele ( eveniment: continutul paginii este valid ); }
seteaza bitul validare pentru pagina respectiva;
reseteaza bitii modificare si varsta;
recalculeaza prioritatea procesului;
iesire: deblocheaza regiunea; }
Figura 12.10 Algoritmul rutinei de tratare a intreruperii de validitate
Pentru paginile care sunt in afara spatiului de adrese virtuale al procesului bitul validare nu este setat, si nu este setat nici pentru acele pagini care sunt in spatiul de adrese virtuale al procesului dar nu au momentan asignate pagini fizice. Hardware-ul informeaza nucleul despre adresele virtuale accesate pentru ca aceasta sa produca o intrerupere de pagina, iar nucleul gaseste intrarea din tabela de pagini si descriptorul de bloc disc pentru pagina respectiva. Nucleul blocheaza regiunea care contine intrarea in tabela de pagini pentru a preveni conditiile de concurenta care ar putea sa apara daca procesul page stealer incearca sa evacueze pagina. Daca descriptorul de bloc disc nu are nici o inregistrare referitoare la pagina care a cauzat intreruperea, incercarea de a referi memoria este invalidata iar nucleul emite semnalul 'violare de segmentare' catre procesul respectiv. Este aceeasi procedura pe care o urmeaza un sistem cu swapping cand un proces refera o adresa invalida, cu diferenta ca acesta recunoaste imediat eroarea deoarece toate paginile legale sunt rezidente in memorie. Daca referinta la memorie a fost corecta, nucleul aloca o pagina de pe dispozitivul de swap sau din fisierul executabil.
Figura 12.11 Aparitia intreruperilor de validitate
Pagina care a cauzat intreruperea se poate gasi in una din urmatoarele stari:
in zona de swap si nu in memorie;
in lista de pagini libere in memorie;
intr-un fisier executabil;
marcata ' incarcare la cerere ';
marcata ' initializare cu zero '.
Sa consideram in continuare fiecare din aceste cazuri. Daca o pagina este pe dispozitivul de swap si nu in memorie (cazul 1), ea a fost candva in memoria principala insa a fost evacuata de procesul page stealer. In descriptorul de bloc disc, nucleul gaseste dispozitivul de swap si numarul blocului pe care se gaseste pagina si verifica daca pagina este in memoria cache. Nucleul actualizeaza intrarea din tabela de pagini astfel incat aceasta sa printeze catre pagina care urmeaza sa fie citita, pune intrarea din tabela pfdata in lista hash in vederea sporirii vitezei de executie a rutinei de tratare a intreruperii si apoi citeste pagina de pe dispozitivul de swap. Procesul care produce intreruperea se pune in asteptare pana cand se termina operatiile I/O, moment in care nucleul trezeste alte procese care asteptau sa fie citit continutul paginii.
De exemplu, sa consideram intrarea din tabela de pagini pentru adresa virtuala 66k din figura 12.11. Daca un proces genereaza o intrerupere de validitate atunci cand acceseaza pagina, rutina de tratare a intreruperii examineaza descriptorul de bloc disc si constata ca pagina este continuta in blocul 847 al dispozitivului de swap (presupunem ca exista doar un asemenea dispozitiv). De aici rezulta ca adresa virtuala este corecta. Rutina de tratare a intreruperii cauta apoi pagina in memoria cache, dar nu o gaseste. Deci, nu exista o copie a paginii virtuale in memorie si rutina va trebui sa o citeasca de pe dispozitivul de swap. Nucleul asigneaza pagina 1776 (Figura 12.12), citeste continutul paginii virtuale de pe dispozitivul de swap in noua pagina si actualizeaza intrarea din tabela de pagini pentru a referi pagina 1776. In final, actualizeaza descriptorul de bloc disc pentru a indica faptul ca pagina este inca evacuata, si intrarea din tabela pfdata pentru pagina 1776 pentru a indica faptul ca blocul 847 de pe dispozitivul de swap contine o copie identica a paginii virtuale.
Figura 12.12 Dupa incarcarea paginii in memorie
Nucleul nu are de facut totdeauna o operatie I/O cand apare o intrerupere de validitate, chiar daca descriptorul de bloc disc indica faptul ca pagina este evacuata (cazul 2 ).Este posibil ca nucleul sa nu fi reasignat niciodata pagina fizica dupa ce a evacuat-o sau ca alt proces sa fi produs o intrerupere pentru pagina virtuala, asignand pentru ea o alta pagina fizica; in fiecare caz, rutina de tratare a intreruperii gaseste pagina in memoria cache de pagini si pune numarul blocului in descriptorul de bloc disc. Rutina actualizeaza intrarea din tabela de pagini pentru a pointa catre pagina tocmai gasita, incrementeaza contorul de referinte al acesteia si sterge pagina din lista paginilor libere, daca este necesar. De exemplu, sa presupunem ca un proces genereaza o intrerupere cand acceseaza adresa virtuala 64k din figura 12.11. Cautand pagina in memoria cache, nucleul gaseste ca intrarea 1861 a tabelei pfdata este asociata cu blocul disc 1206. El seteaza intrarea din tabela de pagini pentru adresa virtuala 64k sa pointeze catre pagina 1861, si apoi seteaza bitul validare
. Numarul de bloc disc asociaza astfel intrarea in tabela de pagini unei intrari in tabela pfdata, ceea ce explica salvarea acestuia in ambele tabele.
In mod similar, rutina de tratare a intreruperii nu trebuie sa citeasca pagina in memorie daca alt proces a generat o intrerupere pentru aceeasi pagina, dar nu a terminat inca incarcarea acesteia in memorie. Rutina de tratare gaseste blocata regiunea care contine intrarea in tabela de pagini ca urmare a unei alte instante a rutinei de tratare a intreruperii. De aceea, se pune in asteptare pana la terminarea celelalte instante a rutinei, gaseste pagina valida si se termina. Un astfel de scenariu este ilustrat in figura 12.13.
Figura 12.13 Dubla intrerupere de pagina
Daca nu exista o copie a paginii pe dispozitivul de swap, dar aceasta exista in fisierul executabil ( cazul 3 ), nucleul citeste pagina din fisierul original. Rutina de tratare a intreruperii examineaza descriptorul de bloc disc, gaseste numarul blocului logic din fisier care contine pagina, si inodul asociat intrarii din tabela de regiuni. Numarul blocului logic este folosit ca deplasament intr-o lista de numere de blocuri disc atasata inodului pe timpul apelului sistem exec. Cunoscand numarul blocului disc, nucleul citeste pagina in memorie. De exemplu, descriptorul de bloc disc pentru adresa virtuala 1k din figura 12.11 ilustreaza faptul ca pagina este continuta in blocul logic 3 din fisierul executabil.
Daca un proces genereaza o intrerupere de pagina pentru o pagina marcata 'incarcare la cerere ' sau 'initializare cu zero' (cazurile 4 si 5), nucleul aloca o pagina libera in memorie si actualizeaza intrarea corespunzatoare din tabela de pagini. Pentru pagina marcata ' initializare cu zero ', nucleul umple toata pagina cu '0'. In final, sterge indicatoarele ' initializare cu zero' si 'incarcare la cerere ': pagina este acum valida in memorie iar continutul sau nu este duplicat pe dispozitivul de swap sau in sistemul de fisiere. Aceasta s-ar intampla la accesarea adreselor virtuale 3k si 65k din figura 12.11: nici un proces nu a accesat paginile de cand s-a executat apelul sistem exec.
Rutina de tratare a intreruperii de validare se incheie cu setarea bitului validare al paginii si cu stergerea bitului modificare. Aceasta recalculeaza apoi prioritatea procesului deoarece a trebuit sa se puna in asteptare la o prioritate de nivel nucleu, obtinand astfel un avantaj incorect de planificare la revenirea in modul utilizator. In final, daca se revine in modul utilizator, verifica daca s-au primit semnale pe timpul tratarii intreruperii de pagina.
Intreruperi de protectie
Al doilea fel de intrerupere pe care o poate produce un proces este intreruperea de protectie ceea ce inseamna ca procesul a accesat o pagina valida dar bitii de permisiune asociati paginii nu permit accesul la aceasta (sa ne amintim exemplul din figura 12.11, in care un proces incearca sa scrie in spatiul sau de text). Un proces poate, de asemenea, produce o intrerupere de protectie atunci cand incearca sa scrie o pagina al carei bit copiere la scriere a fost setat pe timpul apelului sistem fork. Nucleul trebuie sa determine daca permisiunea de acces a fost refuzata deoarece pagina are setat bitul copiere la scriere sau daca s-a intamplat ceva ilegal.
Hardware-ul furnizeaza rutinei de tratare a intreruperii de protectie adresa virtuala la care a aparut intreruperea, iar aceasta gaseste regiunea si intrarea din tabela de pagini corespunzatoare (Figura 12.14). Rutina va bloca regiunea astfel incat procesul page stealer sa nu poata evacua pagina cat timp opereaza cu ea rutina de tratare. Daca aceasta determina ca intreruperea a fost cauzata de faptul ca a fost setat bitul copiere la scriere, si daca pagina este folosita in comun cu alte procese, nucleul aloca o pagina noua si copiaza in aceasta continutul vechii pagini; celelalte procese isi mentin referintele la pagina veche.
algoritm pfault
intrare: adresa la care procesul a fost intrerupt;
iesire: nici una;
else
seteaza bitul modificare , sterge bitul copiere la scriere din intrarea
in tabela de pagini;
recalculeaza prioritatea procesului;
verifica primirea de semnale;
iesire: deblocheaza regiunea;
Figura 12.14 Algoritmul rutinei de tratare a intreruperii de protectie
Dupa copierea paginii si actualizarea intrarii din tabela de pagini, nucleul decrementeaza contorul de referinte al vechii intrari din tabela pfdata. Figura 12.15 ilustreaza urmatorul scenariu: trei procese folosesc in comun pagina fizica 828. Procesul B scrie pagina dar produce o intrerupere de protectie deoarece bitul ' copiere la scriere ' este setat.
Rutina de tratare a intreruperii de protectie aloca pagina 786, copiaza continutul paginii 828 in noua pagina, decrementeaza contorul de referinte al paginii 828 si actualizeaza intrarea din tabela de pagini accesata de procesul B sa pointeze catre pagina 786.
Figura 12.15 Intrerupere de protectie cu bitul copiere la scriere setat
Daca bitul 'copiere la scriere ' este setat dar nu sunt alte procese care folosesc in comun aceasta pagina, nucleul permite procesul sa scrie pagina fizica. El pune pe zero bitul ' copiere la scriere ' si elimina asocierea paginii cu copia sa de pe disc. Apoi sterge intrarea in tabela pfdata din coada de pagini pentru ca noua copie a paginii virtuale nu mai exista pe dispozitivul de swap. Apoi, nucleul decrementeaza contorul tabelei de folosire a dispozitivului de swap pentru pagina respectiva si daca aceasta ajunge la zero, elibereaza spatiul de pe dispozitivul de swap.
Daca intrarea din tabela de pagini este invalida si bitul sau ' copiere la scriere este setat pentru a produce o intrerupere de protectie, sa presupunem ca sistemul trateaza mai intai intreruperea de validitate cand un proces acceseaza pagina. Cu toate acestea, rutina de tratare a intreruperii de protectie trebuie sa verifice daca pagina mai este valida, deoarece ea s-ar putea pune in asteptare cat timp regiunea este blocata iar procesul page stealer ar putea evacua, intre timp, pagina din memorie. Daca pagina nu este valida, rutina de tratare se termina imediat, iar procesul va produce din nou o intrerupere de validitate.
Nucleul trateaza intreruperea de validitate, dar procesul va produce din nou o intrerupere de protectie. Mai mult ca sigur el va trata intreruperea de protectie fara nici o alta interferenta deoarece va tece destul timp pana ce pagina va avea "varsta" necesara pentru a fi evacuata. Aceasta secventa de evenimente este ilustrata in figura 12.16
Figura 9.27 Interactiunea dintre intreruperea de protectie si intreruperea
de validitate
Cand rutina de tratare a intreruperii de protectie isi termina executia, ea seteaza bitii protectie si modificare si sterge bitul 'copiere la scriere '.
Apoi recalculeaza prioritatea procesului si verifica daca au fost receptionate semnale, ca si la sfarsitul rutinei de tratare a intreruperii de validitate.
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1275
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved