Sunteți pe pagina 1din 2

Programarea aplicatiilor in timp-real Laborator 9

Mecanisme de comunicatie sub QNX Mesaje.


Sincronizarea prin intermediul schimbului de mesaje reprezinta forma principala de IPC pusa la dispozitie de nucleul Neutrino. Desi sunt puse la dispozitie si alte forme de comunicatie intre procese, acestea se bazeaza pe schimbul de mesaje implementat nativ in nucleu. Schimbul de mesaje implementat prin functiile specifice de tip MsgSend(), MsgReceive() si MsgReply() (figura 1) este sincron si implica copieri de date. Un fir de executie care apeleaza MsgSend(), incercand sa transmita un mesaj altui fir de executie (care poate rula in cadrul unui alt proces), se va bloca pana in momentul in care firul de executie tinta apeleaza MsgReceive() pentru a receptiona mesajul, prelucreaza mesajul si apeleaza apoi MsgReply() pentru a confirma receptionarea mesajului. Daca un fir de executie apeleaza MsgReceive() fara ca un mesaj sa fi fost trimis in prealabil, el se va bloca pana cand un alt fir de executie va apela MsgSend().
MsgReply() sau MsgError() SENDblo cked MsgSend()
MsgSend()

REC EIVEblo cked MsgReceive()

READY

MsgReceive()

Acest thread Alt thread

MsgReply() sau MsgError()

REPLYblo cked

Figura 1 Mecanismul de transmitere de mesaje in QNX Operatiile de trimitere si primire de mesaje sunt cu blocare si sunt sincrone. Blocarea inerenta sincronizeaza executia firului de executie care trimite mesajul, acesta blocandu-se pana la confirmarea receptiei, in timp ce firul de executie care primeste mesajul este programat pentru executie. Operatiile MsgReply() sau MsgError() nu sunt cu blocare. Deoarece firul de executie client este deja blocat asteptand confirmarea, nu este necesara o alta sincronizare, existenta unei functii MsgReply() cu blocare nefiind justificata. Acest lucru permite serverului sa trimita confirmarea clientului si sa-si continue executia, in timp ce kernelul si / sau codul de retea vor transmite asincron confirmarea clientului si il vor trece in starea de gata de executie. Continutul mesajelor nu are nici o semnificatie pentru nucleul Neutrino, acesta avand insemnatate doar pentru server si client. Programatorul are la dispozitie si un set de mesaje predefinite, astfel incat procesele scrise de acesta sa poata interactiona sau substitui seviciile furnizate de sistem.

Nucleul Neutrino suporta transmiterea unui mesaj format din mai multe parti astfel incat un mesaj expediat din spatiul de adresa al unui fir de executie in cel al altui fir de executie sa nu necesite existenta sa intr-un singur buffer continuu. Acest lucru se realizeaza prin definirea atat de catre server cat si de catre client a unui vector care sa indice adresele din memorie la care se gasesc fragmentele mesajelor celor doua fire de executie. Dimensiunile fragmentelor mesajelor pot fi diferite pentru server si client. Acest tip de transfer este folosit in special de catre sistemul de fisiere. Nucleul Neutrino permite schimbul de mesaje prin intermediul canalelor si conexiunilor (figura 2) si nu direct, de la un fir de executie la altul. Un fir de executie care doreste sa primeasca un mesaj creaza mai intai un canal. Un alt fir de executie care doreste sa ii trimita un mesaj trebuie sa creeze o conexiune, prin "atasarea" la canalul respectiv. Canalele sunt folosite de servere pentru a receptiona mesaje. Conexiunile sunt create de firele de executie de tip client, prin "atasarea" lor la canalele puse la dispozitie de sever. Odata stabilite conexiunile, firele de executie client pot trimite mesaje prin intermediul acestora. Canalele si conexiunile sunt reprezentate in cadrul procesului printr-un identificator de tip small integer. Conexiunile clientilor sunt mapate direct in descriptorii de fisier, acest lucru eliminand necesitatea determinarii destinatarului mesajului bazandu-ne pe descriptorul de fisier (de exemplu prin read(fd)).

S erver

Can al Con exiun e Clien t Conexiu ne

S erver

Canal

Figura 2 Transmiterea mesajelor intre server - client prin intermediul canalelor si conexiunilor Functii asociate transmiterii de mesaje sub QNX:

Bibliografie: Programarea Aplicatiilor in Timp Real, cap. 4, pag. 139

Desfasurarea lucrarii: Exemplul 1: Transmiterea mesajelor intre firele de executie din cadrul unui proces. Crearea canalelor de comunicatie. Bibliografie: Programarea Aplicatiilor in Timp Real, cap. 4, pag. 147, listing 12