1. Kolejki komunikatów POSIX

Podobne dokumenty
Kolejki komunikatów POSIX

1. Kolejki komunikatów POSIX

13. Kolejki komunikatów POSIX

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

IPC: Kolejki komunikatów

Tryby komunikacji między procesami w standardzie Message Passing Interface. Piotr Stasiak Krzysztof Materla

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

1 Timery i zdarzenia

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

Mechanizmy z grupy IPC

4.2 Sposób korzystania z l acza

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

4. Komunikacja pomiędzy procesami przez łącza nienazwane i nazwane

Kolejki FIFO (łącza nazwane)

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)

1.1 Przykład znajdowanie liczb pierwszych leżących w zadanym zakresie, tryb bezpołączeniowy

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

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

Argumenty wywołania programu, operacje na plikach

1. Timery i zdarzenia

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

1. Timery i zdarzenia

Opis protokołu RPC. Grzegorz Maj nr indeksu:

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

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

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

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

Aplikacja Sieciowa wątki po stronie klienta

Temat zajęć: Obsługa łączy komunikacyjnych

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

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

Semafor nie jest mechanizmem strukturalnym. Aplikacje pisane z użyciem semaforów są podatne na błędy. Np. brak operacji sem_post blokuje aplikację.

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

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

7. Szeregowanie procesów w systemie QNX6 Neutrino

IG1: INSTALACJA KOMUNIKATORA GADU-GADU

Informacje wstępne #include <nazwa> - derektywa procesora umożliwiająca włączenie do programu pliku o podanej nazwie. Typy danych: char, signed char

Ćwiczenie 1. Kolejki IBM Message Queue (MQ)

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

Rys. 9-1 Procesy P1 i P2 komunikuję się poprzez wspólny obszar. pamięci.

10. Synchronizacja użycia zasobów, Semafory Problem producenta i konsumenta

1. Procesy i współbieżność

Katedra Elektrotechniki Teoretycznej i Informatyki. wykład 12 - sem.iii. M. Czyżak

Program dla praktyki lekarskiej

Funkcje zawarte w bibliotece < io.h >

Jedrzej Ułasiewicz Komputerowe systemy sterowania 1

INFORMATYKA Studia Niestacjonarne Elektrotechnika

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

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

Funkcje zawarte w bibliotece < io.h >

Podział programu na moduły

Semafory, pamięć dzielona i kolejki komunikatów

Programowanie Równoległe Wykład 5. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Procesy. Systemy Operacyjne 2 laboratorium. Mateusz Hołenko. 9 października 2011

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

Klient-Serwer Komunikacja przy pomocy gniazd

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

sposób wykonywania operacji zapisu i odczytu dane odczytywane z l acza usuwane (nie można ich odczytać ponownie),

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

Łącza nienazwane(potoki)

Wstęp do Programowania, laboratorium 02

Obsługa plików Procesy

Programowanie Proceduralne

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

Struktury. Przykład W8_1

Języki i metodyka programowania. Typy, operatory, wyrażenia. Wejście i wyjście.

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

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

4. Procesy pojęcia podstawowe

w odróżnieniu od procesów współdzielą przestrzeń adresową mogą komunikować się za pomocą zmiennych globalnych

ZAJECIA Z SYSTEMÓW OPERACYJNYCH 2 (Programowanie): funkcje POSIX

Tworzenie aplikacji rozproszonej w Sun RPC

Stan globalny. Krzysztof Banaś Systemy rozproszone 1

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

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

Procesy i wątki. Blok kontrolny procesu. Proces. Proces - elementy. Stan procesu

Instytut Teleinformatyki

2 Przygotował: mgr inż. Maciej Lasota

Sygnały. 7. Sygnały (2005/2006)

J. Ułasiewicz Łącza nienazwane, nazwane, select 1

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

Programowanie procesorów graficznych NVIDIA (rdzenie CUDA) Wykład nr 1

