Documente Academic
Documente Profesional
Documente Cultură
Un sistem de timp real se defineste relativ la notiunea de task de timp real. Definim un task ca fiind
o functie individuala care se executa in mod repetitiv in contextul unei anumite aplicatii, astfel incat
aplicatia poate fi descrisa ca o trecere progresiva printr-o secventa de taskuri. La fiecare moment de
timp, aplicatia este implicata in executia unui anumit task, si acest task trebuie planificat.
Task = cea mai mica unitate de prelucrare careia i se atribuie o identitate, reprezentand un program
in forma executabila compus dintr-o succesiune de instructiuni executate secvential.
Cea mai importanta componenta a unui sistem de timp real este sistemul de operare, si in
particular, planificatorul de task-uri. Toate sistemele de operare in timp real trebuie sa ofere trei
functii specifice:
• task dispatching . Un dispatcher realizeaza operatiile necesare pentru a lansa un task in executie;
In general, prin nucleu de timp-real se intelege cea mai mica portiune a unui sistem de operare, care
implementeaza cele trei functii mentionate anterior, insa, din punct de vedere al complexitatii, se
poate considera urmatoarea ierarhizare a "nucleelor":
• nano-kernel : furnizeaza un singur serviciu din cele trei, si anume task dispatching. Face doar
managementul unui singur fir de executie;
• kernel : este un micro-kernel care permite in plus sincronizarea cat si comunicatia intre taskuri
prin intermediul semafoarelor, cutiilor postale, etc;
• executiv de timp-real : este un nucleu cu caracteristici mult mai complexe, cum ar fi blocuri de
memorie private, servicii I/O, etc. In aceasta categorie se inscriu cele mai multe nuclee de timp real
comerciale;
nuclee comerciale:
o QNX, OS9, PDOS, pSOS, VxWorks, ERCOS, EMERALDS
o au dimensiuni reduse, functionare multitasking, mecanisme IPC standard (cutii
postale, evenimente, semnale, semafoare), asigura comutare rapida de context
o arhitectura modulara
o ceas de timp-real, planificare pe baza de prioritati, alarme si timeouts.
extensii ale sistemelor UNIX si ale altor sisteme de operare:
o RT-UNIX, RT-LINUX, RT-MACH,RT-POSIX
o sunt mai lente, mai putin predictibile
o se bazeaza pe un set de interfete standard.
nuclee experimentale / de cercetare :
o Spring, MARS, HARTOS, MARUTI, ARTS, CHAOS, DARK
o au mecanisme de planificare de timp-real si analiza a comportarii in timp
o pun acces pe predictabilitate, mai putin pe performanta medie
o implementeaza mecanisme de evitare a inversiunii de prioritate (e.g. priority ceiling
protocol)
o asigura suport pentru fault-tolerance si operatii de I/O.
De cele mai multe ori, in sistemele de timp real notiunile de proces si task se refera la acelasi
concept. Un proces este in esenta un cod program care se afla intr-o anumita stare de executie.
Procesul are propriul sau spatiu de adresa si un singur flux de executie (engl. flow of control ).
Contorul program al procesului contine adresa urmatoarei instructiuni care trebuie executata.
Sistemul de operare QNX este dedicat dezvoltarii aplicatiilor de timp-real, avand facilitati specifice ca
planificarea multitasking preemptiva pe baza de prioritati, posibilitatea comutarii rapide de context,
mecanisme de comunicare intre procese. QNX poate fi utilizat pentru aplicatii stand alone sau pentru
lucrul in retea, fiind extrem de flexibil. Sistemul de operare QNX poate fi "ajustat" in functie de
aplicatie
Sistemul QNX Neutrino ajunge sa asigure un grad ridicat de eficienta, modularitate prin doua
principii de bază:
Arhitectura microkernel
Comunicarea interprocese bazată pe mesaje
a. Arhitectura microkernel
Un microkernel al sistemului de operare este structurat ca un mic nucleu ce furnizează servicii
minimale utilizate de procesele ce cooperează. 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.
Microkernelul Neutrino asigura managementul cooperarii proceselor, actionând ca un fel de
magistrala software ce asigura conectarea dinamică a modulelor de intrare-iesire.
Dupa cum s-a mentionat anterior, 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 fir de executie reprezinta un singur flux de executie sau control. Prin intermediul firelor de
executie este posibila o gestiune diferita a spatiului de adresa alocat unui proces (figura 3). Spatiile
de cod, date si memorie disponibila sunt aceleasi pentru toate firele de executie care apartin
aceluiasi proces. Comunicatia între firele de executie se face prin zonele comune de memorie.
Fiecare fir de executie are starea lui. Comutarea firelor de executie este mult mai simpla (se
salveaza câtiva registri ai procesului si stiva) si rapida.
Un proces este in esenta un cod program care se afla într-o anumita stare de executie. Procesul are
propriul sau spatiu de adresa (figura 4) si un singur flux de executie (engl. flow of control ).
Contorul program al procesului contine adresa urmatoarei instructiuni care trebuie executata.
Dezvoltarea unei aplicatii concurente sub QNX se realizeaza utilizand modelul firelor de executie
conform standardului POSIX. In functie de natura aplicatiei, firele de executie se pot executa
independent, fara comunicare intre algoritmi, sau pot fi strans legate, necesitand comunicare si
sincronizare. Un proces va contine intotdeauna cel putin un fir de executie. In functie de natura
aplicatiei, microkernelul Neutrino si managerul de procese pot fi configurate astfel incat sa permita
executia unei combinatii de fire de executie si procese (conform standardului POSIX).
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). Urmatoarele
resurse asociate firelor de executie sunt private:
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. Pe durata existentei sale, un fir de executie se poate afla in
una dintre urmatoarele stari:
Dupa cum se observa in tabelul 5-2, sistemul de operare QNX permite comunicarea intre procese (si
intre fire de executie) prin intermediul mesajelor, utilizand primitive de tipul send() (pentru
transmiterea mesajelor), receive() (pentru receptionarea mesajelor), reply() (pentru transmiterea
raspunsului la un mesaj). Deoarece aceste primitive sunt cu blocare, se face implicit si o
sincronizare intre procesele (firele de executie) care le apeleaza. Astfel, procesele (firele de
executie) sunt blocate atunci cand asteapta ca o anumita parte a unui protocol de transmitere de
mesaje sa se incheie (tabelul 5-3).
Fiecarui fir de executie ii este asociata o prioritate. Pentru a selecta urmatorul fir de executie care
va intra in executie planificatorul va analiza prioritatea thread-urilor care sunt in stare READY (gata
de executie). Thread-ul cu prioritatea cea mai mare va fi lansat in executie. Prioritatea firelor de
executie (figura 6) poate varia intre 1 (minim) si 63 (maxim), independent de algoritmul de
planificare. Exista un thread special idle (managerul de procese) a carui prioritate este 0, care este
intotdeauna in stare gata de executie. Un fir de executie mosteneste prioritatea "parintelui" sau.
Firele de executie sunt ordonate in coada READY in functie de prioritate. Coada READY este
implementata sub forma a 64 de cozi separate, cate una pentru fiecare prioritate. Firele de executie
sunt inserate in coada corespunzatoare prioritatii proprii in ordine FIFO. Pentru executie este
selectat thread-ul cu prioritatea cea mai mare.
• se blocheaza (atunci cand trebuie sa astepte aparitia unui eveniment, e.g. raspunsul la o cerere
IPC, asteptare pe un mutex, etc). Firul de executie blocat este scos din coada de procese gata de
executie (ready) si este lansat in executie (intra in starea running) firul de executie cu prioritatea cea
mai mare din coada ready. Atunci cand firul de executie este deblocat, este reinserat la sfarsitul
cozii ready pentru nivelul corespunzator de prioritate;
• este scos din executie in mod preemptiv de un fir de executie cu prioritate mai mare. Firul de
executie care se executa in mod curent va putea fi scos din executie atunci cand un alt thread cu
prioritate mai mare este pus in coada READY, ca rezultat al expirarii conditiei sale de blocare.
Thread-ul scos preemptiv din executie va fi pus la inceputul cozii READY la nivelul de prioritate
corespunzator;
• yields. Firul de executie elibereaza procesorul in mod voluntar (prin sched_yield() ) si este plasat
la sfarsitul cozii READY la prioritatea corespunzatoare. Se va executa astfel firul de executie cu
prioritatea cea mai mare).
Sistemul de operare in timp-real QNX dispune de mai multi algoritmi de planificare, si anume
planificare de tip FIFO, planificare de tip round-robin, planificare adaptiva si planificare sporadica.
I. Comenzi uzuale
Afisarea numelui directorului de lucru $ pwd
Schimbarea directorului de lucru
$ cd
Listare continut director curent
$ ls
Afiseaza calea pina la un anumit fisier (de $ which ls
$ umask
1
Rezultatul comenzii este de forma urmatoare:
tip owner group other links owner group octeti data_ultima_modificare nume
$ psin
$ sin
$ kill pid
1
Pentru specificarea drepturilor de acces se foloseste urmatoarea notatie:
Clasa u user g grup o all other users a all
Operatori + add - remove = replace
Permisiune r read w write x execute
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.