Documente Academic
Documente Profesional
Documente Cultură
READY
MsgReceive()
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
S erver
Canal
Figura 2 Transmiterea mesajelor intre server - client prin intermediul canalelor si conexiunilor Functii asociate transmiterii de mesaje sub QNX:
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