CATEGORII DOCUMENTE |
Intr-un sistem UNIX procesele se termina prin executia apelului sistem exit. Un proces care intra in starea zombie (vezi Figura 7.1), isi abandoneaza resursele si isi distruge contextul mai putin intrarea din tabela de procese. Sintaxa pentru apel este:
exit (status)
unde valoarea status este intoarsa procesului parinte pentru examinare.
algoritm exit
intrari: codul de retur pentru procesul parinte
iesiri: niciuna
inchide toate fisierele (versiunea interna a algoritmului close);
elibereaza directorul curent (algoritmul iput);
elibereaza radacina curenta (schimbata) daca exista (algoritmul
iput);
elibereaza regiunile si memoria asociata procesului (algoritmul
freereg);
scrie inregistrarea cu informatii de contabilitate;
trece procesul in starea zombie;
atribuie valorii identificatorului procesului parinte pentru toti
fii, valoarea identificatorului procesul init (1);
daca vreun proces fiu era in starea zombie, trimite semnalul 'terminare fiu' catre procesul init;
trimite semnal 'terminare fiu' procesului parinte;
comuta contextul;
}
Figura 8.14. Algoritmul pentru terminarea proceselor
Procesele pot apela exit explicit sau implicit la sfarsitul programului: rutina de initializare existenta in toate programele C apeleaza exit cand programul revine din functia main care este punctul de intrare al tuturor programelor. Ca o alternativa, nucleul poate apela exit intern pentru un proces la primirea unor semnale pe care nu doreste sa le intercepteze, dupa cum s-a discutat anterior. In acest caz, valoarea parametrului status este numarul semnalului.
Sistemul nu impune limite de timp pentru executia unui proces si astfel procesele pot exista pentru o perioada indelungata. De exemplu, procesele 0 si 1 exista de-a lungul intregii functionari a sistemului. Alte exemple sunt procesele getty, cate urmaresc o linie de terminal, asteptand logarea unui utilizator, si procesele administrative dedicate.
Figura 8.14. prezinta algoritmul exit. Nucleul mai intai dezactiveaza tratarea semnalelor de catre proces deoarece aceasta nu mai are nici un sens. Daca procesul care se termina este un lider de grup de procese asociat cu un terminal de control (vezi Paragraful 6.3.5), nucleul presupune ca utlizatorul nu mai face nimic util si trimite un semnal de intrerupere catre toate procesele aflate in grupul de procese. Astfel, daca un utilizator tasteaza 'sfarsit de fisier' (CTRL+D) in timp ce mai exista procese in executie asociate terminalului, procesul care se termina le va trimite un semnal de intrerupere. Nucleul initializeaza, de asemenea, numarul de grup cu 0 pentru procesele din grup, deoarece este posibil ca mai tarziu un alt proces sa obtina identificatorul procesului care tocmai s-a terminat si sa fie de asemenea lider de grup. Procesele care au apartinut vechiului grup nu vor apartine si noului grup. Nucleul parcurge descriptorii fisierelor deschise, inchizandu-le pe fiecare prin algoritmul intern close, si elibereraza inodurile care au fost folosite pentru directorul curent si radacina schimbata (daca exista) prin algoritmul iput.
Nucleul elibereaza apoi toata memoria utilizatorului prin eliberarea regiunilor corespunzatoare cu algoritmul detachreg si schimba starea procesului in zombie. El salveaza codul de stare al apelului exit si timpii de executie in modurile utilizator si nucleu acumulati de proces si descendentii lui in tabela de procese. Descrierea apelului wait in paragraful 8.4 arata cum un proces obtine datele de timp pentru procesele descendente. Nucleul mai scrie, de asemenea, o inregistrare cu informatii de contabilitate intr-un fisier global care contine diferite statistici cum ar fi identificatorul utilizatorului, utilizarea U.C.P. si a memoriei, precum si cantitatea de operatii de intrare/iesire. Programele de nivel utilizator pot citi mai tarziu fisierul de contabilitate pentru a obtine diferite date statistice utile pentru urmarirea performantelor si pentru taxarea clientului in functie de serviciile oferite.
La sfarsit, nucleul deconecteaza procesul de la arborele de procese facand ca procesul 1 (init) sa adopte toate procesele sale fiu. Aceasta presupune ca procesul 1 sa devina parintele legal al tuturor proceselor fiu in executie pe care procesul care se termina le-a creat. Daca vreunul din procesele fiu este in starea zombie, procesul care se termina trimite catre procesul init semnalul 'terminare fiu' pentru ca acesta sa-l stearga din tabela de procese (vezi Paragraful 8.9.); procesul care se termina trimite si parintelui sau un semnal 'terminare fiu'. Intr-un scenariu tipic, procesul parinte executa un apel sistem wait pentru a se putea sincroniza cu procesul fiu care se termina. Procesul aflat in starea zombie face o comutare de context astfel ca nucleul poate sa planifice un alt proces pentru executie; nucleul nu va planifica pentru executie un proces aflat in starea zombie.
In programul din figura 8.15 un proces creeaza un fiu care isi tipareste propriul identificator si executa apelul sistem pause suspendandu-si executia pana cand primeste un semnal. Procesul parinte tipareste identificatorul procesului fiu si se termina intorcand identificatorul procesului fiu drept cod de stare. Daca apelul exit nu ar fi prezent, rutina de initializare ar apela exit la intoarcerea programului din functia main. Procesul fiu creat de parinte continua sa existe pana cand primeste un semnal, chiar daca procesul parinte s-a terminat.
main()
/* parinte */
printf('fiul PID %dn', fiu);
exit(fiu);
}
Figura 8.15. Exemplu de utilizare a apelului sistem exit
Politica de confidentialitate | Termeni si conditii de utilizare |
Vizualizari: 1623
Importanta:
Termeni si conditii de utilizare | Contact
© SCRIGROUP 2024 . All rights reserved