01

01



1

Komunikacja między procesami w Unixle

Ćwiczenie 8-8

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?

Ćwiczenie 8-9

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.

8.6. Podsumowanie

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.

Zdalne wywoływanie procedur (RPC)


9.1. Wprowadzenie

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


Wyszukiwarka

Podobne podstrony:
Komunikacja między procesami w Unixle Plik hello. h utworzony przez rpcgen będzie włączany do kodu p
Komunikacja między procesami w Unixle łinclude "hello.h*    /* wygenerowany prze
Komunikacja między procesami w Unixie morpheus % factclient morpheus Program do wyliczania silni&nbs
Komunikacja między procesami w UninieProgram 9.2. Prosty program w C wyświetlający krótki tekst /* *
image001 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeby wł
8 (1364) 44 Aplikacje w Delphi. Przykłady Wynik działania programu przedstawiono na rysunku 3.6. Moż
Wymagania jakościowe 1 Programy, jako wynik działalności programistycznej, powinny spełniać
DSC00273 (6) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
DSC00277 (9) 6. Uzupełnić tabelę nazwami mechanizmów komunikacji między procesami w taki sposób, żeb
Obraz (224) czy tez istnieje nieprzekraczalna granica między dobrem a złem? Czy projekt działania „d
Komunikacja między procesami w Unixie_ ■    Jeżeli klient wysunie kilka identycznych
Komunikacja między procesami w Unixie powinno się używać w odniesieniu do poleceń, które nie prowadz
Komunikacja między procesami w Unlxle Funkcja rexec wymaga sześciu argumentów. Pierwszym jest wskaźn
Komunikacja między procesami w Unixiedo naszych badań wybierzemy tylko nieliczne. Zestawienie argume
Komunikacja między procesami w Unixie i argv. W sekcji deklaracyjnej klienta rezerwowane jest miejsc
Komunikacja między procesami w Uninie Semantyka i zastosowania pliku netconfig wykraczają poza ramy
Komunikacja między procesami w Unixie Jeżeli proces zostanie uruchomiony lokalnie, zostanie również
Komunikacja między procesami w Unixie int * print_hello_l(void *argp, CLIENT *clnt) { static int

więcej podobnych podstron