Scrigroup - Documente si articole

Username / Parola inexistente      

Home Documente Upload Resurse Alte limbi doc  
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Salvarea contextului unui proces - UNIX

linux



+ Font mai mare | - Font mai mic



Salvarea contextului unui proces - UNIX



Asa cum am observat in sectiunea precedenta nucleul salveaza contextul unui proces ori de cate ori el introduce in stiva un nou cadru context de nivel sistem. In particular, aceasta se intampla cand sistemul receptioneaza o intrerupere, cand executa un apel sistem, sau cand nucleul face o schimbare de context. Aceasta sectiune prezinta detaliile fiecarei situatii.

Intreruperi si exceptii

Sistemul raspunde de tratarea intreruperilor, indiferent daca ele sunt intreruperi hardware (cum ar fi de la ceas sau de la dispozitivele periferice), intreruperi programabile (executia instructiunilor proiectate pentru a genera"intreruperi software"), sau exceptii (cum ar fi erori de pagina). Daca UCP lucreaza la un nivel de executie procesor mai scazut decat nivelul intreruperii, el accepta intreruperea inaintea decodificarii instructiunii urmatoare si ridica nivelul de executie al procesorului, astfel incat nici o alta intrerupere a acelui nivel (sau mai scazut) nu se poate produce cat timp trateaza intreruperea curenta pastrand integritatea structurilor de date ale nucleului (vezi sectiunea 2.2.2). Nucleul trateaza intreruperea cu urmatoarea secventa de operatii

1. Salveaza contextul registru curent al procesului in executie si creeaza (introduce in stiva) un nou cadru context.

2. Determina "sursa" sau cauza intreruperii, identifica tipul intreruperii (de ceas sau de disc) si numarul unitatii care a produs intreruperea, daca este cazul(cum ar fi driverul de disc). Cand sistemul receptioneaza o intrerupere, aceasta primeste un numar de la masina pe care il foloseste ca deplasament intr-o tabela, numita de obicei vector de intrerupere. Continutul vectorului de intrerupere variaza de la o masina la alta, dar de obicei contine adresa rutinei de tratare a intreruperii corespunzatoare sursei de intrerupere si calea de gasire a parametrilor pentru rutina. De exemplu, luam in considerare tabela rutinelor de tratare a intreruperilor din figura 7.9. Daca un terminal intrerupe sistemul, nucleul primeste intreruperea numarul 2 de la hardware si invoca rutina de tratare a intreruperii de terminal .

Figura 7.9 Exemplu de vector de intrerupere

3. Nucleul invoca rutina de tratare a intreruperii. Stiva nucleu pentru noul cadru context este din punct de vedere logic distincta de stiva nucleu pentru cadrul context anterior. Unele implementari folosesc stiva nucleu a procesului aflat in executie pentru stocarea cadrelor de stiva ale rutinelor de tratare a intreruperilor, si alte implementari folosesc o stiva de intreruperi globala pentru stocarea acestor cadre ceea ce garanteaza reluarea executiei procesului curent fara schimbare de context.

4. Dupa terminarea executiei rutinei de tratare a intreruperii se reia executia proceslui curent. Nucleul executa o secventa de instructiuni specifice masinii si reface context registrul si stiva nucleu a cadrului context anterior asa cum erau in momentul aparitiei intreruperii si apoi reia executia cadrului restaurat. Comportamentul procesului poate fi afectat de rutina de tratare a intreruperii, pentru ca aceasta poate altera structurile globale de date ale nucleului si trezirea proceselor aflate in stare de asteptare. De obicei, totusi, procesul isi continua executia ca si cum intreruperea nu ar fi aparut niciodata.

algoritmul inthand  /* tratarea intreruperilor */

intrare niciuna

iesire niciuna

Figura 7.10 Algoritmul pentru tratarea intreruperilor

Figura 7.10 prezinta modul in care nucleul trateaza o intrerupere. Unele masini executa o parte a secventei de operatii prin intermediul hardware-ului sau a unor microinstructiuni pentru a obtine performante mai bune decat daca toate operatiile s-ar executa prin intermediul instructiunilor software.

