Biologie | Chimie | Didactica | Fizica | Geografie | Informatica | |
Istorie | Literatura | Matematica | Psihologie |
Un proces este defapt un program care se afla in executie si consta dintr-un sir de octeti pe care CPU-ul le interpreteaza ca si instructiuni masina (numit "text"), date si stiva. Mai multe procese sunt executate simultan, pe unele sisteme doar in aparenta, ordinea executiei depinzand de planificarea acestora de catre kernel. Deasemenea mai multe procese pot fi instante ale unui acelasi program.
Un proces se executa urmand o secventa stricta de instructiuni, continuta in proces, si nu face salturi la secventele altor procese. El isi citeste si scrie sectiunile de date si stiva, dar nu poate citi sau scrie datele si stiva altui proces. Procesele comunica cu alte procese si cu lumea inconjuratoare doar prin apeluri sistem.
Practic un proces pe un sistem UNIX este o entitate care este creata prin apelul sistem fork. Orice proces, cu exceptia procesului 0 este creat cand un alt proces executa acest apel sistem. Procesul care a apelat fork se numeste proces parinte, iar procesul nou creat se numeste procesul fiu. Fiecare proces are doar un singur proces parinte, dar poate avea mai multe procese fii. Nucleul identifica fiecare proces prin numarul de proces al acestuia, numit identificator de proces (PID).
Procesul 0 este un proces special care este creat cand se initializeaza sistemul, dupa ce lanseaza un proces fiu (procesul 1), procesul 0 devine procesul swapper (cel care gestioneaza memoria virtuala). Procesul 1, cunoscut sub numele de init este 'stramosul' tuturor proceselor din sistem.
Nucleul, ca urmare a unui apel exec incarca un fisier executabil in memorie. Procesul incarcat consta din cel putin trei parti, numite regiuni : text, date si stiva. Regiunile text si date corespund sectiunilor de text si data ale fisierului executabil, dar regiunea de stiva este creata automat si dimensiunea acestuia este ajustata dinamic in timpul executiei.
Deoarece in sistemul UNIX un proces poate rula in doua moduri, kernel sau utilizator, se folosesc stive separate pentru fiecare mod. Stiva utilizator contine argumentele, variabilele locale si alte date necesare functiilor care se executa in mod utilizator. Stiva kernel contine datele necesare pentru functiile care se executa in mod kernel. Functiile si datele din aceasta stiva se refera la functii si date din kernel si nu din programul utilizator. Stiva kernel a unui proces este vida cand un proces ruleaza in mod utilizator.
Fiecare proces are alocata o intrare in tabela de procese a nucleului, deasemenea fiecarui proces ii este alocata o zona utilizator (u area), care contine date private manipulate doar de nucleu. Tabela de procese contine un pointer spre o tabela de regiuni ale procesului care contine intrari care indica intr-o alta tabela de regiuni, globala, care la randul lui indica adresele fizice din memoria fizica, corespunzatoare acelor regiuni. O regiune este o zona continua a spatiului de adresare a unui proces (de ex. text, date si stiva). Intrarile in tabelele de regiuni descriu atributele regiunii, adica faptul ca aceasta regiune contine text sau date, daca este partajata sau privata si daca datele din regiune sunt in memoria principala sau nu. Cel de-al doilea nivel de indirectare (tabela de regiuni ale unui proces), permite proceselor independente sa partajeze regiuni. Cand un proces executa apelul sistem exec, nucleul aloca regiuni pentru text, date si stiva dupa ce a eliberat vechile regiuni ale procesului.
Cand un proces executa apelul fork, nucleul duplica spatiul de adrese al vechiului proces, permitand proceselor sa partajeze regiunile cand este posibil, altfel facand o copie fizica. Cand un proces apeleaza exit, nucleul desaloca regiunile pe care procesul le-a detinut.
Figura urmatoare ilustreaza structurile de date relevante ale unui proces aflat in executie:
Fig. 7.3-
Intrarea in tabela de procese si zona numita u area contin informatii de control si stare despre procese. Zona u area este o extensie a intrarii in tabela de procese.
Campurile cele mai importante din tabela de procese sunt :
camp de stare, indicand starea procesului.
intrarea in tabela de procese contine campuri care permit nucleului localizarea procesului si a zonei sale u area, din memoria principala sau secundara. Nucleul foloseste aceste informatii pentru a putea face schimbarea de context, la acel proces, cand acesta trece din starea Ready to Run In Memory in starea Kernel Running sau din starea Preempted in starea User Running. In plus, nucleul mai foloseste aceste informatii cand transfera procesele din sau in memoria principala. Intrarea de tabela mai contine un camp care da dimensiunea procesului, astfel incat nucleul sa stie cat spatiu sa aloce procesului.
identificatori de utilizatori (UID-uri), care determina diferitele privilegii ale proceselor. De exemplu, aceste campuri determina setul de procese care pot trimite semnale unele la altele.
identificatori de procese (PID-uri), care specifica relatiile dintre diferite procese. Aceste campuri sunt initializate cand procesul intra in starea Created, in apelul sistem fork.
un descriptor de evenimente, setat cand procesul este suspendat (starea de somn - sleep).
parametrii pentru planificatorul de procese, permit nucleului sa determine ordinea in care procesele trec in starile Kernel Running si User Running.
un camp pentru semnale, care enumera semnalele trimise procesului ai care nu au fost inca tratate.
mai multi contori pentru pastrarea timpului de executie, utilizarea resurselor ai altele, folosite pentru gestionarea ai calcularea prioritatii de planificare. Exista si un camp contor setabil de utilizator, folosit la transmiterea unui proces a unui semnal de alarma.
Zona u area contine informatii care descriu procesul, dar care trebuie sa fie accesibile doar cand procesul se executa efectiv. Campurile cele mai importante sunt :
un pointer catre intrarea in tabela de procese a procesului.
identificatorii reali si efectivi de utilizator, care determina diferite privilegii acordate procesului, cum ar fi drepturile de acces la fisiere.
campuri contor care memoreaza timpul cat procesul si descendentii sai au petrecut in mod utilizator respectiv in mod kernel.
un tablou indicand modul de raspuns al procesului la diferite semnale.
un camp care identifica 'terminalul de login' asociat cu procesul (daca acesta exista).
camp de eroare care retine codurile de eroare dintimpul unui apel sistem.
camp care retine valoarea de intoarcere dintr-un apel sistem.
parametri de I/O care descriu cantitatea de date care urmeaza sa fie transferate, adresa tabloului sursa (sau destinatie), din spatiul utilizator, deplasamente de fisiere si altele.
directorul curent si radacina curenta, descriu ambianta sistemului de fisiere pentru respectivul proces.
tabela descriptorilor de fisier pentru fiecare fisier deschis.
dimensiunile maxime ale unui proces si a fisierelor pe care poate sa le creeze.
un camp de masca de moduri de acces pentru fisierele care vor fi create de proces.
Implementarea ofera nucleului o cale usoara de identificare a procesului curent, prin folosirea pointerului din zona u spre intrarea in tabela de procese.
Contextul unui proces este starea acestuia, cum este ea definita de textul sau, de valorile variabilelor utilizator globale si structurilor de date, de valorile registrilor pe care le foloseste, de valorile din zona din tabela de procese care ii corespunde precum si din zona u area si continutul stivelor utilizator si kernel. 'Text'-ul sistemului de operare si structurile sale de date globale, sunt partajate de toate procesele, dar ele nu constituie parte a contextului unui proces.
Cand executa un proces, sistemul se spune ca ruleaza in contextul procesului. Cand nucleul decide ca ar trebui sa execute un alt proces, el face o asa numita schimbare de context (context switch), astfel incat sistemul va rula in contextul noului proces. Nucleul permite o schimbare de context doar in anumite conditii specifice. Cand face o schimbare de context, nucleul salveaza informatie suficienta pentru a putea relua mai tarziu procesul intrerurpt. La fel cand se trece din modul utilizator in kernel, nucleul salveaza suficienta informatie, astfel incat mai tarziu sa se poata intoarce in modul utilizator si sa continue executia din punctul in care a ramas. Schimbarea modului de executie din mod utilizator in kernel si invers NU este o schimbare de context.
Nucleul trateaza intreruperile in contextul procesului intrerupt, chiar daca acesta nu a provocat aparitia intreruperii. Procesul intrerupt se putea gasi sau in mod utilizator sau in mod kernel. Nucleul salveaza suficienta informatie astfel incat mai tarziu sa poata relua executia procesului intrerupt, dupa care trateaza intreruperea in mod kernel. Nucleul nu lanseaza sau planifica un proces special pentru tratarea intreruperilor.
Timpul de viata al unui proces poate fi divizat intr-un set de stari care descriu procesul. Un proces poate fi intr-una din urmatoarele stari :
Procesul ruleaza in mod utilizator.
Procesul ruleaza in mod kernel.
Procesul nu ruleaza dar este pregatit pentru executie (atunci cand nucleul il planifica).
Procesul este adormit si se afla in memoria principala.
Procesul este gata de executie, dar swapper-ul trebuie sa il aduca in memoria principala inainte ca nucleul sa il poata planifica pentru executie.
Procesul este adormit, si swapper-ul a eliberat memoria ocupata de el transferandu-l in memoria secundara.
Procesul este pe cale de a se intoarce din modul kernel in mod utilizator, dar nucleul il suspenda si face o schimbare de context pentru a planifica un alt proces la executie.
Procesul este nou creat si este intr-o stare de tranzitie, procesul exista, dar inca nu este gata de rulare, dar nu este nici adormit. Aceasta stare este starea de start pentru toate procesele in afara de procesul 0.
Procesul a executat apelul de sistem exit si este intr-o stare de tranzitie. Procesul nu mai exista, dar lasa o inregistrare continand codul de iesire si cateva statistici privitoare la timpii alocati pentru a fi colectate de procesul parinte. Aceasta stare, cunoscuta si sub numele de starea zombie, este starea finala a unui proces.
Urmatoarea diagrama prezinta diagrama de tranzitii dintre starile unui proces :
Fig. 7.3-
Pentru exemplificarea acestei diagrame vom considera evolutia unui proces tipic. Starea initiala a procesului este starea Created, cand procesul parinte executa apelul sistem fork si eventual trece intr-o stare in care este pregatit pentru executie (3 sau 5). Pentru simplificare, presupunem ca procesul intra in starea Ready to Run In Memory. Planificatorul de procese eventual va alege procesul pentru executie, astfel acesta intra in starea Kernel Running, unde isi termina partea sa din apelul sistem fork.
Cand procesul isi termina apelul sistem, poate sa treaca in starea User Running, unde se va executa in mod utilizator. Dupa o perioada de timp, ceasul sistem ar putea intrerupe procesorul si procesul intra din nou in starea Kernel Running. Dupa tratarea intreruperii de ceas, nucleul poate decide planificarea spre executie a unui alt proces, astfel incat procesul curent intra in starea Preempted si in continuare va fi executat celalalt proces. Starea Preempted este defapt echivalenta cu starea Ready to Run In Memory, dar cele doua stari au fost separate pentru a arata ca unui proces, care ruleaza in mod kernel, ii poate fi luat procesorul doar in momentul in care acesta este pe punctul de a se intoarce in mod utilizator. In continuare nucleul ar putea transfera procesul din starea Preempted in memoria secundara in starea Ready to Run Swapped, daca este necesar. Eventual planificatorul l-ar putea alege spre executie, astfel procesul intorcandu-se in starea User Running, deci executandu-se din nou in starea utilizator.
Cand un proces executa un apel sistem, el paraseste starea User Running si intra in starea Kernel Running. Presupunand ca apelul sistem necesita operatii de I/O cu discul, procesul este nevoit sa astepte pentru terminarea acestor operatii. El va intra in starea Asleep In Memory, punandu-se intr-o stare de asteptare pana cand este instiintat de faptul ca operatia de I/O s-a terminat. Cand operatia de I/O s-a terminat, hard-ul intrerupe CPU-ul si rutina de tratare a intreruperii v-a trezi procesul, determinandu-l sa intre in starea Ready to Run In Memory.
Presupunand ca sistemul executa mai multe procese care nu incap toate deodata in memoria principala ti swapper-ul transfera din memorie procesul, pentru a face loc altui proces care se afla in starea Ready to Run Swapped. Cand un proces este transferat din memoria principala in memoria secundara, el trece in starea Ready to Run Swapped. Eventual swapper-ul alege procesul ca fiind cel mai potrivit pentru a fi adus in memoria principala, astfel procesul va intra din nou in starea Ready to Run In Memory. Planificatorul eventual va alege spre rulare procesul, el intrand in starea Kernel Running si va continua executia. Cand un proce se termina, el apeleaza apelul sistem exit, astfel intrand in starea Kernel Running si in final in starea Zombie.
Un proces, la nivelul utilizatorului, are control doar asupra catorva dintre starile de tranzitie. In primul rand un proces poate crea un alt proces. Dar starea in care ajunge din starea Created depinde in intregime de nucleu, procesul neavand controlul asupra acelor tranzitii. In al doilea rand, un proces poate executa apeluri sistem pentru a trece din starea User Running in starea Kernel Running si astfel intrand din proprie initiativa in nucleu. Procesul nu are controlul asupra tranzitiilor la intoarcere din apelul sistem, evenimentele putand determina intrarea acestuia in starea Zombie. In final, un proces se poate termina de buna voie, executand apelul sistem exit. Toate celelalte tranzitii de stare urmaresc un algoritm inscris in nucleu, reactionand la evenimente intr-un fel predictibil.
Copyright © 2024 - Toate drepturile rezervate