Programowanie Równoległe Wykład 4. MPI - Message Passing Interface. Maciej Matyka Instytut Fizyki Teoretycznej

Tablice, funkcje - wprowadzenie

Programowanie w modelu przesyłania komunikatów specyfikacja MPI. Krzysztof Banaś Obliczenia równoległe 1

Pamięć współdzielona

1. Ustanawianie ograniczeń na użycie zasobów

S P I S T R E Ś C I. Instrukcja obsługi

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

Biblioteka standardowa - operacje wejścia/wyjścia

Struktura i funkcjonowanie komputera pamięć komputerowa, hierarchia pamięci pamięć podręczna. System operacyjny. Zarządzanie procesami

PRZERWANIA. 1. Obsługa zdarzeń, odpytywanie i przerwania Obsługa zdarzeń jest jedną z kluczowych funkcji w prawie każdym systemie czasu rzeczywistego.

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

Podstawy programowania w języku C++

Część 4 życie programu

W otwartym oknie w zakładce Ogólne znajdujemy opcje Podpis. Po zaznaczeniu pola wyboru, w edytorze możemy zredagować dołączaną treść.

Proces y i y w i ąt ą ki

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

Programowanie w językach wysokiego poziomu

Transkrypt:

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 1 1. Kolejki komunikatów POSIX 1.1 Podstawowe własności Kolejki FIFO maja następujące wady: Komunikaty pozbawione struktury Nie można testować stanu kolejki liczba komunikatów, procesy zablokowane Wad tych pozbawione są kolejki komunikatów POSIX Podstawowe cechy kolejek komunikatów: 1. Kolejki komunikatów są pośrednim obiektem komunikacyjnym widzianym jako plik specjalny. Komunikujące się procesy nie muszą znać swoich identyfikatorów. 2. Komunikaty odczytywane z kolejki zachowują strukturę są separowane. W kolejce mogą znajdować się komunikaty różnej długości. Własności tej nie mają kolejki FIFO. 3. Można zadać maksymalną długość kolejki komunikatów. Gdy zostanie ona przekroczona, proces piszący do kolejki komunikatów będzie zablokowany. 4. Kolejka widziana jest w systemie plików jako plik specjalny. Operacje zapisu / odczytu mogą być zabezpieczane prawami dostępu tak jak w przypadku plików regularnych. 5. Można testować status kolejki (np. liczbę komunikatów w kolejce). Nie jest to możliwe w przypadku kolejek FIFO. 6. Komunikatom można nadać priorytet. Komunikaty wyższym priorytecie będą umieszczane na początku kolejki. PN1 PO1 PNk Max n POn Procesy nadające Kolejka Q Procesy odbierajace Rys. 1-1 Procesy komunikują się za pomocą kolejki komunikatów

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 2 Zastosowanie kolejki komunikatów jest wygodnym rozwiązaniem w następujących przypadkach: 1. Proces wysyłający komunikaty nie może być wstrzymany. 2. Proces wysyłający komunikaty nie potrzebuje szybkiej informacji zwrotnej o tym czy komunikat dotarł do adresata. 3. Zachodzi potrzeba przekazywania danych z procesu w którym one powstają (producent) do procesu w którym są one przetwarzane (konsument) 1.2 Podstawowe typy i plik nagłówkowy Kolejka komunikatów jest typu mqd_t. Typ ten jest zdefiniowany w pliku nagłówkowym <mqueue.h>. Modyfikowalne atrybuty kolejki komunikatów zdefiniowane są w strukturze mq_attr. struct mq_attr { long mq_maxmsg; // Maksymalna liczba komunikatów w kolejce long mq_msgsize; // Maksymalna wielkość pojedynczego komunikatu long mq_curmsg; // Aktualna liczba komunikatów w kolejce long mq_flags; // Flagi long mq_sendwait; // Liczba procesów zablok. na operacji zapisu long mq_recvwait; // Liczba procesów zablok. na operacji odczytu 1.3 Utworzenie i otwarcie kolejki komunikatów Kolejkę komunikatów tworzy się za pomocą funkcji: mqd_t mq_open(char *name,int oflag,int mode,mq_attr *attr) name oflag mode attr Łańcuch identyfikujący kolejkę komunikatów. Kolejki tworzone są w katalogu bieżącym Tryb tworzenia kolejki. Tryby te są analogiczne jak w zwykłej funkcji open. Prawa dostępu do kolejki (r - odczyt, w - zapis) dla właściciela pliku, grupy i innych, analogicznie jak w przypadku plików regularnych. Atrybut x - wykonanie jest ignorowany. Atrybuty kolejki

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 3 Ważniejsze tryby tworzenia kolejki komunikatów: Tryb O_RDONLY O_WRONLY O_RDWR O_CREAT O_NONBLOCK Znaczenie Tylko odczyt z kolejki Tylko zapis do kolejki Odczyt i zapis Utwórz kolejkę o ile nie istnieje Domyślnie flaga jest wyzerowana co powoduje że operacje odczytu (mq_receive) i zapisu (mq_send) mogą być blokujące. Gdy flaga jest ustawiona operacje te nie są blokujące i kończą się błędem. Tab. 1-1 Podstawowe flagi używane przy tworzeniu kolejek komunikatów Atrybut Wartość domyślna mq_maxmsg 1024 mq_msgsize 4096 mq_flags 0 Tab. 1-2 Domyślne atrybuty kolejki komunikatów: Gdy kolejka już istnieje parametry 3 i 4 funkcji mq_open są ignorowane. Funkcja mq_open zwraca: 1. W przypadku pomyślnego wykonania wynik jest nieujemny jest to identyfikator kolejki komunikatów 2. W przypadku błędu funkcja zwraca 1.

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 4 1.4 Synchronizacja Przebieg operacji zapisu i odczytu zależy od liczby n komunikatów w kolejce i od jej pojemności Max. Wysyłanie komunikatu: mq_send(...) Odbiór komunikatu: mq_receive (...) Liczba komunikatów n w kolejce Q n = Max Wysłanie komunikatu Blokada lub sygnalizacja błędu Odbiór komunikatu Bez blokady 0< n < Max Bez blokady Bez blokady n = 0 Bez blokady Blokada lub sygnalizacja błędu Rys. 1-2 Przebieg operacji na kolejce w zależności od liczby komunikatów n w jej buforze 1.5 Wysłanie komunikatu do kolejki Wysłanie komunikatu do kolejki komunikatów odbywa się za pomocą funkcji: int mq_send(mqd_t mq, char *msg, size_t len, unsigned int mprio) Znaczenie parametrów: mq identyfikator kolejki komunikatów, *msg adres bufora wysyłanego komunikatu, len długość wysyłanego komunikatu, mprio priorytet komunikatu (od 0 do MQ_PRIORITY_MAX). Wywołanie funkcji powoduje przekazanie komunikatu z bufora msg do kolejki mq. Można wyróżnić dwa zasadnicze przypadki: 1) W kolejce jest miejsce na komunikaty. Wtedy wykonanie funkcji nie spowoduje zablokowania procesu bieżącego.

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 5 2) W kolejce brak miejsca na komunikaty. Wtedy wykonanie funkcji spowoduje zablokowania procesu bieżącego. Proces ulegnie odblokowaniu gdy zwolni się miejsce w kolejce. Zachowanie się funkcji uzależnione jest od stanu flagi O_NONBLOCK. Flaga ta jest domyślnie wyzerowana. Funkcja zwraca: 0 Sukces -1 Błąd

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 6 1.6 Pobieranie komunikatu z kolejki Pobieranie komunikatu z kolejki komunikatów odbywa się za pomocą funkcji mq_receive. int mq_receive(mqd_t mq, char *msg, size_t len, unsigned int *mprio) Znaczenie parametrów: mq identyfikator kolejki komunikatów, *msg Adres bufora na odbierany komunikat, len maksymalna długość odbieranego komunikatu, mprio priorytet odebranego komunikatu. 1. Gdy w kolejce znajduje się przynajmniej jeden komunikat wywołanie funkcji mq_receive nie spowoduje zablokowania procesu bieżącego. 2. Gdy w kolejce brak komunikatów wywołanie funkcji mq_receive spowoduje zablokowania procesu bieżącego. Proces ulegnie odblokowaniu gdy w kolejce pojawi się jakiś komunikat. Proces 2 Proces 1 Stan kolejki mq_receive(...) Pusta Blokada kolejka komunikatów mq_send(...) Pusta Rys. 1-3 Proces 2 blokuje się przy próbie odbioru komunikatu z kolejki.

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 7 W przypadku gdy więcej niż jeden proces czeka na komunikat odblokowany będzie proces który najdłużej czekał. Zachowanie się funkcji uzależnione jest także od stanu flagi O_NONBLOCK. Funkcja mq_receive zwraca: >0 Rozmiar odebranego komunikatu gdy wynik jest większy od 0. 1 Gdy wystąpił błąd. Przykład: Procesy P1 i P2 komunikują się przy pomocy kolejki komunikatów problem producenta konsumenta.

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 8 // Proces P1 wysylajacy komunikaty do kolejki MQ1 #include <stdio.h> #include <mqueue.h> #define SIZE 80 typedef struct { int type; // Typ komunikatu char text[size]; // Tekst komunikatu msg_tp; main(int argc, char *argv[]) { int i; int res; mqd_t mq; msg_tp msg; struct mq_attr attr; // Ustalenie atrybutów kolejki ---------------- attr.mq_msgsize = sizeof(msg); attr.mq_maxmsg = 8; attr.mq_flags = 0; // Utworzenie kolejki komunikatow ------------ mq=mq_open( MQ1,O_RDWR O_CREAT, 0666,&attr); if(mq < 0) { // Błąd perror( Kolejka MQ1 ); exit(-1); for(i=0; i < 10 ;i++) { msg.type = 1; sprintf(msg.text,"proces 1 komunikat %d",i); // Wysłanie komunikatu ---------------- res = mq_send(mq,&msg,sizeof(msg),10); sleep(1); mq_close(mq); Przykład 1-1 Kod procesu wysyłającego komunikaty do kolejki MQ1 - producent

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 9 // Proces P2 odbierający komunikaty z kolejki MQ1 #include <stdio.h> #include <mqueue.h> #define SIZE 80 typedef struct { int type; // Typ komunikatu char text[size]; // Tekst komunikatu msg_tp; main(int argc, char *argv[]) { int i, res, prio; mqd_t mq; msg_tp msg; struct mq_attr attr; // Ustalenie atrybutów kolejki ---------------- attr.mq_msgsize = sizeof(msg); attr.mq_maxmsg = 8; attr.mq_flags = 0; // Utworzenie kolejki komunikatow ------------ mq=mq_open( MQ1,O_RDWR O_CREAT, 0666,&attr); if(mq < 0) { // Błąd perror( Kolejka MQ1 ); exit(-1); for(i=0; i < 10 ;i++) { // Odbiór komunikatu ---------------- res = mq_receive(mq,&msg,sizeof(msg),&prio); printf( Typ: %d text: %s\n,msg.typ,msg.text); mq_close(mq); Przykład 1-2 Kod procesu odbierającego komunikaty z kolejki MQ1 - konsument

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 10 1.7 Testowanie statusu kolejki komunikatów Testowanie statusu kolejki komunikatów odbywa się poprzez wykonanie funkcji: int mq_getattr(mqd_t mq, struct mq_attr *attr) Znaczenie parametrów: mq Iidentyfikator kolejki komunikatów, *attr Adres bufora ze strukturą zawierającą atrybuty kolejki komunikatów Użyteczne elementy struktury atrybutów: mq_curmsg Aktualna liczba komunikatów w kolejce mq_sendwait Liczba procesów zablokowanych na operacji zapisu mq_recvwait Liczba procesów zablokowanych na operacji odczytu 1.8 Zawiadamianie procesu o pojawieniu się komunikatu w kolejce 1. Można spowodować aby pojawienie się komunikatu w pustej kolejce (a wiec zmiana stanu kolejki z pusta na niepusta ) powodowało zawiadomienie procesu bieżącego. 2. Zawiadomienie może mieć postać sygnału lub powodować uruchomienie watku int mq_notify(mqd_t mq, struct sigevent *notif) Znaczenie parametrów: mq Identyfikator kolejki komunikatów, *notif Adres struktury typu sigevent specyfikującego sposób zawiadomienia.

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 11 1.9 Zamknięcie i skasowanie kolejki komunikatów Gdy proces przestanie korzystać z kolejki komunikatów powinien ją zamknąć. Do tego celu służy funkcja: int mq_close(mqd_t mq) Kolejkę kasuje się za pomocą polecenia: int mq_unlink(char *name) 1.10 Znajdowanie liczb pierwszych w przedziale Program znajduje liczby pierwsze w zadanym przedziale [Zd,...,Zg]. Obliczenia można przyspieszyć dzieląc zakres [Zd,...,Zg] na P podprzedziałów [Zd(1),...,Zg(1)], [Zd(2),...,Zg(2)],..., [Zd(P),...,Zg(P)] gdzie P jest liczbą dostępnych procesorów. W każdym z podprzedziałów [Zd(i),...,Zg(i)] możemy znajdować liczby pierwsze niezależnie co robi proces wykonawczy o nazwie licz. Tak więc o ile dysponujemy procesorem wielordzeniowym obliczenia wykonane mogą być równolegle. Dane wejściowe o podprzedziałach do procesów wykonawczych maja być przekazanie przez kolejkę komunikatów o nazwie wejście w której należy umieścić rekordy o strukturze danej poniżej (pole liczb niewykorzystane). typedef struct { int nr; // numer przedzialu i int pocz; // poczatek zakresu obliczen int kon; // koniec zakresu obliczen int liczb; // ile liczb pierwszych w przedziale msg_t;

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 12 Wyniki końcowe zapisane w strukturach msg_t mają być przekazane do kolejki komunikatów o nazwie wyjście. Zd, Zg, P kolejka komunikatów wejscie proces zarząrzający proces wykonawczy 1 wynik1 wyjście proces wykonawczy 2 wynik2 kolejka komunikatów wyjscie proces wykonawczy P wynikp Rys. 1-4 Znajdowanie liczb pierwszych z użyciem kolejek FIFO Zadanie powinno być rozwiązane w następujący sposób: Proces zarządzający: Tworzy kolejki komunikatów POSIX wejscie i wyjscie Dzieli przedział [Zd,...,Zg] na P podprzedziałów. Następnie wpisuje do kolejki wejscie struktury typu msg_t zawierające kolejne podprzedziały 1,2,..,P. Tworzy procesy potomne używając funkcji execl(./licz,... ). Funkcja ta uruchamia procesy wykonawczy o nazwie licz. Czeka na zakończenie wykonawczych. Odczytuje z kolejki wyniki dane o znalezionych liczbach liczb pierwszych, oblicza sumę wszystkich liczb pierwszych (ma być wyprowadzona na konsolę) oraz czas obliczeń.

Jędrzej Ułasiewicz IIAiR Politechnika Wrocławska 13 Proces wykonawczy Odczytuje z kolejki komunikatów wejscie zakres obliczeniowy pocz i kon. Znajduje liczby pierwsze w przedziale [pocz,kon] i ich sumaryczną ilość. Znalezioną liczbę liczb pierwszych oraz zakres obliczeń zapisuje w strukturze msg_t. Struktura zapisywana jest do kolejki komunikatów wyjscie.