Figura 7.11 Exemple de intreruperi

Figura 7.11 prezinta un exemplu in care un proces face un apel sistem si receptioneaza o intrerupere de disc in timpul executiei apelului sistem. In timpul executiei rutinei de tratare a intreruperii de disc, sistemul receptioneaza o intrerupere de ceas si executa rutina de tratare a intreruperii de ceas. In momentul cand sistemul receptioneaza o intrerupere (sau face un apel sistem), el creaza un nou cadru context si salveaza contextul registru al cadrului anterior.

2 Interfata de apel sistem



Interfata de apel sistem a nucleului a fost descrisa in capitolul precedent ca un apel normal de functie. Evident, ca secventa de apelare uzuala nu poate schimba modul de executie al procesului de la modul utilizator la modul nucleu. Compilatorul C foloseste o biblioteca de functii predefinite (biblioteca C) care contine denumirile apelurilor sistem, astfel rezolvand referirile apelului sistem in programul utilizator de biblioteca.

Functiile de biblioteca invoca o instructiune care schimba modul de executie al procesului in modul nucleu si determina nucleul sa inceapa executia codului pentru apelurile sistem.Aceasta instructiune este numita "trap "si este vazuta ca o exceptie. Rutinele de biblioteca sunt executate in modul utilizator, dar interfata de apel sistem este un caz special de rutina de tratare a intreruperii. Functiile de biblioteca transmit nucleului un numar unic pentru fiecare apelul sistem intr-un mod dependent de masina - ca parametru pentru instructiunea trap, intr-un registru particular, sau prin stiva - si astfel nucleul determina apelul sistem invocat de utilizator.

algoritmul syscall /* algoritmul pentru invocarea unui apel sistem */

intrare: numarul apelului sistem

iesire rezultatul apelului sistem

else

incarca registri 0 si 1 cu valorile de revenire din apelul sistem;

Figura 7.12 Algoritmul pentru apelul sistem

La tratarea instructiunii trap, nucleul cauta numarul apelului sistem intr-un tabel pentru a gasi adresa corespunzatoare rutinei nucleu care este punctul de intrare pentru apelul sistem si pentru a gasi numarul parametrilor pe care il necesita apelul sistem (Figura 7.12.).

Nucleul calculeaza adresa (utilizazator) a primului parametru al apelului sistem prin adaugarea (sau scaderea, depinzand de directia de crestere a stivei) unui deplasament la pointerul stivei utilizator, corespunzator numarului de parametrii ai apelului sistem. In final el copiaza parametrii utilizator in zona u area, si apeleaza rutina sistem corespunzatoare.

Dupa executia codului apelului sistem, nucleul verifica daca a existat vreo eroare. Daca da, el incarca numarul de eroare in registrul 0 si seteaza bitul transport din registrul de stare al procesului. Daca nu apar erori la executia apelului sistem, nucleul sterge bitul transport din registrul de stare al procesului si copiaza valorile de revenire din apelul sistem in locatiile registrilor 0 si 1. Cand nucleul revine in modul utilizator dupa executia unei instructiuni trap, el se intoarce la instructiunile de biblioteca de dupa aceasta. Biblioteca interpreteaza valorile de revenire din apelul sistem si intoarce o valoare catre programul utilizator.

