Programowanie Współbieżne. Komunikacja między procesowa IPC

Podobne dokumenty
Mechanizmy z grupy IPC

IPC: Kolejki komunikatów

Temat zajęć: Mechanizmy IPC: kolejki komunikatów.

KOLEJKI KOMUNIKATÓW IPC

Mechanizmy z grupy IPC

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Shared memory and messages. Functions. process 0. process 1. program 0. program 0. data 0. data 1. program 1. data 0. data 1.

Pamięć współdzielona

1. Utwórz blok pamięci współdzielonej korzystając z poniższego kodu:

Programowanie Współbieżne. W Linuxie/Unixie

Instytut Teleinformatyki

problemu producenta i konsumenta z ograniczonym buforem cyklicznym. Wszystkie funkcje dotyczace

Krótki kurs programowania współbieżnego (2)

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

METODY I JĘZYKI PROGRAMOWANIA PROGRAMOWANIE STRUKTURALNE. Wykład 02

Semafory, pamięć dzielona i kolejki komunikatów

Semafory w systemie Unix

Temat zajęć: Mechanizmy IPC: semafory

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

Kolejki komunikatów POSIX

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

Kolejki FIFO (łącza nazwane)

Laboratorium z systemów operacyjnych. System plików - funkcje systemowe. Anna Wojak

J. Ułasiewicz Programowanie aplikacji współbieżnych 1

Funkcje jadra systemu operacyjnego UNIX

Poniższe funkcje opisane są w 2 i 3 części pomocy systemowej.

Instrukcja do laboratorium Systemów Operacyjnych. (semestr drugi)

Funkcje jadra systemu operacyjnego UNIX

Semafor ustaw_semafor(key_t nazwa, int start); Semafor usun_semafor(semafor sem); void signal(semafor sem); void wait(semafor sem);

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

RPC. Zdalne wywoływanie procedur (ang. Remote Procedure Calls )

1. Kolejki komunikatów POSIX

Aplikacja Sieciowa wątki po stronie klienta

Laboratorium Systemów Operacyjnych. Ćwiczenie 4. Operacje na plikach

Zdalne wywołanie procedur. Krzysztof Banaś Systemy rozproszone 1

Programowanie Współbieżne

1. Wartość, jaką odczytuje się z obszaru przydzielonego obiektowi to: a) I - wartość b) definicja obiektu c) typ oboektu d) p - wartość

13. Kolejki komunikatów POSIX

Pamięć dzielona i kolejki komunikatów

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

Mechanizmy pracy równoległej. Jarosław Kuchta

Systemy Operacyjne - Operacje na plikach

Typy złożone. Struktury, pola bitowe i unie. Programowanie Proceduralne 1

Programowanie równoległe w POSIX API. PRiR, wykład 3

Program dla praktyki lekarskiej

Pliki. Informacje ogólne. Obsługa plików w języku C

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

Biblioteka standardowa - operacje wejścia/wyjścia

ROZPROSZONE SYSTEMY OPERACYJNE. Niezawodne usługi w rozwiązaniach SSI dokumentacja projektu. Karol Ostrowski 16 czerwca 2005

Klient-Serwer Komunikacja przy pomocy gniazd

Struktury. Przykład W8_1

Podstawy programowania skrót z wykładów:

1. Kolejki komunikatów POSIX

3. Identyfikacja. SKŁADNIA #include <sys/socket.h> int getpeername(int socket, struct sockaddr *addr, int *addrlen);

Programowanie w Sieci Internet Blok 2 - PHP. Kraków, 09 listopada 2012 mgr Piotr Rytko Wydział Matematyki i Informatyki

Futex (Fast Userspace Mutex) Łukasz Białek

76.Struktura oprogramowania rozproszonego.

ezykach wysokiego poziomu (Dijkstra, 1965). semaphore semaphore S; Operacje na semaforze:

Mechanizmy stosowane w systemach operacyjnych - system dydaktyczny

