Documente Academic
Documente Profesional
Documente Cultură
Gestiunea proceselor
Cooperarea si comunicarea intre
procese
Sisteme de operare
Lect. Dr. Ozten CHELAI
Un exemplu simplu ce ilustreaza cazul terminarii fiului: /* wait-ex2.c : terminare anormala a fiului */
/* wait-ex1.c : terminare normala a fiului */ #include <stdio.h>
#include <stdio.h> #include <sys/types.h>
#include <sys/types.h> #include <sys/wait.h>
#include <sys/wait.h>
int main()
int main() {
{ if (fork() == 0)
if (fork() == 0) { /* fiu */
{ /* fiu */ printf("Proces fiu id=%d\n", getpid());
printf("Proces fiu id=%d\n", getpid()); for(;;);
exit(3); }
} else
else { /* parinte */
{ /* parinte */ int pid_fiu, cod_term;
int pid_fiu, cod_term; pid_fiu= wait(&cod_term);
pid_fiu= wait(&cod_term); printf("Tata: sfirsit fiul %d cu valoarea %d\n", pid_fiu,
printf("Tata: sfirsit fiul %d cu valoarea %d\n", cod_term);
pid_fiu, cod_term); }
} }
} /*Executati acest program in background, prin comanda:
UNIX> wait-ex2 &
/*In urma executiei acestui program, se va afisa Se observa ca procesele nu se opresc niciodata (intrucit procesul fiu
valoarea 768 (adica 3*256), deoarece este o executa o bucla infinita, iar procesul tata il asteapta cu wait). Ca atare,
terminare normala a fiului si deci valoarea de pentru a le opri, aflati PID-ul fiului (cu comanda ps) si apoi omoriti-l (cu
comanda kill -9 pid_fiu); astfel de fapt ii transmiteti semnalul cu numarul 9.
terminare se depune in octetul high. */ Ca urmare, cele doua procese se vor termina, iar in urma executiei lor se
va afisa valoarea 9, adica numarul semnalului care l-a stopat pe fiu,
deoarece este o terminare anormala a fiului si deci numarul semnalului se
depune in octetul low. */
Apelurile implementate de SO
Windows
Acest sistem de operare implementează modelul obiectual. În acest context,
un proces este un obiect al nucleului sistemului de operare identificat printr-o
referinŃă (echivalentul PID-ului) şi un descriptor de securitate funcŃie de care
se stabilesc drepturile de acces ale procesului la alte obiecte din sistem.
APICreateProcess (10 parametri) – creare proces
Acest apel complex înglobează funcŃionalitatea mai multor apeluri întâlnite la
Linux.
Principalii parametri ai apelului sunt:
pointer la numele fişierului executabil,
linia de comandă,
pointer către descriptorul de securitate,
identificatori pentru fişierele deschise,
pointeri către şirurile variabilelor de context,
pointer către directorul curent,
pointer către o structura de date complexă ce descrie fereastra în care se crează
procesul (hwnd),
pointer la o structură complexă de date ce conŃine variabilele returnate de apel (d.e.
referinŃa la procesul creat).
Structura de date ataşată
implementării proceselor
Principala structură de date utilizată de sistemul de operare în
implementarea proceselor se numeşte tabela proceselor. Aceasta
este o tabelă asociată funcŃiei ce pune în corespondenŃă identificatorul
de proces PID cu o structură de date în care sistemul de operare
păstrează toate informaŃiile necesare reluării unui proces întrerupt
(stare proces) precum şi o serie de informaŃii de contabilizare a
activităŃilor legate de procesul respectiv.
Principalele categorii de informatii din tabela proceselor sunt:
identificator proces (PID)
stare procesor (IP, SP, PSW, alte registre procesor)
informaŃii despre alocarea memoriei (continuŃul regiştrilor de segment:
CS,SS,DS,ES,etc.)
identificatori fişiere deschise
informaŃii de contabilizare şi planificare procese, create şi utilizate de
sistemul de operare.
Fisierele de configurare - fiecare utilizator isi poate scrie un fisier script care sa fie executat
la fiecare inceput de sesiune de script numit $HOME/.profile sau $HOME/.bash_profile in cazul cind se utilizeaza
bash-ul ca shell implicit (pentru alte shell-uri acest fisier de initializare este denumit altfel).
La fiecare sfarsit de sesiune, cind se deconecteaza de la sistem (adica la logout); acest script se numeste
$HOME/.bash_logout in cazul shell-ului bash.
Fisiere se gasesc in directorul home al acelui utilizator.
Mai exista doua fisiere de initializare valabile pentru toti utilizatorii, si anume fisierele /etc/profile si
/etc/environment. La deschiderea unei noi sesiuni de lucru, mai intii sunt executate script-urile de
sistem (i.e. cele din directorul /etc/), si abia apoi cele particulare utilizatorului respectiv (i.e. cele din
$HOME/).
In plus, exista si niste fisiere de configurare, si anume un fisier global, numit /etc/bashrc, si un fisier
specific fiecarui utilizator, numit $HOME/.bashrc (acestea sunt numele in cazul shell-ului bash).
Aceste fisiere sunt executate ori de cite ori este lansat un proces shell interactiv, exceptind shell-ul de
login. Ca, de exemplu, atunci cind de sub browser-ul lynx se apeleaza interpretorul de comenzi printr-o
anumita comanda (mai exact, apasind tasta "!"), sau dintr-un editor de texte, sau la pornirea mc-ului (i.e.,
a managerului de fisiere Midnight Commander), etc. Sau ca atunci cind, din linia de comanda, startam un
nou shell (fara parametri).
De asemenea, mai exista un fisier de istoric, numit $HOME/.bash_history, care pastreaza ultimele N
comenzi tastate (exista o variabila de mediu care specifica aceasta dimensiune N). Formatul de pastrare
este urmatorul: fiecare linie de comanda tastata se pastreaza pe o linie de text in fisier, in ordine
cronologica (ultima comanda tastata este pe ultima linie din fisier).
Interpretoare de comenzi UNIX – comenzi pentru procese
Comenzi ce ofera informatii despre procesele din sistem, in diverse formate:
comanda process status, ce afiseaza informatii despre procesele din sistem (PID-ul, starea procesului, proprietarul
procesului, cita memorie ocupa, cit timp procesor consuma, s.a.):
ps
pentru afisarea job-urilor aflate in lucru:
jobs
pentru planificarea lansarii unor job-uri la anumite ore:
at = planifica lansarea unei comenzi la o anumita ora (rezultatele se primesc in mail);
atq = afiseaza lista comenzilor planificate (aflate in coada de asteptare);
atrm = stergerea din coada de asteptare a unor comenzi planificate anterior.
alte comenzi referitoare la procese:
times = afiseaza timpii de executie a proceselor din sistem;
nice = permite stabilirea prioritatii de executie a unui proces;
nohup = no hang-up : permite continuarea executiei proceselor ce folosesc intrarea/iesirea standard, si dupa
incheierea sesiunii de lucru (prin deconectare de la sistem cu logout).
Exemple:
UNIX> ps
Efect: afiseaza informatiile doar despre procesele utilizatorului curent, ce sunt rulate in foreground.
UNIX> ps -ux
Efect: afiseaza informatiile despre toate procesele utilizatorului curent, inclusiv cele ce sunt rulate in background
sau fara terminal de control.
UNIX> ps -aux
Efect: afiseaza informatiile despre toate procesele din sistem, ale tuturor utilizatorilor.
In caz de blocare:
Apasati tastele ^C (adica, CTRL + C). Aceasta determina trimiterea semnalului de intrerupere SIGINT programului respectiv.
Daca totusi nu apare prompterul, atunci:
Apasati tastele ^\ (adica, CTRL + \). Aceasta determina trimiterea semnalului de terminare SIGQUIT programului respectiv.
Daca totusi nu apare prompterul, atunci:
Apasati tastele ^Z (adica, CTRL + Z).
Aceasta determina suspendarea programului respectiv (adica acel program este trecut in starea SUSPENDED) si afisarea
prompterului.
Mai departe, pentru a opri acel program (el este doar suspendat, nu si terminat), procedati astfel: dati comanda
UNIX> ps
pentru a afla PID-ul acelui program, iar apoi dati comanda
UNIX> kill -9 pid
unde pid este PID-ul aflat anterior. Ca urmare a acestei comenzi procesul (programul blocat) este omorit (terminat).