De exemplu, sa consideram programul din prima parte a figurii 7.13 care creeaza un fisier cu permisiuni de citire si scriere pentru toti utilizatorii (0666). In partea a doua a figurii este prezentat codul masina pentru programul de mai sus compilat si dezasamblat pe un sistem Motorola 68000. Compilatorul genereaza cod pentru a introduce cei doi parametrii in stiva utilizator, unde primul parametru introdus este dat de permisiunile de acces, iar al doilea parametru este variabila nume. Apoi procesul apeleaza functia de biblioteca pentru apelul sistem creat (adresa 7a) de la adresa 64. Adresa de revenire din apelul sistem este 6a, iar procesul introduce acest numar in stiva. Functia de biblioteca pentru apelul creat muta constanta 8 in registrul 0 si executa o instructiune trap care determina ca procesul sa fie schimbat din modul utilizator in modul nucleu si sa trateze apelul sistem. Nucleul recunoaste ca utilizatorul executa un apel sistem si recupereaza numarul 8 din registrul 0, pentru a determina ca apelul sistem este apelul creat si ca acesta are nevoie de doi parametri. Ulterior copiaza parametrii din spatiul utilizator in u area. Rutinele nucleului care are nevoie de parametri, ii pot gasi in locatii predictabile in u area. Cand nucleul termina executarea codului pentru apelul sistem creat, el se intoarce la rutina de tratare a apelului sistem, verifica daca campul eroare din zona u area este setat (insemnand ca a fost o eroare oarecare in apelul sistem); daca da rutina de tratare seteaza bitul transport in registrul de stare al procesului, plaseaza codul de eroare in registrul 0 si se termina. Daca nu este nici o eroare, nucleul plaseaza codul de revenire al sistemului in registrii 0 si 1.

Figura 7.13. Apelul sistem creat si codul generat pentru

Motorola 68000.

Cand revine din rutina de tratare a apelului sistem in modul utilizator, biblioteca C verifica bitul transport din registrul de stare al procesului, la adresa 7e. Daca este setat, procesul sare la adresa 13c, ia un cod de eroare din registrul 0 si il plaseaza in variabila globala errno, la adresa 20e, pune valoarea -1 in registrul 0 si revine la urmatoarea instructiune de dupa apelul sistem la adresa 64. Codul de revenire al functiei este -1, si semnifica o eroare in apelul sistem. Daca atunci cand revine din modul nucleu in modul utilizator bitul transport este 0, procesul sare de la adresa 7e la adresa 86 si se intoarce la apelant (adresa 64): registrul 0 contine o valoare de revenire din apelul sistem.



3 Schimbarea contextului

Referitor la diagrama de stari a unui proces din Figura 7.1. s-a aratat ca nucleul permite o schimbare a contextului doar in patru situatii: cand un proces se pune singur in asteptare, cand acesta se termina, cand revine dintr-un apel sistem in modul utilizator dar nu este procesul cel mai potrivit pentru executie, sau cand acesta revine in modul utilizator dupa ce nucleul termina tratarea unei intreruperi dar nu este cel mai potrivit proces pentru executie. Nucleul asigura integritatea si consistenta structurilor de date interne prin interzicerea schimbarilor de context arbitrare, asa cum s-a explicat in capitolul 2. Acesta se asigura ca starea structurilor sale de date este consistenta inainte de a realiza schimbarea contextului: daca toate actualizarile au fost facute, daca toate listele sunt inlantuite corect, daca anumite structuri de date sunt blocate pentru a impiedica accesarea lor de catre alte procese, daca nu exista structuri de date ramase blocate cand nu este necesar, si altele. De exemplu, daca nucleul aloca un buffer, citeste un bloc dintr-un fisier si se pune in asteptare, pana la terminarea operatiilor de I O cu discul, el tine buffer-ul blocat, astfel incat alte procese sa nu-l poata accesa. Dar daca un proces executa apelul sistem link, nucleul elibereaza primul inod blocat inainte de a bloca cel de-al doilea inod pentru a preveni situatiile de concurenta.

Nucleul trebuie sa execute o schimbare a contextului la terminarea apelului sistem exit, deoarece nu mai are nimic de facut. In mod similar nucleul permite o schimbare de context cand un proces se pune in asteptare deoarece poate trece o perioada considerabila de timp pana cand procesul va fi trezit, si alte procese pot fi executate intre timp. Nucleul permite o schimbare de context cand un proces nu este cel mai potrivit pentru a fi rulat, pentru a permite planificarea proceselor adecvate: daca un proces termina un apel sistem sau revine dintr-o intrerupere si exista un alt proces cu prioritate mai mare care asteapta sa ruleze, ar fi incorect sa mentinem in asteptare procesul cu prioritate mai mare.