Zdalne wywołania procedur. Jarosław Kuchta Programowanie Współbieżne

5. Model komunikujących się procesów, komunikaty

1 Timery i zdarzenia

Język ludzki kod maszynowy

Programowanie Współbieżne. W Linuxie/Unixie

Tablice i struktury. czyli złożone typy danych. Programowanie Proceduralne 1

Łącza nienazwane(potoki)

Programowanie równoległe i rozproszone. Monitory i zmienne warunku. Krzysztof Banaś Programowanie równoległe i rozproszone 1

Java - tablice, konstruktory, dziedziczenie i hermetyzacja

Systemy Operacyjne 1 Laboratorium 3 Potoki i łącza nazwane w Linuksie (jeden tydzień) dr inż. Arkadiusz Chrobot

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Tablice (jedno i wielowymiarowe), łańcuchy znaków

Programowanie w języku C++

Lekcja 10. Uprawnienia. Dołączanie plików przy pomocy funkcji include() Sprawdzanie, czy plik istnieje przy pmocy funkcji file_exists()

Programowanie Proceduralne

Programowanie przy użyciu gniazdek

Wstęp do wiadomości teoretycznych (nie, nie jest to masło maślane ani wstęp, wstępów proszę cierpliwie czytać)

SUMA KONTROLNA (icmp_cksum) NUMER KOLEJNY (icmp_seq)

KURS C/C++ WYKŁAD 6. Wskaźniki

Szablony klas, zastosowanie szablonów w programach

Pliki w C/C++ Przykłady na podstawie materiałów dr T. Jeleniewskiego

Obsługa plików. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 25 września 2011

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

Kompilator języka C na procesor 8051 RC51 implementacja

Algorytmy i złożoności. Wykład 3. Listy jednokierunkowe

Metody zawarte w klasie File: boolean createnewfile() tworzy nowy, pusty plik, ale tylko jeśli on wcześniej nie istniał. boolean delete() usuwa dany

Linux Kernel III. Character devices

Programowanie współbieżne i rozproszone

KOLEJKA (QUEUE) (lista fifo first in, first out)

Wstęp do programowania INP001213Wcl rok akademicki 2017/18 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

2 Implementacja w systemie Linux 2.4

Podstawy programowania w języku C++

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 8. Karol Tarnowski A-1 p.

Programowanie proceduralne INP001210WL rok akademicki 2018/19 semestr letni. Wykład 6. Karol Tarnowski A-1 p.

public: // interfejs private: // implementacja // składowe klasy protected: // póki nie będziemy dziedziczyć, // to pole nas nie interesuje

Temat zajęć: Obsługa systemu plików.

Warstwy oprogramowania wejścia/wyjścia

Transkrypt:

Programowanie Współbieżne Komunikacja między procesowa IPC

IPC W systemie V są 3 rodzaje komunikacji między procesowej. kolejki komunikatów semafory pamięć wspólna

IPC plik nagłówkowy funkcja systemowa tworzenia lub otwierania funkcja systemowa operacji sterujących funkcje systemowe przesyłania Kolejka komunikatów <sys/msg.h> Semafor Pamięć wspólna <sys/sem.h> <sys/shm.h> msgget semget shmget msgctl semctl shmctl msgsnd semop shmat msgrcv shmdt

IPC Jądro trzyma informacje na temat każdego kanału komunikacji międzyprocesowej w strukturze: #include <sys/ipc.h> struct ipc_perm { ushort uid; /* id użytkownika dla właściciela */ ushort gid; /* id grupy dla właściciela */ ushort cuid; /* id użytkownika dla twórcy */ ushort cgid; /* id grupy dla twórcy */ ushort mode; /* tryb dostępu */ ushort seq; /* numer koleiny */ key_t key; /* klucz */ }

IPC Do pobierania wartości tej struktury służą funkcje msgctl, semctl oraz shmctl Wszystkie trzy funkcje do tworzenia kanału komunikacji IPC msgget, semget oraz shmget pobierają klucz key_t a zwracają identyfikator kanału.

