1
Komunikacja między procesami w Unixle
Czy wynik działania programu 8.6 pozostanie taki sam, jeśli znacznik MAP_SHA-RED zastąpi się w nim znacznikiem MAP_PRTVATE? Dlaczego? Dlaczego nie? Czy wynikowy plik testowy będzie zawierał wtedy gwiazdki czy pierwotny tekst? Dlaczego? Dlaczego nie? Z jakiej przyczyny ustawienie MAPJSHARED jest przekazywane funkcjami fork, a nie jest przekazywane funkq'ami exec?
Co się będzie działo, jeżeli odwzorowanie zostanie umieszczone we współużytkowanym systemie plików? Czy można użyć odwzorowanego w ten sposób obszaru pamięci jako medium wymiany informaqi między procesami działającymi w różnych stacjach roboczych? Uzasadnij swoją odpowiedź napisanym przez siebie programem.
Pamięć wspólna zapewnia użytkownikowi efektywny sposób komunikacji poprzez dane zapisane w określonym miejscu pamięci. Dane te są dostępne swobodnie, inaczej niż w przypadku potoków, które zapewniają jedynie sekwencyjny sposób dostępu. Aby zapobiec niespójnościom, stosuje się semafory koordynujące dostęp do segmentów pamięci wspólnej. Segmenty pamięci wspólnej w systemach opartych na Systemie V należy tworzyć za pomocą wywołania systemowego shmget. Funkcja shmget pozwala procesowi uzyskać dostęp do istniejącego segmentu pamięci wspólnej. Funkcja shmctl dostarcza informacji o stanie segmentu pamięci wspólnej, pozwala określić uprawnienia do niego oraz go usunąć. Wywołania systemowe shmat i shmdt są używane do tworzenia dowiązań (odwzorowywania segmentu w przestrzeń adresową procesu) i usuwania ich. Wywołanie systemowe mmap może być używane do odwzorowywania obszaru pamięci wirtualnej procesu do pliku. Ponieważ pliki pozostają w systemie również po zakończeniu procesu, w którym są tworzone, odwzorowania do plików mogą służyć za środek wymiany informacji między procesami działającymi w różnym czasie. Na ogół technika oparta na funkcji mmap jest mniej złożona i bardziej przenośna niż metody stosowane w Systemie V i jego descendentach.
Przykłady, nad którymi pracowaliśmy do tej pory, były uruchamiane na jednej stacji roboczej lub na pojedynczym hośde. Jednak stopniowo, wraz z powiększaniem się naszej wiedzy na temat technik komunikacji między procesami, będziemy sięgać po rozwiązania, które pozwalają procesom działającym na różnych stacjach roboczych wymieniać informacje. Mogą one funkcjonować w jednej sieci lokalnej lub w komputerach połączonych siecią większą, rozległą. W środowisku sieciowym systemu Unix istnieje kilka sposobów implementowania takiego typu komunikacji. W tym rozdziale zajmiemy się technikami zdalnego wykonywania procedur (RPC)'. Z punktu widzenia interfejsu programistycznego RPC przypomina standardowe, lokalne wywołania procedur (funkcji). Proces-klient (ten, który wysuwa żądanie) uruchamia lokalną procedurę, zwaną popularnie procedurą wejścia klienta (ang. Client stub), która zawiera szczegółowe rozwiązania komunikacyjne oraz faktyczne wywołanie zdalnej procedury. Proces-serwer (ten, któiy odpowiada na żądanie) ma podobną procedurę wejścia (ang. serwer stub) z szczegółowymi rozwiązaniami komunikacyjnymi. Ani klient, ani serwer nie musi znać sieciowych protokołów transportowych — struktur niższego poziomu, na których odbywa się komunikacja. Procedury wejścia są najczęściej tworzone za pomocą kompilatora protokołów, takiego jak rpcgen firmy Sun Microsystems. Do kompilatora protokołów przekazuje się plik z definicją protokołu, napisany w języku podobnym do C. Język używany przez rpcgen nazywa się po prostu RPC (Remote Procedurę Cali). Plik z definicją protokołu, jak wskazuje na to jego nazwa, zawiera definicję zdalnej procedury, czyli jej nazwę, parametry z typami danych oraz typ zwracanej wartości.
Klient po wywołaniu RPC (wysunięciu żądania) czeka na odpowiedź serwera, dlatego należy uwzględnić następujące elementy:
■ Jak długo klient powinien czekać na odpowiedź serwera? Przecież serwer może być bardzo zajęty albo w ogóle wyłączony. Na ogół sprawę rozwiązuje określenie maksymalnego dozwolonego czasu, którego przekroczenie powoduje przerwanie oczekiwania.
1 Słowo zdalny w RPC może być nieco mylące, ponieważ jest synonimem wyrazu odległy, a system RPC często bywa wykorzystywany przez procesy uruchomione w tym samym systemie (zwłaszcza podczas eliminowania błędów z procedur RPC).
245