Przekazywanie wiadomości - Message passing

W informatyce , wiadomość mijania jest techniką wywoływania zachowań (czyli prowadzenie programu ) na komputerze . Program wywołujący wysyła komunikat do procesu (którym może być aktor lub obiekt ) i opiera się na tym procesie i jego infrastrukturze pomocniczej, aby następnie wybrać i uruchomić odpowiedni kod. Przekazywanie komunikatów różni się od konwencjonalnego programowania, w którym proces, podprogram lub funkcja jest wywoływana bezpośrednio przez nazwę. Przekazywanie wiadomości jest kluczem do niektórych modeli współbieżności i programowania obiektowego .

Przekazywanie wiadomości jest wszechobecne we współczesnym oprogramowaniu komputerowym . Jest używany jako sposób, w jaki obiekty tworzące program współpracują ze sobą oraz jako środek do interakcji obiektów i systemów działających na różnych komputerach (np. w Internecie ). Przekazywanie wiadomości może być realizowane za pomocą różnych mechanizmów, w tym kanałów .

Przegląd

Przekazywanie wiadomości to technika wywoływania zachowania (tj. uruchamiania programu) na komputerze. W przeciwieństwie do tradycyjnej techniki wywoływania programu po nazwie, przekazywanie komunikatów wykorzystuje model obiektowy do odróżnienia funkcji ogólnej od konkretnych implementacji. Program wywołujący wysyła komunikat i polega na obiekcie, aby wybrać i wykonać odpowiedni kod. Uzasadnienie zastosowania warstwy pośredniej zasadniczo można podzielić na dwie kategorie: hermetyzacja i dystrybucja.

Enkapsulacja to koncepcja, w której obiekty oprogramowania powinny być w stanie wywoływać usługi na innych obiektach bez wiedzy i troski o to, jak te usługi są zaimplementowane. Hermetyzacja może zmniejszyć ilość logiki kodowania i sprawić, że systemy będą łatwiejsze w utrzymaniu. Np. zamiast instrukcji IF-THEN, które określają, który podprogram lub funkcję należy wywołać, programista może po prostu wysłać komunikat do obiektu, a obiekt wybierze odpowiedni kod na podstawie jego typu.

Jednym z pierwszych przykładów tego, jak można to wykorzystać, był obszar grafiki komputerowej. Manipulowanie obiektami graficznymi wiąże się z różnymi zawiłościami. Na przykład użycie właściwej formuły do ​​obliczenia obszaru zamkniętego kształtu będzie się różnić w zależności od tego, czy kształt jest trójkątem, prostokątem, elipsą czy okręgiem. W tradycyjnym programowaniu komputerowym skutkowałoby to długimi poleceniami IF-THEN sprawdzającymi, jakiego rodzaju obiektem był kształt, i wywołującymi odpowiedni kod. Zorientowanym obiektowo sposobem obsługi tego jest zdefiniowanie klasy wywoływanej Shapez podklasami, takimi jak Rectanglei Ellipse(które z kolei mają podklasy Squarei Circle), a następnie po prostu wysłanie komunikatu do dowolnego z Shapeprośbą o obliczenie jego obszaru. Każdy Shapeobiekt wywoła następnie metodę podklasy z formułą odpowiednią dla tego rodzaju obiektu.

Przekazywanie wiadomości rozproszonych zapewnia programistom warstwę architektury, która zapewnia wspólne usługi do tworzenia systemów składających się z podsystemów, które działają na różnych komputerach w różnych lokalizacjach i w różnym czasie. Gdy rozproszony obiekt wysyła wiadomość, warstwa wiadomości może zająć się takimi kwestiami, jak:

  • Znalezienie procesu przy użyciu różnych systemów operacyjnych i języków programowania, w różnych lokalizacjach, z których pochodzi wiadomość.
  • Zapisanie komunikatu w kolejce, jeśli odpowiedni obiekt do obsługi komunikatu nie jest aktualnie uruchomiony, a następnie wywołanie komunikatu, gdy obiekt jest dostępny. Ponadto przechowywanie wyniku w razie potrzeby, dopóki obiekt wysyłający nie będzie gotowy do jego odbioru.
  • Kontrolowanie różnych wymagań transakcyjnych dla transakcji rozproszonych, np. ACID - testowanie danych.

Przekazywanie wiadomości synchronicznych i asynchronicznych

Synchroniczne przekazywanie wiadomości

Synchroniczne przekazywanie wiadomości odbywa się między obiektami, które działają w tym samym czasie. Jest używany przez języki programowania obiektowego, takie jak Java i Smalltalk.

Komunikaty synchroniczne są analogiczne do synchronicznego wywołania funkcji; tak jak wywołujący funkcję czeka, aż funkcja się zakończy, proces wysyłania czeka, aż zakończy się proces odbierania. Może to uniemożliwić działanie komunikacji synchronicznej w przypadku niektórych aplikacji. Na przykład duże, rozproszone systemy mogą nie działać wystarczająco dobrze, aby były użyteczne. Takie duże, rozproszone systemy mogą wymagać działania, gdy niektóre z ich podsystemów są wyłączone z powodu konserwacji itp.

Wyobraź sobie zapracowane biuro biznesowe, w którym znajduje się 100 komputerów stacjonarnych, które wysyłają do siebie wiadomości e-mail wyłącznie przy użyciu synchronicznego przekazywania wiadomości. Jeden pracownik wyłączając swój komputer może spowodować zawieszenie się pozostałych 99 komputerów do czasu, gdy pracownik ponownie włączy swój komputer w celu przetworzenia pojedynczej wiadomości e-mail.

Asynchroniczne przekazywanie wiadomości

Przy asynchronicznym przekazywaniu wiadomości obiekt odbierający może być wyłączony lub zajęty, gdy obiekt żądający wyśle ​​wiadomość. Kontynuując analogię z wywołaniem funkcji, przypomina to wywołanie funkcji, które wraca natychmiast, bez czekania na zakończenie wywołanej funkcji. Wiadomości są wysyłane do kolejki, w której są przechowywane, dopóki proces odbierający nie zażąda ich. Proces odbierający przetwarza swoje wiadomości i wysyła wyniki do kolejki do pobrania przez pierwotny proces (lub wyznaczony następny proces).

Przesyłanie wiadomości asynchronicznych wymaga dodatkowych możliwości przechowywania i retransmisji danych dla systemów, które mogą nie działać współbieżnie i są zazwyczaj obsługiwane przez oprogramowanie na poziomie pośrednim (często nazywane oprogramowaniem pośredniczącym ); powszechnym typem jest oprogramowanie pośredniczące zorientowane na wiadomości (MOM).

Bufor wymagany w komunikacji asynchronicznej może powodować problemy, gdy jest pełny. Należy podjąć decyzję, czy zablokować nadawcę, czy odrzucić przyszłe wiadomości. Zablokowany nadawca może doprowadzić do zakleszczenia . Jeśli komunikaty zostaną usunięte, komunikacja nie będzie już niezawodna.

Hybrydy

Komunikację synchroniczną można zbudować na bazie komunikacji asynchronicznej przy użyciu Synchronizera . Na przykład α-Synchronizer działa, zapewniając, że nadawca zawsze czeka na wiadomość potwierdzającą od odbiorcy. Nadawca wysyła następną wiadomość dopiero po otrzymaniu potwierdzenia. Z drugiej strony komunikację asynchroniczną można również zbudować na bazie komunikacji synchronicznej. Na przykład współczesne mikrojądra zazwyczaj udostępniają tylko prymityw synchronicznego przesyłania komunikatów, a asynchroniczne przesyłanie komunikatów może być zaimplementowane na górze za pomocą wątków pomocnika .

Obiekty rozproszone

Systemy przekazujące komunikaty używają obiektów rozproszonych lub lokalnych. W przypadku obiektów rozproszonych nadawca i odbiorca mogą znajdować się na różnych komputerach, z różnymi systemami operacyjnymi, z różnymi językami programowania itp. W tym przypadku warstwa magistrali zajmuje się szczegółami konwersji danych z jednego systemu do drugiego, wysyłania i odbierania danych w całym systemie. sieć itp. Protokół Remote Procedure Call (RPC) w systemie Unix był wczesnym tego przykładem. Należy zauważyć, że przy tego rodzaju przekazywaniu wiadomości nie jest wymagane, aby nadawca ani odbiorca używali programowania obiektowego. Systemy języka proceduralnego mogą być opakowane i traktowane jako duże, ziarniste obiekty zdolne do wysyłania i odbierania wiadomości.

Przykładami systemów obsługujących obiekty rozproszone są: Emerald , ONC RPC , CORBA , Java RMI , DCOM , SOAP , .NET Remoting , CTOS , QNX Neutrino RTOS , OpenBinder i D-Bus . Systemy obiektów rozproszonych zostały nazwane systemami „bez współdzielenia”, ponieważ abstrakcja przekazywania wiadomości ukrywa podstawowe zmiany stanu, które mogą być użyte w implementacji wysyłania wiadomości.


Rozproszone lub asynchroniczne przekazywanie komunikatów wiąże się z dodatkowym obciążeniem w porównaniu z wywoływaniem procedury. W przekazywaniu komunikatów argumenty muszą zostać skopiowane do nowej wiadomości. Niektóre argumenty mogą zawierać megabajty danych, z których wszystkie muszą zostać skopiowane i przesłane do obiektu odbierającego.

Tradycyjne wywołania procedur różnią się od przekazywania komunikatów pod względem wykorzystania pamięci, czasu transferu i lokalizacji. Argumenty są przekazywane do odbiornika zazwyczaj przez rejestry ogólnego przeznaczenia nie wymagające dodatkowego przechowywania ani czasu przesyłania, lub w liście parametrów zawierającej adresy argumentów (kilka bitów). Przekazywanie adresów nie jest możliwe w systemach rozproszonych, ponieważ systemy używają oddzielnych przestrzeni adresowych.

Web przeglądarki i serwery WWW są przykłady procesów, które komunikują się przez przesyłania komunikatów. URL jest przykładem przedstawieniu zasobów bez narażania wewnętrzne procesu.

Podprogram połączenia lub metoda inwokacja nie wyjdzie dopóki wywoływany obliczeń został zakończony. Z kolei asynchroniczne przekazywanie komunikatów może skutkować otrzymaniem odpowiedzi po dłuższym czasie od wysłania komunikatu żądania.

Program obsługi komunikatów na ogół przetwarza komunikaty od więcej niż jednego nadawcy. Oznacza to, że jego stan może ulec zmianie z przyczyn niezwiązanych z zachowaniem pojedynczego procesu nadawcy lub klienta. Jest to przeciwieństwo typowego zachowania obiektu, na którym wywoływane są metody: oczekuje się, że ten ostatni pozostanie w tym samym stanie między wywołaniami metod. Innymi słowy, program obsługi komunikatów zachowuje się analogicznie do ulotnego obiektu .

Modele matematyczne

Wyróżniającymi się matematycznymi modelami przekazywania wiadomości są model Aktora i rachunek Pi . W kategoriach matematycznych wiadomość jest jedynym środkiem przekazania kontroli do obiektu. Jeśli obiekt odpowie na wiadomość, ma metodę dla tej wiadomości.

Alan Kay argumentował, że przekazywanie wiadomości jest ważniejsze niż obiekty w obiektach obiektowych i że same obiekty są często nadmiernie podkreślane. Żywo rozproszonych obiektów modelu programowania opiera się na tej obserwacji; wykorzystuje koncepcję rozproszonego przepływu danych do scharakteryzowania zachowania złożonego systemu rozproszonego pod względem wzorców komunikatów, przy użyciu specyfikacji wysokiego poziomu w stylu funkcjonalnym.

Przykłady

Zobacz też

Bibliografia

Dalsza lektura

Zewnętrzne linki