IPC Wszystkie też mają argument flag, którego 9 najmniej znaczących bitów określa tryb dostępu do kanału pozostałe określają czy ma być utworzony kanał czy nie itp. jeżeli argument key ma wartość IPC_PRIVATE to będzie utworzony prywatny kanał komunikacji międzyprocesowej. Nie istnieje taka kombinacja ścieżki i identyfikatora by ftok wygenerowało IPC_PRIVATE IPC_CREAT w argumencie flag spowoduje utworzenie nowego elementu w tablicy systemowej w jądrze jeżeli jest brak, jeżeli już jest to będzie przekazany on jako wartość zwrotna. jeżeli flag ma IPC_CREAT + IPC_EXCL uda się utworzenie kanału tylko wtedy gdy go nie było jeżeli był to funkcja zwróci błąd. IPC_EXCL w tym przypadku jest tylko do tworzenia przy korzystaniu już nie obowiązuje i inni mogą używać zgodnie z prawami dostępu. IPC_EXCL bez IPC_CREAT nie ma znaczenia

START Key== IPC_PRIVATE? NIE Czy obiekt istniał wcześniej? NIE Czy są Czy TAK ustawione flagi NIE zagwarantowane TAK IPC_CREAT i prawa dostępu? OK IPC_EXCL? zwróć ID TAK NIE NIE TAK Przepełnienie tablic systemowych TAK Czy jest ustawiona flaga IPC_CREATE? NIE Zwróć błąd errno = EEXIST Zwróć błąd errno = EACCESS Ok, utwórz nowy obiekt i zwróć ID TAK Zwróć błąd errno = ENOENT Zwróć błąd errno = ENOSPC Tworzymy nowy obiekt Korzystamy z istniejącego obiektu 7

IPC podczas tworzenia 9 najmłodszych bitów argumentu flag inicjuje pole ipc_perm cuid, cgid, uid i gid przejmują obowiązujące identyfikatory użytkownika i grupy dla procesu wywołującego funkcję. identyfikatory twórcy kanału nigdy się nie zmieniają (cuid i cgid) identyfikatory właściciela mogą ulec zmianie przez odpowiednie zawołanie funkcji msgctl, semctl lub shmctl *ctl służą także do zmiany praw dostępu każda operacja na kanałach IPC (zapis, odczyt) powoduje sprawdzanie podobne do sprawdzania praw dostępu w systemie plików

IPC sprawdzanie odbywa się na podstawie pola ipc_perm Proces nadzorcy ma zawsze przyznane prawa dostępu jeżeli uid lub cuid oraz odpowiedni bit prawa dostępu się zgadza, to proces ma przyznane prawo dostępu. jeżeli gid lub cgid się zgadzają oraz odpowiedni bit prawa dostępu, to proces ma przyznane to prawo dostępu jeżeli powyższe się nie powiodą do odpowiedni bit prawa dostępu dla innych musi być ustawiony

wszystkie komunikaty są pamiętane w jądrze systemu i mają przypisany identyfikator kolejki komunikatów (message queue identyfier) msqid identyfikuje konkretną kolejkę komunikatów procesy czytają i piszą do dowolnych kolejek komunikatów nie wymaga się by jeden proces czekał już na pojawienie się komunikatu zanim drugi zacznie pisać proces może umieścić komunikat w kolejce i zakończyć swoje działanie. każdy komunikat w kolejce ma następujące atrybuty typ liczba całkowita typu long długość porcji danych, może być 0 dane jeżeli długość jest większa niż 0

