Sr-2-wyk-1.0-Slajd14

From Studia Informatyczne

Problem przekazania parametrów

Problem przekazania parametrów


Na rysunku ukazano stos procesu, który wywołuje lokalną procedurę. Za przykład weźmy wywołanie add w języku C, obliczające sumę dwóch liczb całkowitych, i oraz j. Jeśli wywołanie nastąpi w programie głównym, na krótko przed wywołaniem stos wygląda tak, jak ukazuje lewa część rysunku. Aby wykonać funkcję, program odkłada wartości parametrów na stosie, począwszy od skrajnie prawego (takie rozwiązanie przyjęto dla języka C). Po wykonaniu add, wynik zostaje zapisany w rejestrze, adres powrotu jest usuwany ze stosu, a sterowanie powraca do programu głównego. Następnie program główny usuwa parametry ze stosu, przywracając go do postaci, którą miał przed wywołaniem.

Dla przykładu, w języku C parametry przekazywane są przez wartość (call-by-value ) lub przez wskaźnik/odniesienie (call-by-reference ). Przekazanie przez wartość polega na utworzeniu kopii wartości parametru na stosie, a przekazanie przez wskaźnik odbywa się przez zapisanie na stosie adresu w pamięci , przeznaczonego na przechowanie wartości parametru. W języku C wartości typów prostych przekazywane są zawsze przez wartość, a wartości typów tablicowych – przez wskaźnik.

Powstaje problem, jak przekazywać parametry zdalnej procedurze. Przekazanie parametrów typów prostych odbywa się przez kopię. Pieniek klienta umieszcza wartość parametru w komunikacie sieciowym, wysyłanym do zdalnej procedury, a pieniek serwera ją później odtwarza. Wszystko to musi się po obydwu stronach odbywać zgodnie z ustalonym wcześniej protokołem przetwarzania wywołania do- i z wiadomości sieciowej.

Przekazywanie parametrów typów tablicowych o znanych rozmiarach w zasadzie odbywa się podobnie, z tym, przekazanie kopii następuje tutaj dwukrotnie. W pierwszej kolejności kopia wartości elementów tablicy jest przesyłana do pieńka serwera. Później, po wykonaniu procedury, pieniek serwera odsyła klientowi kopię tablicy, zawierającej ewentualne zmiany wprowadzone przez procedurę. Jest to technika znana pod angielską nazwą copy-restore . Dla parametrów o charakterze wyłącznie wejściowym lub wyłącznie wyjściowym można ją optymalizować, rezygnując z przesłania kopii w jedną stronę.

Dużo bardziej skomplikowane jest przekazywanie wartości złożonych typów danych, których rozmiar nie jest znany. Niektóre systemy próbują rozwiązać ten problem, wymagając od programisty dostarczenia dodatkowych procedur do przekazania takich parametrów.

Drugi problem bierze się z faktu, że w różnych architekturach maszyn stosuje się różne reprezentacje elementarnych typów danych. Rozwiązanie polega najczęściej na wprowadzeniu zewnętrznej , uniwersalnej reprezentacji, do której muszą się dostosować obie komunikujące się strony.


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