Sunteți pe pagina 1din 22

PROGRAMAREA APLICATIILOR IN TIMP REAL

Curs 5 Procese

Cuprins curs 5:

procese mecanisme de comunicatie intre procese zone comuna de date alte mecanisme de sincronizare si comunicatie intre procese variabile conditionale bariere sleepon locks reader / writer locks

transmitere de mesaje

Procese: prin proces intelegem un un cod program care se afla intr-o anumita stare de executie (e.g. RUNNING, READY, BLOCKED, etc) are propriul sau spatiu de adresa si un singur fir de executie logica a operatiilor (engl. flow of control) contorul program al procesului contine adresa urmatoarei instructiuni care trebuie executata gestiunea memoriei in cazul unui proces:
Adresa low Zona de cod

Adresa high Heap Date (globale) Stiva

la un moment dat pot fi incarcate in memorie mai multe procese, partajand CPU si resursele fiecare task are propriul sau spatiu de adresa, nu se pot suprapune spatiul de adresa al unui proces este invizibilpentru celelalte procese incarcate in memorie

Procese:

sistemul de operare tine evidenta starii proceselor prin intermediul tabelei de procese descrierea detaliata a starii unui proces (context de executie): continutul registrilor CPU asociat ultimului moment in care procesul a detinut CPU memoria alocata procesului lista fisierelor deschise atunci cand procesul este scos din executie se face o comutare de context, adica se salveaza contextul de executie sa fie rapida, pentru a pastra timing-ul aplicatiei

Lansarea in executie a proceselor (1):

din linia de comanda (shell)

$ program1

shell-ul asteapta programul sa se termine

$ program2 &

shell-ul porneste programul, insa nu asteapta sa se termine, (programul ruleaza in background)

prioritatea programului se poate ajusta inainte de a fi lansat in executie:

$ nice program3

comanda nice isi ajusteaza propria prioritate la o valoare mica, apoi executa program3 la acesta prioritate

Lansarea in executie a proceselor (2):

dintr-un program

se porneste un proces nou, sau procesul original se transforma in alt proces

exista mai multe (familii de) functii: system() familia de functii exec() familia de functii spawn() fork() vfork()

Lansarea in executie a proceselor (2):

cu functia system() primeste ca argument o linie de comanda, la fel cum s-ar executa aceasta comanda in shell de fapt, porneste shell-ul pentru a executa comanda

main(){ ... system("pwd"); .... }

Lansarea in executie a proceselor (2) - exec():

cu functia exec() transforma procesul curent in alt proces, adica procesul curent nu mai executa programul curent, ci alt program ID-ul procesului nu se schimba

Lansarea in executie a proceselor (2) - fork():

cu functia fork()

#include <sys/types.h> #include <process.h> pid_t fork( void );


se creeaza un proces nou, identic cu cel care ruleaza in mod curent cele doua procese vor rula in paralel cele doua procese au acelasi cod, date ID-ul difera

Returns: A value of zero to the child process; and the process ID of the child process to the parent process. Both processes continue to execute from the fork() function. If an error occurs, fork() returns -1 to the parent and sets errno. Classification: POSIX 1003.1

Lansarea in executie a proceselor (2) - fork():

diferente intre cele doua procese:

the child process has a unique process ID. the child process has a different parent process ID (which is the process ID of the calling process). the child process has its own copy of the parent's file descriptors. each of the child's file descriptors refers to the same open file description with the corresponding file descriptor of the parent. the child process has its own copy of the parent's open directory streams. the child process's values of tms_utime, tms_stime, tms_cutime, and tms_cstime are set to zero. file locks previously set by the parent aren't inherited by the child. pending alarms are cleared for the child process. the set of signals pending for the child process is initialized to the empty set.

Lansarea in executie a proceselor (2) - fork():

"Programarea aplicatiilor in timp real", sectiunea 3.1, pag. 103

Lansarea in executie a proceselor (2) - fork():

exemplu: listing 1, pag. 105, "Programarea aplicatiilor in timp-real"

Lansarea in executie a proceselor (2) - spawn():

cu functia spawn()

se creeaza un alt proces child (cu alt ID pid), care va executa programul specificat de argumentele functiei