Dla kolejki komunikatów jądro utrzymuje taką strukturę #include <sys/types.h> #include <sys/ipc.h> struct msqid_ds. { struct ipc_perms msg_perms; /* struktura praw dostępu dla operacji */ struct msg *msg_first; /* wskaźnik do 1 komunikatu w kolejce */ struct msg *msg_last; /* wskaźnik do ostatniego komunikatu w kolejce */ ushort msg cbytes; /*bieżąca liczba bajtów w kolejce */ ushort msg_gnum; /* bieżąca liczba komunikatów w kolejce */ ushort msg_gbytes; /* maksymalna liczba bajtów dla kolejki */ ushort msg_lspid; /* identyfikator procesu który ostatnio pisał coś do kolejki */ ushort msg_lrpid; /* identyfikator procesu, który ostatnio wywołał msgrcv */ time_t msg_strime; /* czas ostatniego wywołania funkcji msgsnd */ time_t msg_rtime; /* czas ostatniego wywołania funkcji msgrcv */ time_t msg_ctime /* czas ostatniego wywołania funkcji msgctl która zmieniła wartość powyższych pól */ };

Przypuśćmy, że w kolejce mamy trzy komunikaty o długości 1,2,3 bajty typach 100,200,300 i w tej tez kolejności nadeszły to: struktura msg_perm msg_first msg_last... dowiązanie typ = 100 długość = 1 1 bajt danych dowiązanie typ = 200 długość = 2 2 bajt danych NULL typ = 300 długość = 3 3 bajt danych msg_ctime

Do tworzenia służy msgget #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgget (key_t key, int msgflag); funkcja zwróci id kolejki lub 1 gdy się nie powiedzie

msgflag określa prawa dostępu: Wartość liczbowa stała symboliczna znaczenie 0400 MSG_R czytanie dla właściciela 0200 MSG_W pisanie dla właściciela 0040 MSG_R >> 3 czytanie dla grupy 0020 MSG_W >> 3 pisanie dla grupy 0004 MSG_R >> 6 czytanie dla innych 0002 MSG_W >> 6 pisanie dla innych 1000 IPC_CREAT 2000 IPC_EXCL 4000 IPC_NOWAIT

Do umieszczenia komunikatu w kolejce służy: #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> int msgsnd(int msqid, struct msgbuf *ptr, int length, int flag); lenhgth określa długość komunikatu w bajtach jest to liczba bajtów danych zdefiniowanych przez użytkownika, czyli te po polu long, może być też 0. flag może przyjąć stałą symboliczną IPC_NOWAIT lub 0. jeżeli będzie IPC_NOWAIT to gdy kolejka jest pełna lub jest zbyt wiele komunikatów w całym systemie to funkcja zwróci natychmiast 1 a errno = EAGAIN. gdy msgsnd zakończymy sukcesem dostaniemy zwrotne 0.

ptr jest wskaźnikiem do struktury o następującym wzorcu struct msgbuf { long mtype; /* typ komunikatu */ char *mtext; /* dane komunikatu */ } mtext jest mylący bo mogą tam być różne dane przez wzorzec rozumiemy że ptr musi wskazywać na liczbę całkowitą typu long która zawiera typ komunikatu i poprzedza sam komunikat (o ile długość > 0) jądro nie interpretuje treści komunikatu można zdefiniować własną strukturę np. typedef struct my_msgbuf { long mtype; short mshort; /*dowolność */ char mchar[8]; /* dowolność */ } Message;

Do odbioru służy Kolejki Komunikatów IPC int msgrcv(int msqid, struct msgbuf *ptr, int length, long msgtype, int flag); ptr wskazuje gdzie ma być zapisany komunikat length rozmiar danych ptr a msgtype określa pożądany przez odbiorcę komunikat 0 oznacza pierwszy który wszedł do kolejki (zasada FIFO) >0 pierwszy komunikat którego typ jest taki sam <0 pierwszy komunikat z najmniejszych typów które nie są większe niż wartość bezwzględna msgtype.

Dla przykładowej kolejki z typami 100L, 200L i 300L mamy Argument msgtype Typ przekazanego komunikatu 0L 100L 100L 100L 200L 200L 300L 300L -100L 100L -200L 100L -300L 100L

