Documente Academic
Documente Profesional
Documente Cultură
Sistemul a rms fr memorie liber i nu mai are loc de textul i datele unui nou proces.
2) Sistemul i asociaz procesului un identificator sau PID(Process IDentifier). Acest identificator poate
fi folosit pentru a controla procesul mai trziu.
3) Copiaz contextul procesului Printe, procesul care a solicitat apariia noului proces.
4) Returneaz noul PID(al procesului Fiu) procesului Printe. Acest lucru i permite procesului
printe s poat analiza i controla direct procesele fii.
Dupa ce fork-ul este complet, UNIX ruleaz programul. Una din diferenele fundamentale ntre UNIX i
multe alte sisteme de operare const n procedeul n doi pai de rulare a unui program. n primul pas se
creaz un nou proces identic cu procesul printe. n al doilea se execut un program diferit. Aceast
procedur permite cteva variaiuni interesante.
Procesele UNIX se pot afla n una din cele trei stri:
1) RUNNING n dou moduri : utilizator(dac procesul execut un program al acestuia) sau
nucleu(dac procesul execut o funcie sistem).
2) READY procesul are toate datele necesare i astepat s se elibereze procesorul.
3) WAITING procesul asteapt eliberarea unor resurse (spre exemplu terminarea unor operaii I/O).
Procedurile prezentate mai sus sunt realizate implicit de ctre sistemul de operare UNIX, n cele ce
urmeaz vom prezenta cteva dintre cele mai utilizate metode din limbajul C pentru crearea de procese
Fiu i realizarea comunicrii ntre acestea.
pid_t wait(int *state) este funcia de asteptare a proceselor Fiu. Ea produce suspendarea execuiei
procesului care o apeleaz pn la terminarea execuiei unuia dintre fii si. Este folosit pentru evitarea
cazurilor n care procesul printe poate termina execuia i elibera memoria, naintea proceselor fiu fapt ce
ar putea conduce la apariia unor procese zombie(procese rmase fr printe).
Funcia ntoarce: PID-ul procesului care i-a terminat execuia sau 1 n caz de eec(setndu-se variabila
de sistem errno).
pid_t waitpid(pid_t pid, int *status, int options) spre deosebire de funcia anterioar adaug ca
parametru PID-ul procesului care este ateptat.
pid_t getpid() returneaz PID-ul procesului n care a fost apelat.
pid_t getppid() returneaz PID-ul procesului printe al procesului n care a fost apelat.
Din aceste considerente se prefer lansarea la latitudinea sistemului de operare a alegerii adresei din
memoria virtual(folosirea valorii implicite 0 ). n ambele cazuri funcia returneaz un pointer ctre
adresa de nceput a segmentului ataat la memoria virtual. Un exemplu:
shmptr = shmat(shmid , 0 , 0)
Observai c putei aloca din acest segment de memorie pentru toate variabilele voastre statice partajate
doar prin simpla declarare a acestora ca aparinnd unui tip de structur i decalndu-l pe shmptr ca fiind
un pointer ctre acel tip de structur.
4) Deoarece acest segment de memorie partajat trebuie distrus o dat ce ultimul proces care l-ar fi
accesat termin execuia sau se detaeaz de el, trebuie apelat funcia shmctl() pentru a pregti
aceast aciune implicit. Secvena de cod este urmtoarea :
shmctl(shmid, IPC_RMID, 0)
5) Se folosete funcia fork() standard de creare de noi procese din Linux, fiecare nou proces
motenind segmentul de memorie partajat al printelui.
6) O dat ce un proces a terminat lucrul cu un segment de memorie partajat trebuie s se detaeje de el
astfel :
shmdt(shmptr)
Exemplul urmtor de program C prezint calculul numrului Pi folosind memoria partajat:
#include
#include
#include
#include
#include
#include
#include
#include
<stdio.h>
<stdlib.h>
<unistd.h>
<sys/types.h>
<sys/stat.h>
<fcntl.h>
<sys/ipc.h>
<sys/shm.h>
n acest exemplu s-a folosit instruciunea IA32 de interschimb atomic pentru implementarea
mecanismului de blocare.