Metody realizacji języków programowania/MRJP Wykład 13

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

Obiekty aktywne: współbieżne i rozproszone

W niektórych językach programowania obiektowego pewne obiekty mogą być aktywne tzn. wykonywać swoje własne instrukcje równocześnie z innymi obiektami aktywnymi.

Przypomnijmy, że zwykle obiekt jest kolekcją swych atrybutów: pól i metod. Taki obiekt nie wykonuje swoich własnych poleceń. W odróżnieniu od zwykłych obiektów klas istnieć mogą obiekty aktywne odpowiednio zadeklarowanych klas. W języku Java są to obiekty podklas klasy Thread. W Loglanie są to obiekty procesów. W Adzie ... TODO

Obiekty aktywne (alias procesy albo wątki) są więc dla nas obiektami, które posiadają możliwość wykonywania instrukcji równocześnie z innymi procesami. Mówiąc dokładniej obliczenia procesów mogą być wykonywane:

  • Współbieżnie (wiele procesów wykonywanych na jednym procesorze fizycznym),
  • W rozproszeniu (na maszynach połączonych siecią),
  • Równolegle (na maszynie z wieloma procesorami, które dzielą się wspólną pamięcią).


== Współbieżnie czy w rozproszeniu? == Pytanie takie pojawia sie bardzo wcześnie gdy zamierzamy w języku programowania zawrzeć narzędzia programowania rozproszonego i współbieżnego. W Javie mamy dwie odrębne koncepcje: procesy współbieżne realizowane są jako obiekty pokdlas klasy Thread. Procesy rozproszone wymagają użycia mechanizmu [RMI]link RMI. Trzeba więc zapoznac sie z dwoma odrebnymi koncepcjami i opanować ich własności.

W języku Loglan'82 zrealizowano rozproszoną współbieżność. Wyglądające jednakowo wyrażenie generowania nowego obiektu new MojProces (arg1, arg2, ) tworzy obiekt procesu, który jest alokowany na wirtualnej maszynie wskazanej przez wartość wyrażenia arg1. Jeśli ta wartość wynosi 0 to alokacja odbywa się na bieżącym procesorze i wtedy stary i nowy proces działają współbieżnie dzieląc się czasem maszyny wirtualnej. Jeśli wartość ta jest różna od zera to nowy proces jest alokowany na procesorze o wskazanym numerze = arg1 i dalsze obliczenia odbywają sie w rozproszeniu. Łatwo dostrzec, że model ten dopuszcza wiele różnych odmian wykonywania obliczeń w rozproszeniu wymieszanym ze współbieżnościa.

Statyczna czy dynamiczna konfiguracja systemu procesów

Podstawowa decyzja jaką należy podjąć w zakresie konfiguracji systemu procesów w programie dotyczy tego czy liczba obiektów aktywnych programu jest stała czy zmienna? W niektórych językach programowania współbieżnego, zwłaszcza tych, które służą tworzeniu sytemów czasu rzeczywistego lub procesów operacyjnych, wybiera się opcję statyczną. W językach obiektowych naturalny jest wybór opcji dynamicznej. Oznacza to, że liczba procesów aktywnych zmienia się w trakcie obliczeń, że w programie występują wyrażenia generujące obiekty aktywne.

Mechanizmy komunikacji procesów rozproszonych

Tworzenie procesu i jego scenariusz

Proces powstaje w wyniku obliczenia wartości wyrażenia new MojProces(nrMaszynyWirtualnej, inne parametry). Nowoutworzony proces może zostać zapamiętany jako wartość zmiennej typu MojProces. Poniższy rysunek przedstawia stany procesu i instrukcje powodujące zmiany stanu.

Typ wartości pierwszego parametru powinien byc integer. Wartość tego parametru wskaże na której maszynie wirtualnej zostanie umieszczony nowy proces. Wartość równa zeru nakazuje umieszczenie procesu na tej samej maszynie wirtualnej, która oblicza wartość wyrażenia newMojProces(...).