#include <spawn.h> pid_t spawn( const char * path,int fd_count,const int fd_map[], const struct inheritance* inherit, char * const argv[], char * const envp[] ); Returns: The process ID of the child process, or -1 if an error occurs (errno is set).

procesul parinte asteapta sa se termine procesul fiu, care va returna un cod (status) catre procesul parinte

Classification: QNX Neutrino

Lansarea in executie a proceselor (2) - spawn():

The child process inherits the following attributes of the parent process:

process group ID (unless SPAWN_SETGROUP is set in inherit.flags) session membership real user ID and real group ID effective user ID and effective group ID supplementary group IDs priority and scheduling policy current working directory and root directory file-creation mask signal mask (unless SPAWN_SETSIGMASK is set in inherit.flags) signal actions specified as SIG_DFL signal actions specified as SIG_IGN (except the ones modified by inherit.sigdefault when SPAWN_SETSIGDEF is set in inherit.flags).

Lansarea in executie a proceselor (2) exemplu spawn():

exemplu: listing 2, pag. 106, "Programarea aplicatiilor in timp real"

Mecanisme de comunicare a datelor intre procese:

Sistemul de operare in timp-real QNX furnizeaza sase mecanisme fundamentale pentru schimbul de informatii intre procese:

acces direct la o zona de memorie partajata (comuna); fisiere - care reprezinta un model generalizat pentru realizarea operatiilor de intrare / iesire (inclusiv pipe-uri, cozi de mesaje, etc); mesaje; proxy-uri (care permit lansarea unei conditii particulare); semnale, care intrerup in mod asincron un proces; semafoare, care sunt flaguri globale utilizate de cele mai multe ori pentru a controla accesul la resurse partajate.

Zone comune de memorie (memorie partajata):

comunicarea prin zona comuna de memorie / date zonele comune de date sunt zone speciale create de sistem pentru comunicatia ntre task-uri, sunt vizibile din toate task-urile si sunt gestionate de catre sistemul de operare in unele sisteme zona comuna de date se numeste memorie partajata (engl. shared memory), buffer, etc. accesul la o astfel de zona de date se face prin adresa (pointer) zona comuna de date este creata de un task printr-un apel de functii sistem celelalte taskuri "deschid" zona tot prin apeluri de functii sistem

exemplu: fisierele mapate in QNX (la laborator)

Zone comune de memorie (memorie partajata):

"Programarea aplicatiilor in timp-real, sectiunea 3.8.2, pag. 129

Zone comune de memorie (memorie partajata):

pentru crearea si accesarea unui obiect de memorie sunt necesare doua operatii: alocarea unui descriptor de fisier, fisier pe care alte procese il vor accesa prin nume, cu functia shm_open()

maparea descriptorului intr-o locatie specifica in proces sau intr-o locatie de memorie fizica (de exemplu, pentru a accesa un dispozitiv extern), cu functia mmap()

alocarea unui obiect de memorie este similara cu operatia de deschidere a unui fisier. In terminologia POSIX, obiectul de memorie devine un fisier mapat

Interfata C / POSIX pentru utilizarea obiectelor de memorie

"Programarea aplicatiilor in timp-real", tabelul 3.9, pag. 131

Zone comune de memorie - exemplu:

o aplicatie formata din 3 procese un proces (task) pentru initializare, creeaza o zona de date comuna, un semafor pentru excludere mutuala si doua procese fiu

crearea memoriei partajate pentru zona comuna de date maparea in spatiul propriu de adresa se "leaga" (link) la zona comuna de date, mapand-o in spatiul propriu de memorie la final, se "dezleaga" (unlink) de la zona comuna de date se "leaga" (link) la zona comuna de date, mapand-o in spatiul propriu de memorie la final, se "dezleaga" (unlink) de la zona comuna de date

un proces (fiu) care scrie datele in zona comuna de date

un proces (fiu) care citeste datele din zona comuna de date

Zone comune de memorie - exemplu:

exemplu: "Programarea aplicatiilor in timp-real", pagina 133 parinte.c fiu1.c fiu2.c

S-ar putea să vă placă și