Trimiterea mesajului - Message passing

În informatică , transmiterea mesajelor este o tehnică pentru invocarea comportamentului (adică, rularea unui program ) pe un computer . Programul de invocare trimite un mesaj către un proces (care poate fi un actor sau un obiect ) și se bazează pe acel proces și infrastructura de suport pentru a selecta și rula un cod adecvat. Transmiterea mesajului diferă de programarea convențională în care un proces, subrutină sau funcție este invocată direct prin nume. Transmiterea mesajelor este esențială pentru unele modele de concurență și programare orientată pe obiecte .

Transmiterea mesajelor este omniprezentă în software-ul computerizat modern . Este folosit ca o modalitate prin care obiectele care alcătuiesc un program pot lucra între ele și ca mijloc pentru interacțiunea obiectelor și sistemelor care rulează pe diferite computere (de exemplu, Internetul ). Transmiterea mesajelor poate fi implementată prin diferite mecanisme, inclusiv prin canale .

Prezentare generală

Transmiterea mesajelor este o tehnică pentru invocarea comportamentului (adică, rularea unui program) pe un computer. Spre deosebire de tehnica tradițională de apelare a unui program după nume, transmiterea mesajelor utilizează un model de obiect pentru a distinge funcția generală de implementările specifice. Programul invocator trimite un mesaj și se bazează pe obiect pentru a selecta și executa codul corespunzător. Justificările pentru utilizarea unui strat intermediar se încadrează în esență în două categorii: încapsulare și distribuție.

Incapsularea este ideea că obiectele software ar trebui să poată invoca servicii pe alte obiecte fără să știe sau să se preocupe de modul în care aceste servicii sunt implementate. Incapsularea poate reduce cantitatea de logică de codificare și poate face sistemele mai ușor de întreținut. De exemplu, mai degrabă decât să aibă instrucțiuni IF-THEN care determină care subrutină sau funcție să apeleze un dezvoltator poate trimite doar un mesaj obiectului și obiectul va selecta codul corespunzător în funcție de tipul acestuia.

Unul dintre primele exemple despre modul în care acest lucru poate fi utilizat a fost în domeniul graficii pe computer. Există diverse complexități implicate în manipularea obiectelor grafice. De exemplu, pur și simplu folosind formula potrivită pentru a calcula aria unei forme închise va varia în funcție de forma în care este un triunghi, dreptunghi, elipsă sau cerc. În programarea tradițională a computerului, acest lucru ar avea ca rezultat declarații lungi IF-THEN care testează ce fel de obiect era forma și apelează codul corespunzător. Modul orientat spre obiect de a gestiona acest lucru este de a defini o clasă numită Shapecu subclasele cum ar fi Rectangleși Ellipse(care la rândul lor au subclase Squareși Circle) și apoi de a trimite pur și simplu un mesaj către oricine îi Shapecere să își calculeze aria. Fiecare Shapeobiect va invoca apoi metoda subclasei cu formula adecvată pentru acel tip de obiect.

Transmiterea distribuită a mesajelor oferă dezvoltatorilor un strat de arhitectură care oferă servicii comune pentru a construi sisteme formate din subsisteme care rulează pe computere disparate în locații diferite și la momente diferite. Când un obiect distribuit trimite un mesaj, stratul de mesagerie se poate ocupa de probleme precum:

  • Găsirea procesului utilizând diferite sisteme de operare și limbaje de programare, în locații diferite de unde a provenit mesajul.
  • Salvarea mesajului pe o coadă dacă obiectul adecvat pentru gestionarea mesajului nu rulează în prezent și apoi invocarea mesajului atunci când obiectul este disponibil. De asemenea, stocarea rezultatului, dacă este necesar, până când obiectul expeditor este gata să-l primească.
  • Controlul diferitelor cerințe tranzacționale pentru tranzacțiile distribuite, de exemplu testarea ACID a datelor.

Transmitere de mesaje sincronă versus asincronă

Transmiterea mesajului sincron

Transmiterea sincronă a mesajelor are loc între obiectele care rulează în același timp. Este folosit de limbaje de programare orientate obiect, cum ar fi Java și Smalltalk.

Mesageria sincronă este similară cu un apel funcțional sincron; la fel cum apelantul funcției așteaptă până la finalizarea funcției, procesul de trimitere așteaptă până la finalizarea procesului de primire. Acest lucru poate face comunicarea sincronă inoperabilă pentru unele aplicații. De exemplu, este posibil ca sistemele mari distribuite să nu funcționeze suficient de bine pentru a putea fi utilizate. Astfel de sisteme mari, distribuite, ar putea avea nevoie să funcționeze în timp ce unele dintre subsistemele lor sunt defecte pentru întreținere etc.

Imaginați-vă un birou ocupat care are 100 de computere desktop care își trimit e-mailuri reciproc folosind exclusiv mesajele sincrone. Unul dintre lucrători care își oprește computerul poate provoca înghețarea celorlalte 99 de computere până când acesta își aprinde computerul pentru a procesa un singur e-mail.

Transmiterea mesajului asincron

