Metody realizacji języków programowania/MRJP Wykład 13: Różnice pomiędzy wersjami

Z Studia Informatyczne
Przejdź do nawigacjiPrzejdź do wyszukiwania
Salwicki (dyskusja | edycje)
Dorota (dyskusja | edycje)
Nie podano opisu zmian
Linia 7: Linia 7:
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.
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.


Obiekty aktywne (alias procesy albo wątki) są 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:
Obiekty aktywne (alias procesy albo wątki) są 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),
* współbieżnie (wiele procesów wykonywanych na jednym procesorze fizycznym),
* W rozproszeniu (na maszynach połączonych siecią),  
* w rozproszeniu (na maszynach połączonych siecią),  
* Równolegle (na maszynie z wieloma procesorami, które dzielą się wspólną pamięcią).
* równolegle (na maszynie z wieloma procesorami, które dzielą się wspólną pamięcią).


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.  
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 zadania (ang. task) są watkami współbieżnymi. Istnieje rozszerzenie o nazwie GLADE, które pozwala kompilatorowi "gnat" języka ADA z rodziny kompilatorów gcc (GNU C compiler) tłumaczyc i wykonywać programy w srodowisku rozproszonym. A więc mamy sytuację podobną do tej w Javie.  
W języku Java są to obiekty podklas klasy Thread. W Loglanie są to obiekty procesów. W Adzie zadania (ang. task) są wątkami współbieżnymi. Istnieje rozszerzenie o nazwie GLADE, które pozwala kompilatorowi "gnat" języka ADA z rodziny kompilatorów gcc (GNU C compiler) tłumaczyć i wykonywać programy w środowisku rozproszonym. A więc mamy sytuację podobną do tej w Javie.  




