Scrigroup - Documente si articole

     

HomeDocumenteUploadResurseAlte limbi doc
AccessAdobe photoshopAlgoritmiAutocadBaze de dateCC sharp
CalculatoareCorel drawDot netExcelFox proFrontpageHardware
HtmlInternetJavaLinuxMatlabMs dosPascal
PhpPower pointRetele calculatoareSqlTutorialsWebdesignWindows
WordXml


Incarcarea sistemului si procesul init - UNIX

linux



+ Font mai mare | - Font mai mic



Incarcarea sistemului si procesul init - UNIX



Pentru a initializa un sistem dintr-o stare inactiva, un administrator trece printr-o secventa 'bootstrap': administratorul incarca sistemul. Procedura de incarcare a sistemului variaza in functie de tipul masinii, dar scopul este comun : de a face o copie a sistemului de operare in memorie si de a incepe executia acestuia. De obicei incarcarea sistemului se face in mai multe etape. Administratorul poate seta anumite comutatoare pe consola calculatorului pentru a specifica adresa unui program special de incarcare a sistemului codificat hardware, sau poate sa apese un singur buton care indica masinii sa incarce programul preincarcator din microcodul sau. Acest program poate sa contina doar cateva instructiuni care coordoneaza masina sa execute alt program. Pe sistemele UNIX, procedurile de incarcare a sistemului citesc eventual blocul de boot (blocul 0) al discului si il incarca in memorie. Programul continut in blocul de boot incarca nucleul din sistemul de fisiere (din fisierul '/unix' de exemplu, sau alt nume specificat de administrator). Dupa ce nucleul este incarcat in memorie, programul incarcator transfera controlul la adresa de start a nucleului, si acesta isi incepe executia (algoritmul start, Figura 8.30).

algoritmul start /* procedura de start a sistemului */

intrari: niciuna

iesiri: niciuna

/* procesul 0 continua aici */

apel fork pentru crearea proceselor nucleu;

/* Procesul 0 invoca incarcatorul pentru gestionarea alocarii spatiului

de adrese pentru procese in memoria principala si pe dispozitivul

swap (disc). Acesta este un ciclu infinit; procesul 0 este in mod

obisnuit in asteptare in ciclu, daca nu are ceva de facut */

executa codul algoritmului incarcator;

}

Figura 8.30 Algoritmul pentru incarcarea sistemului

Nucleul isi initializeaza structurile sale interne de date. De exemplu, construieste listele inlantuite de buffere si inoduri libere, construieste cozile hash de buffere si inoduri, initializeaza structurile de regiuni, intrarile in tabela de pagini si asa mai departe. Dupa terminarea fazei de initializare, nucleul monteaza sistemul de fisiere radacina ('/') si pregateste mediul pentru procesul 0, creeaza u area, initializeaza slotul 0 in tabela de procese si creeaza radacina directorului curent al procesului 0, printre altele.

Cand mediul procesului 0 este setat, sistemul apeleaza fork direct din nucleu pentru ca el se executa in modul nucleu. Noul proces, procesul 1, se executa in modul nucleu, isi creeaza contextul de nivel de utilizator prin alocarea unei regiuni de date si atasarea ei la propriul spatiu de adrese. El mareste regiunea la dimensiunea potrivita si copiaza codul din spatiul de adrese al nucleului in noua regiune: acest cod formeaza acum contextul de nivel de utilizator al procesului 1. Procesul 1 seteaza apoi contextul registru utilizator salvat, revine din modul nucleu in modul utilizator si executa codul pe care tocmai l-a copiat din nucleu. Procesul 1 este un proces de nivel utilizator care este in opozitie cu procesul 0, care este un proces de nivel nucleu si care se executa in modul nucleu. Codul pentru procesul 1, copiat din nucleu, consta din apelul functiei sistem exec pentru executia programului '/etc/init'. Procesul 1 apeleaza exec si executa programul in mod normal. Procesul 1 este numit init, pentru ca el este raspunzator de initializarea proceselor noi.