Cu trecerea mesajului asincron obiectul receptor poate fi oprit sau ocupat atunci când obiectul solicitant trimite mesajul. Continuând analogia apelului funcțional, este ca un apel funcțional care revine imediat, fără a aștepta finalizarea funcției apelate. Mesajele sunt trimise la o coadă unde sunt stocate până când procesul de primire le solicită. Procesul de primire își procesează mesajele și trimite rezultatele la o coadă pentru preluare prin procesul original (sau un proces desemnat următor).

Mesageria asincronă necesită capabilități suplimentare pentru stocarea și retransmiterea datelor pentru sisteme care pot să nu ruleze simultan și, în general, sunt gestionate de un nivel intermediar de software (adesea numit middleware ); un tip comun fiind middleware orientat spre mesaje (MOM).

Tamponul necesar pentru comunicarea asincronă poate cauza probleme atunci când este plin. Trebuie luată o decizie dacă se blochează expeditorul sau dacă se elimină mesajele viitoare. Un expeditor blocat poate duce la blocare . Dacă mesajele sunt abandonate, comunicarea nu mai este fiabilă.

Hibrizi

Comunicarea sincronă poate fi construită deasupra comunicării asincrone utilizând un sincronizator . De exemplu, sincronizatorul α funcționează asigurându-se că expeditorul așteaptă întotdeauna un mesaj de confirmare de la receptor. Expeditorul trimite următorul mesaj numai după primirea confirmării. Pe de altă parte, comunicarea asincronă poate fi, de asemenea, construită deasupra comunicării sincrone. De exemplu, microkernelurile moderne oferă, în general, doar o mesagerie sincronă primitivă, iar mesageria asincronă poate fi implementată deasupra folosind fire de asistență .

Obiecte distribuite

Sistemele de transmitere a mesajelor utilizează obiecte distribuite sau locale. În cazul obiectelor distribuite, expeditorul și receptorul pot fi pe computere diferite, rulează diferite sisteme de operare, utilizează diferite limbaje de programare etc. rețea etc. Protocolul RPC ( Remote Procedure Call ) din Unix a fost un prim exemplu în acest sens. Rețineți că, cu acest tip de transmitere a mesajului, nu este o cerință ca expeditorul și receptorul să nu utilizeze programarea orientată obiect. Sistemele de limbaj procedural pot fi împachetate și tratate ca obiecte cu granule mari capabile să trimită și să primească mesaje.

Exemple de sisteme care acceptă obiecte distribuite sunt: Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinder și D-Bus . Sistemele de obiecte distribuite au fost numite sisteme „nimic împărtășit”, deoarece mesajul care trece prin abstractizare ascunde modificările stării care pot fi utilizate în implementarea trimiterii mesajelor.


Distribuirea sau asincronizarea, transmiterea mesajelor are cheltuieli suplimentare suplimentare în comparație cu apelarea unei proceduri. În transmiterea mesajelor, argumentele trebuie copiate în noul mesaj. Unele argumente pot conține megaocteți de date, toate acestea trebuie să fie copiate și transmise obiectului receptor.

Apelurile de procedură tradiționale diferă de transmiterea mesajelor în ceea ce privește utilizarea memoriei, timpul de transfer și localitatea. Argumentele sunt transmise receptorului în mod obișnuit prin registre de uz general care nu necesită stocare suplimentară și nici timp de transfer sau într-o listă de parametri care conține adresele argumentelor (câțiva biți). Transmiterea adreselor nu este posibilă pentru sistemele distribuite, deoarece sistemele utilizează spații de adrese separate.

Web browsere și servere web sunt exemple de procese care comunica prin mesaj de trecere. O adresă URL este un exemplu de referință a unei resurse fără a expune procesele interne.

Un apel de subrutină sau o invocare a unei metode nu va ieși până când calculul invocat nu se va termina. Prin contrast, transmiterea asincronă a mesajului poate duce la un răspuns care ajunge la un timp semnificativ după ce a fost trimis mesajul de solicitare.

Un gestionar de mesaje va procesa, în general, mesaje de la mai mulți expeditori. Aceasta înseamnă că starea sa se poate modifica din motive care nu au legătură cu comportamentul unui singur expeditor sau proces client. Acest lucru este în contrast cu comportamentul tipic al unui obiect asupra căruia sunt invocate metode: acesta din urmă se așteaptă să rămână în aceeași stare între invocațiile metodei. Cu alte cuvinte, gestionarul de mesaje se comportă în mod analog cu un obiect volatil .

Modele matematice

Modelele matematice proeminente de transmitere a mesajelor sunt modelul Actor și calculul Pi . În termeni matematici, un mesaj este singurul mijloc de a transmite controlul unui obiect. Dacă obiectul răspunde la mesaj, acesta are o metodă pentru acel mesaj.

Alan Kay a susținut că transmiterea mesajelor este mai importantă decât obiectele din POO și că obiectele în sine sunt adesea suprasolicitate. Modelul de programare a obiectelor distribuite în direct se bazează pe această observație; folosește conceptul unui flux de date distribuite pentru a caracteriza comportamentul unui sistem distribuit complex în termeni de tipare de mesaje, utilizând specificații la nivel înalt, în funcționalitate.

Exemple

Vezi si

Referințe

Lecturi suplimentare

linkuri externe