Documente Academic
Documente Profesional
Documente Cultură
Laborator 1
Arhitectura sistemului de operare QNX are la baza microkernelul Neutrino, care gestioneaza
un grup de procese care coopereaza. Microkernelul Neutrino asigura urmatoarele servicii de baza:
a) servicii asociate firelor de executie. Neutrino furnizeaza primitive pentru crearea firelor de
executie conform standardului POSIX;
b) servicii pentru tratarea semnalelor. Neutrino furnizeaza primitive pentru tratarea semnalelor
conform standardului POSIX;
c) servicii pentru transmiterea mesajelor. Neutrino asigura rutarea tuturor mesajelor intre firele
de executie in intregul sistem;
d) servicii de sincronizare. Neutrino furnizeaza primitive pentru sincronizarea firelor de
executie conform standardului POSIX;
e) servicii de planificare. Neutrino planifica si lanseaza in executie firele de executie utilizand
diversi algoritmi POSIX de planificare in timp-real;
f) servicii pentru gestiunea timpului. Neutrino furnizeaza un set bogat de servicii de timp
conform standardului POSIX;
g) servicii pentru managementul proceselor. Microkernelul Neutrino formeaza impreuna cu
managerul de procese o unitate denumita procnto. Componenta manager de procese asigura
gestiunea proceselor si a memoriei.
Microkernelul Neutrino dispune de apeluri specifice (engl. kernel calls) pentru urmatoarele
facilitati:
a) fire de executie;
b) transmitere de mesaje;
c) semnale;
d) ceas (gestiunea timpului);
e) timere;
f) rutine de tratare a intreruperilor;
g) semafoare;
h) lock-uri pentru excludere mutuala (mutex);
i) variabile conditionale (condvars);
j) bariere.
I. Comenzi uzuale
1
Listare continut director curent cu specificarea $ ls -l
drepturilor de acces1
Afiseaza calea pina la un anumit fisier (de $ which ls
exemplu, comanda ls2)
Help si optiunilor de executie ale unei comenzi $ use cmdname
1
Rezultatul comenzii este de forma urmatoare:
tip owner group other links owner group octeti data_ultima_modificare nume
2
fisierului file
• suprima dreptul de executie $ chmod -x file
• 1
da drept de executie ownerului si grupului $ chmod u+x,g+x file
sau asupra fisierului file
Definirea unui alias pentru o comanda. Alias- $ alias dir=’ls -l’
ul trebuie definit in fisierul .profile care se afla
in directorul de login2.
Gasirea variabilelor de mediu $ echo $PATH
Compilarea programelor
• compilare in fisier executabil a.out $ qcc ./hello.c
$ qcc ./hello.c -o hello.out
• compilare in fisier executabil hello.out
• compilare in background; se accepta alta $ qcc ./test.c &
comanda
• comanda de compilare se executa in $ nohup qcc ./test.c &
background, chiar daca utilizatorul face
logout. Iesirea programului si mesajele de
eroare sunt redirectate in mod automat intr-
un fisier nohup.out
Forteaza executia unui fisier executabil din $ ./hello.out
directorul curent
Afisarea informatiei despre starea sistemului, $ psin
grafic, in fereastra Photon3
Afisarea informatiei despre starea sistemului, in $ sin
mod text, in ferestra Terminal
Terminarea fortata a unui proces prin trimiterea $ kill pid
1
Pentru specificarea drepturilor de acces se foloseste urmatoarea notatie:
3
unui semnal SIGTERM. Pid este ID-ul
procesului, si poate fi obtinut din fereastra
System Process Inspector.
Diferitele sisteme de operare dau adeseori intelesuri diferite unor termeni ca "proces", "fir de
executie", "task", "program", etc. In QNX se folosesc in mod tipic doar termenii "proces" si "fir de
executie". O "aplicatie" inseamna in mod tipic o colectie de procese, iar termenul "program" este in
mod uzual echivalent cu "proces". Un proces va contine intotdeauna cel putin un fir de executie.
Firele de executie dintr-un proces impart datele comune din spatiul de adresa al procesului.
Fiecare fir de executie beneficiaza si de anumite date private. Unele dintre aceste date sunt protejate
de nucleu (de exemplu, identificatorul firului de executie, tid), altele putand exista neprotejate in
spatiul de adresa al procesului (de exemplu, stiva asociata fiecarui fir de executie).
Firele de executie pot fi create si distruse in mod dinamic in cadrul unui proces. La crearea
unui fir de executie (cu ajutorul functiei de biblioteca pthread_create()) se aloca si se
initializeaza resursele necesare in spatiul de adresa al procesului. Terminarea executiei firului de
executie (cu functii specifice de biblioteca pthread_exit(), pthread_cancel()) implica oprirea
firului de executie si eliberarea resurselor alocate acestuia.
Interfata C pentru crearea firelor de executie sub standardul POSIX se numeste Pthread si
furnizeaza o serie de functii pentru crearea si manipularea firelor de executie. Pentru utilizarea
acestor functii, programele utilizator vor include header-ul pthread.h. Se utilizeaza un nou tip de
data, pthread_t, care reprezinta descriptorul thread-ului.
typedef … pthread_t;
typedef … pthread_attr_t;
typedef … size_t;
1
Toate functiile returneaza 0 in caz de succes, altfel returneaza un cod de eroare
4
Seteaza dimensiunea stivei pentru atributele thread-ului.
int pthread_attr_getstacksize(const pthread_attr_t *attr, size_t stacksize);
Citeste dimensiunea stivei pentru atributele thread-ului.
int pthread_attr_setstackaddr( pthread_attr_t *attr, void *stackaddr);
Stabileste adresa stivei pentru atributele thread-ului.
int pthread_attr_getstackaddr(const pthread_attr_t *attr, void **stackaddr);
Citeste adresa stivei pentru atributele thread-ului
int pthread_create(pthread_t *thread, const pthread_attr_t *attr, void
*(*start_routine)(void *), void *arg);
Creaza un nou thread cu atributele date si apeleaza rutina start_routine cu
argumentul specificat
int pthread_join(pthread_t thread, void **value_ptr);
Suspenda thread-ul apelant pana cand thread-ul specificat se termina
int pthread_exit(void *value_ptr);
Termina executia thread-ului apelant
int pthread_detach(pthread_t thread);
Memoria alocata thread-ului poate fi revendicata la terminarea thread-ului
pthread_t pthread_self(void);
Returneaza id-ului thread-ului apelant
int pthread_equal(pthread_t t1, pthread_t t2);
Compara id-urile a doua fire de executie
Firele de executie POSIX au atribute (de exemplu, dimensiunea stivei), care pot fi
manipulate prin intermediul unui obiect de tip atribut (de tip pthread_attr_t) cu ajutorul unor
functii specifice. Fiecare fir de executie creat are asociat un identificator unic (de tip pthread_t) in
raport cu toate celelalte fire de executie care apartin aceluiasi proces.
Firul de executie se poate termina normal prin iesirea din functia start_routine, apeland
pthread_exit sau la primirea unui semnal. Firul de executie isi poate termina executia fortat
printr-un apel pthread_cancel. Un fir de executie poate astepta terminarea altui fir de executie
utilizand functia pthread_join.
5
joinable si memoria alocata poate fi recuperata in mod automat la terminarea executiei
thread-ului.
2. Crearea proceselor
(b) se poate inlocui procesul curent cu un nou proces (operatie de tip exec);
(c) se imparte procesul curent in doua procese = procesul curent se cloneaza (operatie de tip
fork)
Procesul parinte se imparte in doua procese aproape identice. Noul proces va rula in
mod concurent cu procesul original cu care imparte zona de cod, dar nu si zona de
date. Noul proces va fi initializat ca sa fie o copie a procesului original.
Functia fork nu are argumente si returneaza noul pid catre procesul parinte. Procesul
fiu incepe sa se execute imediat dupa apelul lui fork, si este identificat de o valoare
returnata zero.
Obs:
Metoda UNIX / POSIX traditionala de creare a unui nou proces: se face intai fork si apoi
exec, astfel incat se va clona procesul fiu in procesul dorit.
Obs:
In momentul in care se termina, un proces face:
exit(0);
sau, simplu, doar2:
exit();
Obs:
Programul isi poate termina in mod anomal3 executia prin:
abort();
1
Un proces poate contine mai multe fire de executie, care au acces la acelasi spatiu de memorie (pot fi comparate cu
firele de executie in Java, taskurile Ada, procesele occam).
2
exit (functie care nu returneaza nimic) este o functie care curata resursele alocate procesului (fisiere deschise, etc),
termina procesul si returneaza catre procesul parinte un cod de stare (status code) pe care fiul il genereaza in momentul
in care isi termina executia.
3
Isi trimite singur un semnal SIGABRT.
6
Desfasurarea lucrarii:
$ ./creare.out
b) crearea proceselor
Executia programului:
$ ./ex_proces.out