De ce copiaza nucleul codul apelului sistem exec in spatiul de adrese utilizator al procesului 1? El ar putea sa invoce versiunea interna a apelului exec direct din nucleu, dar acest lucru ar fi mai complicat decat implementarea tocmai descrisa.

Pentru a urma procedura descrisa mai inainte, apelul exec ar trebui sa analizeze numele fisierului in spatiul nucleu, nu doar in spatiul utilizator, ca in implementarea curenta. Aceasta generalizare, necesara doar pentru procesul init, ar complica codul apelului exec si ar micsora performantele sistemului

Procesul init (Figura 8.31) este un proces dispecer, care creeaza procesele ce permit utilizatorului sa se logheze in sistem, printre altele. Procesul init citeste fisierul '/etc/inittab' pentru a avea informatii referitoare la procesele care trebuiesc create. Fisierul '/etc/inittab' contine linii care au un camp 'id', un identificator de stare ( utilizator unic, multiutilizator, etc), un camp 'actiune' si un camp specificatie de program (vezi Figura 8.32).

Procesul init citeste fisierul si, daca starea in care a fost apelat se potriveste cu identificatorul de stare a liniei, creeaza un proces care executa specificatia de program data. De exemplu, cand se apeleaza procesul init pentru starea de multiutilizator (starea 2), el creeaza de obicei procese getty pentru a supraveghea liniile terminale configurate intr-un sistem.

algoritmul init /* procesul de init, procesul 1 al sistemului */

intrari: niciuna

iesiri: niciuna

/* procesul init nu asteapta */

/*reia ciclul while */

}

while((id=wait((init *)0))!=-1)

}

Figura 8.31 Algoritm init

Format: identificator, stare, actiune, specificatie de program

Campuri separate de coloane

Comentarii la sfarsit de linie precedate de '#'

co::respawn:/etc/getty console # consola atasata masinii

46:2:respawn:/etc/getty -t 60 tty46 4800H # comentariu

Figura 8.32 Exemplu de fisier inittab

Cand un utilizator se logheaza cu succes in sistem, getty trece prin procedura login si executa procesul shell descris in capitolul 6. Intre timp, procesul init executa apelul sistem wait, controland terminarea propriilor procese fiu si terminarea proceselor fiu ramase 'orfane' prin terminarea proceselor lor parinte.

Procesele in sistemul UNIX pot fi procese utilizator, procese 'demon', sau procese nucleu. Cele mai multe procese pe sistemele obisnuite sunt procese utilizator asociate utilizatorilor unui terminal. Procesele demon nu sunt asociate cu nici un utilizator, dar executa functii ale sistemului, cum ar fi administrarea si controlul retelelor, executia activitatilor dependente de timp, activitati de tiparire, etc. Procesul init poate crea procese demon care exista pe toata durata de viata a sistemului sau, ocazional, le pot crea utilizatorii. Ele se aseamana cu procesele utilizator prin aceea ca ruleaza in modul utilizator si fac apeluri sistem pentru a accesa serviciile sistemului.

Procesele nucleu se executa doar in modul nucleu. Procesul 0 lanseaza procesele nucleu, cum ar fi procesul vhand (care presupune existenta unui sistem bazat pe paginare la cerere) si apoi devine proces incarcator. Procesele nucleu sunt similare cu procesele demon prin aceea ca ele furnizeaza servicii sistem, dar au un control mai mare asupra prioritatilor lor de executie deoarece codul lor face parte din nucleu. Ele pot accesa algoritmii nucleului si structurile de date ale acestuia direct, fara a utiliza apelurile sistem, astfel ele sunt extrem de puternice. Totusi, ele nu sunt asa flexibile ca procesele demon, pentru ca nucleul trebuie recompilat pentru a le schimba.



Politica de confidentialitate | Termeni si conditii de utilizare



DISTRIBUIE DOCUMENTUL

Comentarii


Vizualizari: 1055
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