Po zakonczeniu wykonywania instrukcji konstruktora proces przechodzi w stan PASYWNY z MASKą pustą. Zmienna x typu MojProces może zapamiętać wartość wyrażenia.

Uruchomienie(lub wznowienie) wątku wymaga by inny proces posiadający zmienną x wskazującą na nasz proces wykonał instrukcję resume(x) Proces x przechodzi w stan AKTYWNY i wykonuje instrukcje swego wątku równocześnie z instrukcjami innych procesów. Równocześnie tzn. współbieżnie z innymi procesami aktywnymi na tej samej maszynie wirtualnej i równolegle z procesami aktywnymi wykonywanymi na innych maszynach wirtualnych wieloprocesorowej, sieciowej maszyny wirtualnej.

Wykonanie instrukcji stop spowoduje przejście procesu w stan PASYWNY.

Wykonanie instrukcji enable metoda1, metoda 2; spowoduje dodanie nazw metod metoda1 i metoda2 do MASKi.

Wykonanie instrukcji disable metoda 2; spowoduje usunięcie metody metoda2 z MASKi.

Wykonanie instrukcji accept metoda3, metoda2; spowoduje dodanie nazw metod metoda3 i metoda2 do MASKi i oczekiwanie na to by inny proces wezwał jakąś metodę znajdującą się w MASce.

Wykonanie instrukcji call y.Metoda(parametry) jest tzw. obcym wołaniem metody (zob. poniżej)

Obce wołanie metod w procesach

Na czym to polega?

Składniowo wygląda to jak wołanie metody w obiekcie

    x.TaMetoda(parametry aktualne)

gdzie x jest nazwą obiektu procesu czyli wartością zmiennej x jest obiekt procesu, TaMetoda jest nazwą pewnej metody w obiekcie x.

Semantyka to cały protokół porozumiewania się procesu y wykonującego tę instrukcję procedury z wzywanym procesem x. proces wywołujący y:

  oblicz parametry aktualne                     
  sprawdź czy proces x istnieje
     jeśli NIE to czekaj
     jeśli TAK to sprawdź czy proces x jest aktywny
                              jeśli NIE to czekaj
                              jeśli TAK to sprawdź czy TaMetoda jest w masce
                                   jeśli NIE to czekaj
                                   jeśli TAK to przekaż parametry procesowi x
                                                oczekuj na podpowiedź;
                                                odbierz wyniki;


proces x:

       wykonuj swoje instrukcje; po każdej z nich (przy ;) sprawdzaj czy inny proces 
              nie wzywa do wykonania twojej otwartej (ang. enabled) metody;
          jeśli TAK to zapisz MASKę na stos;
                       wyzeruj MASKę;
                       wykonaj wzywaną metodę z otrzymanymi od innego procesu parametrami;
                       po jej zakonczeniu wyślij wyniki tzn. parametry out;
                       odtwórz MASKę ze stosu;
                       wykonaj instrukcję
                       return disable M,N enable M',N', P'; 
                       kończącą wykonywanie wezwanej metody;

Tak więc polecenie x.Tametoda(...) wykonane w procesie y przerywa pracę procesu x. Proces x sprawdza czy jest gotów do przyjęcia tego przerwania tzn. czy metoda Tametoda znajduje się w masce procesu x. Jeśli tak jest to proces x wykonuje wzywaną metodę. Po zakończeniu tego zadania proces x powraca do wykonywania swego wątku poleceń. Trochę inaczej przebiega ta komunikacja gdy proces x wykona polecenie accept mt1, ..., mtk; Instrukcja accept w procesie x jest wykonywana wspólnie z instrukcją innego procesu wywołującą taką metodę procesu x, która znajduje się w jego masce. Metody mt1, ... , mtk wyliczone po słowie accept powiększaja maskę na czas wykonywania instrukcji accept. Oznacza to, że instrukcja accept oczekuje na wywołanie metody znajdującej się w masce aktualnego procesu.