flag określa co należy zrobić gdy w kolejce brak komunikatów gdy ustawiony IPC_NOWAIT wtedy natychmiast wracamy, funkcja zwraca 1 i errno = ENOMSG jeżeli nie ma IPC_NOWAIT to proces czeka aż nastąpi jedno z 3 zdarzeń będzie można otrzymać komunikat żądanego typu kolejka komunikatów zostanie usunięta z systemu. proces przechwyci odpowiedni sygnał jeżeli flag ma MSG_NOERROR to jeśli otrzymamy więcej danych niż wskazaliśmy przez length to nadmiar będzie pominięty a funkcja nie wykaże błędu

Do sterowania kolejką komunikatów służy int msgctl(int msqid, int cmd, struct msqid_ds. *buff); gdy cmd jest: IPC_RMID 0 usunięcie kolejki IPC_SET 1 ustawia na podstawie buff IPC_STAT 2 pobiera pobiera do buff

/* msgq.h */ #include <sys/types.h> #include <sys/ipc.h> #include <sys/msg.h> #include <sys/errno.h> extern int errno; #define MKEY1 1234L #define MKEY2 2345L #define PERMS 0666 Klient serwer.

#include msgq.h Kolejki Komunikatów IPC main() //dla serwera { int readid, writeid; if ((readid = msgget(mkey1,perms IPC_CEAT))<0) perror( serwer: nie mogę otworzyć kolejki 1 ); if ((writeid = msgget(mkey2, PERMS IPC_CREAT)) <0) perror( serwer: nie mogę otworzyć kolejki 2 ); serwer(readid, writeid); exit(0); }

#include msgq.h Kolejki Komunikatów IPC main()//dla klienta { int readid, writeid; if ((writeid = msgget(mkey1,0))<0) perror( klient: nie mogę otworzyć kolejki 1 ); if ((readid = msgget(mkey2,0)) < 0) perror( klient: nie mogę otworzyć kolejki 2 ); client(readid, writeid); /* usuwamy kolejki */ if (msgctl(readid, IPC_RMID,(struct msqid_ds*)0) <0) perror( klient: nie mogę usunąć kolejki 1 ); if (msgctl(writeid,ipc_rmid, NULL) < 0) perror( klient: nie mogę usunąć kolejki 2 ); exit(0); }

#include mesgq.h void mesg_send(int id, Mesg *mesgptr) { if (msgsnd(id, (char*)&(mesgptr->mesg_type), mesgptr->mesg_len,0)!=0) perror( błąd wysyłania komunikatu ); } int mesg_recv(int id, Mesg *mesgptr) {int n; n = msgrcv(id, (char*) &mesgptr->mesg_type), MAXMESGDATA, mesgptr->mesg_type, 0); if ((mesgptr->mesg_len = n) < 0) perror( blad odbioru ); return(n); /*jeśli koniec pliku to n=0*/ }

Stosując typy komunikatów można osiągnąć komunikacje dwustronną 2 typ oznacza komunikaty od serwera do klienta 1 typ oznacza komunikaty od klienta do serwera Klient Kolejka komunikatów IPC Typ = 1 Typ = 2 Typ = 2 Typ = 1 Typ = 2 Serwer

Stosując typy komunikatów można osiągnąć komunikacje dwustronną dla serwera i wielu klientów. Klient wysyłając komunikat ustawia typ = 1 a w treści zamieszcza swój pid Serwer odbiera wszystkie komunikaty gdzie typ = 1 Odczytuje z treści pid nadawcy Odpowiada wkładając do kolejki komunikat gdzie typ = pid Klient odczytuje wszystkie komunikaty o typie takim jak jego pid.

klient 1 pid = 321 klient 2 pid = 654 klient 3 pid = 987 typ=1 typ=321 typ=1 typ=654 typ=1 typ=987 kolejka komunikatów typ=1 typ=321,654 lub 987 serer