Procedura pentru schimbarea contextului este similara cu procedura de tratare a intreruperilor si a apelurilor sistem, exceptand faptul ca nucleul reface cadrul context al altui proces si nu cadrul context anterior al aceluiasi proces. Ratiunea schimbarii de context este neinteresanta. Similar, alegerea urmatorului proces care va fi planificat, este o decizie tactica ce nu afecteaza mecanismul schimbarii de context.

Decide daca trebuie sa faca o schimbare de context si daca

aceasta este permisa.

Salveaza contextul "vechiului" proces.

Gaseste "cel mai bun" proces pentru a-l planifica pentru

executie.

Reface contextul acestuia.

Figura 7.14. Pasii pentru o schimbare de context.

Codul de implementare a schimbarii de context in sistemele UNIX este de obicei cel mai dificil de inteles la sistemul de operare, deoarece se creeaza impresia ca din unele apeluri de functii nu se mai revine in anumite situatii, si ca nu sunt materializate nicaieri in altele. Aceasta deoarece nucleul in multe implementari, salveaza contextul intr-un punct al procesului curent, dar continua sa execute schimbarea de context si algoritmii de planificare in contextul vechiului proces. Cand el mai tarziu reface contextul procesului, reia executia in conformitate cu contextul salvat anterior. Pentru a diferenta cazul in care nucleul reface contextul noului proces de cazul in care el continua executia in vechiul context dupa ce l-a salvat, valorile de revenire a functiilor critice variaza, sau numaratorul de program poate fi setat artificial.

Figura 7.15. prezinta un scenariu care face o schimbare de context. Functia salvare-context salveaza informatii despre contextul procesului in executie si intoarce valoarea 1. Printre altele nucleul salveaza valoarea numaratorului de program curent si valoarea 0, pentru a fi folosite mai tarziu ca valori de revenire din functie. Nucleul continua sa se execute in contextul vechiului proces (A), alegand un alt proces (B) pentru a executa si apeland functia reface context pentru a reface noul context (al lui B).

Figura 7.15. Pseudocod pentru schimbarea contextului.

Dupa ce noul context este refacut, sistemul executa procesul B; vechiul proces (A) nu se mai executa dar isi paraseste contextul salvat anterior. Mai tarziu, nucleul va alege din nou procesul A pentru executie (exceptand cazul apelului exit) cand un alt proces face o schimbare de context, asa cum a fost descris. Cand contextul procesului A este restaurat, nucleul va seta numaratorul de program la valoarea salvata anterior pentru procesul A in functia salvare-context, si va pune deasemenea valoarea 0, salvata pentru valoarea de revenire din functie in registrul 0. Nucleul reia executia procesului A din interiorul functiei salvare-context chiar daca a executat codul de deasupra apelului "reface-context" apelat inaintea schimbarii de context.

La sfarsit, procesul A revine din functia salvare-context cu valoarea 0 (in registrul 0) si reia executia de la comentariul "procesul initial se reia de aici".

4 Salvarea contextului la intoarcerile fortate

Situatiile apar cand nucleul trebuie sa iasa fortat din secventa curenta de executie si sa paraseasca imediat un context salvat anterior. Sectiunile urmatoare legate de asteptare si semnale descriu imprejurarile cand un proces trebuie sa-si schimbe brusc contextul; aceasta sectiune explica mecanismul de executare a contextului anterior. Algoritmul de salvare a contextului se numeste setjmp si algoritmul de refacere a contextului este longjmp. Metoda este identica cu cea descrisa pentru functia salvare-context in sectiunea anterioara, cu exceptia faptului ca salvare-context adauga un nou cadru context, pe cand setjmp memoreaza contextul salvat in u area si continua si execute vechiul strat context. Cand nucleul doreste sa reia vechiul context salvat cu setjmp, el apeleaza longjmp, restaurand contextul din zona u area si returnand 1 pentru setjmp.





Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1011
Importanta: rank

Comenteaza documentul:

Te rugam sa te autentifici sau sa iti faci cont pentru a putea comenta

Creaza cont nou

Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved