Pr-1st-1.1-m04-Slajd22

Z Studia Informatyczne
Wersja z dnia 15:51, 7 wrz 2006 autorstwa Szopen (dyskusja | edycje)
(różn.) ← poprzednia wersja | przejdź do aktualnej wersji (różn.) | następna wersja → (różn.)
Przejdź do nawigacjiPrzejdź do wyszukiwania

Kanały FIFO

Kanały FIFO

W ogólności, każda wiadomość jest przetwarzana (interpretowana) w pewnym kontekście, określonym często przez wiadomości wcześniej odebrane. Brak właściwego kontekstu, spowodowany na przykład zmianą kolejności przesyłanych wiadomości, może prowadzić do niewłaściwej interpretacji wiadomości i w efekcie do błędów przetwarzania. Jeżeli, dla ilustracji, rozważymy system rezerwacji miejsc lotniczych, to właściwym kontekstem dla wiadomości anulującej rezerwację, jest oczywiście wiadomość zgłoszenia rezerwacji. Wiadomość o anulowaniu nie powinna być odebrana i standardowo przetwarzana przez system rezerwacji, jeśli nie dotarło jeszcze odpowiednie zgłoszenie. Dla takiej aplikacji wskazana byłaby zatem komunikacja gwarantująca porządek odbioru zgodny z kolejnością wysłania - porządek FIFO. Dokładniej, należałoby zagwarantować w sposób niewidoczny dla procesów aplikacyjnych, że jeżeli proces Pi wysyła do Pj wiadomość M przed wysłaniem do Pj wiadomości M, to proces Pj nie odbierze (nie otrzyma) M dopóty, dopóki nie odbierze M.

Mechanizm gwarantujący właściwą kolejność interpretowania wiadomości można oczywiście budować w procesy aplikacyjne, lecz wówczas to projektant aplikacji musi rozwiązać wspomniany problem. Wskazane jest jednak często inne postępowanie, polegające na skonstruowaniu, na przykład przez odpowiednią rozbudowę monitorów Qi, warstwy programowej pośredniczącej między środowiskiem komunikacyjnym nie zachowującym uporządkowania FIFO, a procesami aplikacyjnymi Pj. Warstwa taka - przechowując i ewentualnie wstrzymując w buforach wiadomości, które dotarły zbyt wcześnie - zapewniałaby dostarczenie wiadomości do procesów aplikacyjnych w porządku FIFO. Ideę takiego podejścia ilustruje slajd kolejny, a jego przykładową implementację algorytm przedstawiony na kolejnych slajdach. Formalnie, warstwa monitorów powinna zagwarantować dla wszystkich procesów i każdej wiadomości, że:

e_send(Pi,Pj,M)ie_send(Pi,Pj,M))(e_receive(>Pi,Pj,M)je_receive(Pi,Pj,M))


<< Poprzedni slajd | Spis treści | Następny slajd >>