Linia 19: Linia 19:
=== Współbieżnie czy w rozproszeniu? ===  
=== 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.  
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][http://www.example.com link RMI]. Trzeba więc zapoznac sie z dwoma odrebnymi koncepcjami i opanować ich własności.  
W Javie mamy dwie odrębne koncepcje: procesy współbieżne realizowane są jako obiekty podklas klasy Thread. Procesy rozproszone wymagają użycia mechanizmu [RMI][http://www.example.com link RMI]. Trzeba więc zapoznać się z dwoma odrębnymi 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.
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 ===
=== 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?
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 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.
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.
Linia 39: Linia 39:


[[grafika:diagramProcesuLoglan.png|struktura węzła]]
[[grafika:diagramProcesuLoglan.png|struktura węzła]]
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 '''new'''MojProces(...).
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 '''new'''MojProces(...).


Po zakonczeniu wykonywania instrukcji konstruktora proces przechodzi w stan PASYWNY z MASKą pustą. Zmienna ''x'' typu MojProces może zapamiętać wartość wyrażenia.
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ę  
Uruchomienie (lub wznowienie) wątku wymaga, by ''inny'' proces, posiadający zmienną ''x'' wskazującą na nasz proces, wykonał instrukcję  
resume(''x'')
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.
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.
Linia 60: Linia 60:
Wykonanie instrukcji  
Wykonanie instrukcji  
'''accept''' metoda3, metoda2;
'''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.
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
Wykonanie instrukcji
Linia 79: Linia 79:
proces wywołujący ''y'':                       
proces wywołujący ''y'':                       
   oblicz parametry aktualne                     
   oblicz parametry aktualne                     
   sprawdź czy proces x istnieje
   sprawdź, czy proces x istnieje
       jeśli NIE to czekaj
       jeśli NIE, to czekaj
       jeśli TAK to sprawdź czy proces x jest aktywny
       jeśli TAK, to sprawdź, czy proces x jest aktywny
                               jeśli NIE to czekaj
                               jeśli NIE, to czekaj
                               jeśli TAK to sprawdź czy TaMetoda jest w masce
                               jeśli TAK, to sprawdź, czy TaMetoda jest w masce
                                     jeśli NIE to czekaj
                                     jeśli NIE, to czekaj
                                     jeśli TAK to przekaż parametry procesowi x
                                     jeśli TAK, to przekaż parametry procesowi x
                                                 oczekuj na podpowiedź;
                                                 oczekuj na podpowiedź;
                                                 odbierz wyniki;
                                                 odbierz wyniki;
Linia 91: Linia 91:


proces ''x'':
proces ''x'':
         wykonuj swoje instrukcje; po każdej z nich (przy ;) sprawdzaj czy inny proces  
         wykonuj swoje instrukcje; po każdej z nich (przy ;) sprawdzaj, czy inny proces  
               nie wzywa do wykonania twojej ''otwartej'' (ang. ''enabled'') metody;
               nie wzywa do wykonania twojej ''otwartej'' (ang. ''enabled'') metody;
           jeśli TAK to zapisz MASKę na stos;
           jeśli TAK, to zapisz MASKę na stos;
                         wyzeruj MASKę;
                         wyzeruj MASKę;
                         wykonaj wzywaną metodę z otrzymanymi od innego procesu parametrami;
                         wykonaj wzywaną metodę z otrzymanymi od innego procesu parametrami;
Linia 101: Linia 101:
                         '''return disable''' M,N '''enable''' M',N', P';  
                         '''return disable''' M,N '''enable''' M',N', P';  
                         kończącą wykonywanie wezwanej metody;
                         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ń.  
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'' wykonujący 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;
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.
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ększają maskę na czas wykonywania instrukcji accept. Oznacza to, że instrukcja accept ''oczekuje'' na wywołanie metody znajdującej się w masce aktualnego procesu.


= Opis realizacji mechanizmu obcego wołania metod =
= Opis realizacji mechanizmu obcego wołania metod =
Linia 111: Linia 111:
=== Sieciowe wskaźniki  do obiektów procesów ===
=== Sieciowe wskaźniki  do obiektów procesów ===


Wskaźnik do obiektu-procesu ma udostępniac obiekt aktywny, który być może jest umieszczony na odległym komputerze lub być może znajduje sie na tej samej maszynie wirtualnej. Przyjęto, ze globalny wskażnik do procesu ma trzy pola:
Wskaźnik do obiektu-procesu ma udostępniać obiekt aktywny, który być może jest umieszczony na odległym komputerze, lub być może znajduje sie na tej samej maszynie wirtualnej. Przyjęto, że globalny wskaźnik do procesu ma trzy pola:


- nr węzła (tj. nr maszyny wirtualnej) w sieci,
- nr węzła (tj. nr maszyny wirtualnej) w sieci,
Linia 117: Linia 117:
- nr procesu w węźle,
- nr procesu w węźle,


- licznik, służący do wykrywania wskażników do procesów martwych (istotne dla celów kompaktyfikacji i odśmiecania).
- licznik służący do wykrywania wskażników do procesów martwych (istotne dla celów kompaktyfikacji i odśmiecania).


=== Struktury ===
=== Struktury ===
Linia 123: Linia 123:
Pamięć procesów
Pamięć procesów


Każdy proces jest traktowany jako proces rozproszony, nawet wtedy gdy działa współbieżnie z innymi na tej samej maszynie wirtualnej. Tak więc każdy proces posiada własną pamięc w postaci tablicy M jednowskaźnikowej. Nazwa tej tablicy jest umieszczona w deskryptorze procesu. w tablicy M zapisywane są: kod programu, statyczne struktury danych maszyny wirtualnej, sterta obiektów oraz tablica H adresów wirtualnych.
Każdy proces jest traktowany jako proces rozproszony nawet wtedy, gdy działa współbieżnie z innymi na tej samej maszynie wirtualnej. Każdy proces posiada więc własną pamięć w postaci tablicy M jednowskaźnikowej. Nazwa tej tablicy jest umieszczona w deskryptorze procesu. W tablicy M zapisywane są: kod programu, statyczne struktury danych maszyny wirtualnej, sterta obiektów oraz tablica H adresów wirtualnych.


Deskryptory procesów
Deskryptory procesów
Linia 131: Linia 131:
Kolejka procesów gotowych - AKTYWNYCH
Kolejka procesów gotowych - AKTYWNYCH


Procesy, które nie sa PASYWNE (po wykonaniu instrukcji ''stop''), ani oczekujące na obce wywołanie metody (po wykonaniu instrukcji ''accept'') są zapisane do kolejki procesów gotowych. Pierwszy element tej kolejki to proces aktualnie wykonywany.  
Procesy, które nie PASYWNE (po wykonaniu instrukcji ''stop'') ani oczekujące na obce wywołanie metody (po wykonaniu instrukcji ''accept''), są zapisane do kolejki procesów gotowych. Pierwszy element tej kolejki to proces aktualnie wykonywany.  
Zmienna thispix zawiera idetyfikator procesu wykonywanego bieżąco, zmienna thisp zawiera deskryptor bieżącego procesu.
Zmienna thispix zawiera idetyfikator procesu wykonywanego bieżąco, zmienna thisp zawiera deskryptor bieżącego procesu.


Linia 196: Linia 196:
Poniżej przytaczam opis eksperymentalnej realizacji.
Poniżej przytaczam opis eksperymentalnej realizacji.
Każda loglanowska maszyna wirtualna VLP zainstalowana w sieci, niekoniecznie lokalnej, posiada swój numer identyfikacyjny 0<nr<256. Numery te powinny różnić sie między sobą.  
Każda loglanowska maszyna wirtualna VLP zainstalowana w sieci, niekoniecznie lokalnej, posiada swój numer identyfikacyjny 0<nr<256. Numery te powinny różnić sie między sobą.  
Maszyna wirtualna '''A''' może dołączyć do innej(innych) maszyn wirtualnych. W tym celu jej operator powinien wykonać polecenie
Maszyna wirtualna '''A''' może dołączyć do innej (innych) maszyn wirtualnych. W tym celu jej operator powinien wykonać polecenie
  - Machine -> Connect  
  - Machine -> Connect  
  - wskazać IP lub URL maszyny wirtualnej '''B''' do której chce dołączyć
  - wskazać IP lub URL maszyny wirtualnej '''B''' do której chce dołączyć

Wersja z 09:39, 29 wrz 2006

autor: Andrzej Salwicki (salwicki@mimuw.edu.pl)

Realizacja obiektów aktywnych (wątków, procesów) w jezyku z procesami współbieżnymi i rozproszonymi

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.

Obiekty aktywne (alias procesy albo wątki) są 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ą).

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 zadania (ang. task) są wątkami współbieżnymi. Istnieje rozszerzenie o nazwie GLADE, które pozwala kompilatorowi "gnat" języka ADA z rodziny kompilatorów gcc (GNU C compiler) tłumaczyć i wykonywać programy w środowisku rozproszonym. A więc mamy sytuację podobną do tej w Javie.


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 podklas klasy Thread. Procesy rozproszone wymagają użycia mechanizmu [RMI]link RMI. Trzeba więc zapoznać się z dwoma odrębnymi 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.

struktura węzła 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 wykonujący 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ększają maskę na czas wykonywania instrukcji accept. Oznacza to, że instrukcja accept oczekuje na wywołanie metody znajdującej się w masce aktualnego procesu.

Opis realizacji mechanizmu obcego wołania metod

Poniżej opisujemy realizację zaproponowaną przez Bolesława Ciesielskiego w 1988.

Sieciowe wskaźniki do obiektów procesów

Wskaźnik do obiektu-procesu ma udostępniać obiekt aktywny, który być może jest umieszczony na odległym komputerze, lub być może znajduje sie na tej samej maszynie wirtualnej. Przyjęto, że globalny wskaźnik do procesu ma trzy pola:

- nr węzła (tj. nr maszyny wirtualnej) w sieci,

- nr procesu w węźle,

- licznik służący do wykrywania wskażników do procesów martwych (istotne dla celów kompaktyfikacji i odśmiecania).

Struktury

Pamięć procesów

Każdy proces jest traktowany jako proces rozproszony nawet wtedy, gdy działa współbieżnie z innymi na tej samej maszynie wirtualnej. Każdy proces posiada więc własną pamięć w postaci tablicy M jednowskaźnikowej. Nazwa tej tablicy jest umieszczona w deskryptorze procesu. W tablicy M zapisywane są: kod programu, statyczne struktury danych maszyny wirtualnej, sterta obiektów oraz tablica H adresów wirtualnych.

Deskryptory procesów

Deskryptor procesu jest rekordem zawierajacym pewne globalne struktury danych maszyny wirtualnej - właściwe dla danego procesu. Globalna tablica deskryptorów procesów jest zadeklarowana statycznie (w obecnej eksprymantalnej wersji ma ona 64 elementy). Czyli nr procesu mieści sie w jednym bajcie (por. wskaźnik do procesu).

Kolejka procesów gotowych - AKTYWNYCH

Procesy, które nie są PASYWNE (po wykonaniu instrukcji stop) ani oczekujące na obce wywołanie metody (po wykonaniu instrukcji accept), są zapisane do kolejki procesów gotowych. Pierwszy element tej kolejki to proces aktualnie wykonywany. Zmienna thispix zawiera idetyfikator procesu wykonywanego bieżąco, zmienna thisp zawiera deskryptor bieżącego procesu.


Komunikaty


Globalna kolejka komunikatów

Stos masek metod

Algorytmy

Inicjowanie maszyny wirtualnej

Zarządzanie procesami

  Generowanie procesu
  Powrót z generacji procesu

  Zakończenie procesu
  Usuwanie procesu

podział czasu

Obce wołanie metod

  Rozpoczęcie 
  Instrukcja accept
  Operacje na maskach metod
  Obsługa błędów

Wysyłanie komunikatu


Zestaw poleceń dotyczących procesów

x := new MojProces(...)

resume(x)

/* call */ x.Metoda(...0

enable

disable

accept

return disable ... enable ...

stop

TODO narysować diagram stanów procesu


Łączenie maszyn wirtualnych w wieloprocesorową wirtualną maszynę wirtualną

Poniżej przytaczam opis eksperymentalnej realizacji. Każda loglanowska maszyna wirtualna VLP zainstalowana w sieci, niekoniecznie lokalnej, posiada swój numer identyfikacyjny 0<nr<256. Numery te powinny różnić sie między sobą. Maszyna wirtualna A może dołączyć do innej (innych) maszyn wirtualnych. W tym celu jej operator powinien wykonać polecenie

- Machine -> Connect 
- wskazać IP lub URL maszyny wirtualnej B do której chce dołączyć
- zatwierdzić

Od tej pory maszyny połączone z maszyną B tworzą razem z maszyną A jedną wieloprocesorową sieciową maszynę wirtualną A + B.

Od tego momentu aż do momentu wykonania polecenia Disconnect ... Maszyna wirtualna