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



Podobne dokumenty
Mechanizmy z grupy IPC

Pamięć współdzielona

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

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

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

IPC: Kolejki komunikatów

Mechanizmy z grupy IPC

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

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

Temat zajęć: Mechanizmy IPC: semafory

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

Instrukcja do laboratorium Systemów Operacyjnych (semestr drugi)

Funkcje jadra systemu operacyjnego UNIX

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

Funkcje jadra systemu operacyjnego UNIX

Kolejki FIFO (łącza nazwane)

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

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

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

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)

Instytut Teleinformatyki

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

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

Systemy operacyjne. Zajęcia 11. Monitory

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

Zaawansowany kurs języka Python

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Semafory w systemie Unix

Kurs rozszerzony języka Python

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

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

Programowanie w Sieci Internet. Python: Wątki. Kraków, 12 grudnia 2014 r. mgr Piotr Rytko Wydział Matematyki i Informatyki

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

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

Temat zajęć: Tworzenie i obsługa wątków.

KOLEJKI KOMUNIKATÓW IPC

Systemy operacyjne III

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

Opis protokołu RPC. Grzegorz Maj nr indeksu:

Programowanie w ANSI C z wykorzystaniem funkcji jądra systemu UNIX/Linux

Semafory, pamięć dzielona i kolejki komunikatów

Krótki kurs programowania współbieżnego

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

Kurs języka Python. Wątki

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

Autor: dr inż. Zofia Kruczkiewicz, Programowanie aplikacji internetowych 1

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

Linux Kernel III. Character devices

Kurs programowania. Wykład 8. Wojciech Macyna. 10 maj 2017

Kamil Wróbel* Politechnika Lubelska, Instytut Informatyki, Nadbystrzycka 36B, Lublin, Polska

Aplikacje w Javie- wykład 11 Wątki-podstawy

Simulator of Operating System

Wątek - definicja. Wykorzystanie kilku rdzeni procesora jednocześnie Zrównoleglenie obliczeń Jednoczesna obsługa ekranu i procesu obliczeniowego

4.2 Sposób korzystania z l acza

Struktury. Przykład W8_1

1. Tworzenie nowego projektu.

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

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

Wstęp do Programowania potok funkcyjny

Programowanie współbieżne Wykład 10 Synchronizacja dostępu do współdzielonych zasobów. Iwona Kochańska

Programowanie w języku Python. Grażyna Koba

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

76.Struktura oprogramowania rozproszonego.

Przetwarzanie wielowątkowe przetwarzanie współbieżne. Krzysztof Banaś Obliczenia równoległe 1

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

Ćwiczenie 4. Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1.

Wykład 4 Delegat (delegate), właściwości indeksowane, zdarzenie (event) Zofia Kruczkiewicz

1 Wątki 1. 2 Tworzenie wątków 1. 3 Synchronizacja 3. 4 Dodatki 3. 5 Algorytmy sortowania 4

Łącza nienazwane(potoki)

System plików warstwa logiczna

Kurs programowania. Wykład 8. Wojciech Macyna

Aplikacja Sieciowa wątki po stronie klienta

Funkcje zawarte w bibliotece < io.h >

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

Ingerencja w kod systemu operacyjnego (przerwania) Programowanie na niskim poziomie (instrukcje specjalne) Trudności implementacyjne (alg.

Techniki programowania INP001002Wl rok akademicki 2017/18 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

1.Wstęp. 2.Generowanie systemu w EDK

Współbieżność w środowisku Java

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

Techniki programowania INP001002Wl rok akademicki 2018/19 semestr letni. Wykład 5. Karol Tarnowski A-1 p.

Jeśli chcesz łatwo i szybko opanować podstawy C++, sięgnij po tę książkę.

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

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

Pamięć dzielona i kolejki komunikatów

Obsługa plików. Laboratorium Podstaw Informatyki. Kierunek Elektrotechnika. Laboratorium Podstaw Informatyki Strona 1. Kraków 2013

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

7 Przygotował: mgr inż. Maciej Lasota

1. Kolejki komunikatów POSIX

E S - uniwersum struktury stosu

2 Implementacja w systemie Linux 2.4

Kolejki komunikatów POSIX

Dynamiczne struktury danych

Funkcje zawarte w bibliotece < io.h >

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

Futex (Fast Userspace Mutex) Łukasz Białek

Uwagi dotyczące notacji kodu! Moduły. Struktura modułu. Procedury. Opcje modułu (niektóre)

Wykład 3. Procesy i wątki. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

13. Kolejki komunikatów POSIX

SYLABUS DOTYCZY CYKLU KSZTAŁCENIA realizacja w roku akademickim 2016/2017

Transkrypt:

Krótki kurs programowania współbieżnego (2) Procesy i sygnały w języku C (to było ostatnio) Wspólny dostęp do plików (to też) Semafory i pamięć dzielona Inne metody komunikowania Kurs systemu UNIX 1

Dzielenie zasobów Interfejs programistyczny Uniksa dostarcza następujących mechanizmów: a) Blokowanie plików (było) b) Semafory c) Pamięć dzielona Kurs systemu UNIX 2

Semafory Mechanizm koordynacyjny znany nam z systemów operacyjnych. Operacje na semaforach są wykonywane niepodzielnie. Przypominamy definicję: wait(s) - jeżeli wartość S jest dodatnia to zmniejszyć S, w przeciwnym przypadku oczekiwać signal(s) - jeżeli ktoś czeka na S to go wznawiamy, w przeciwnym przypadku zwiększamy S. Kurs systemu UNIX 3

Semafory w Uniksie Dość rozbudowany interfejs: wszystkie funkcje operują na tablicach semaforów ogólnych. Przypomnienie: semafor binarny realizujemy za pomocą semafora ogólnego przypisując mu wartość początkową równą 1. Trzy funkcje zajmują się obsługą semaforów: semctl, semop, semget. Służą kolejno do sterowania semaforem, do zmiany wartości semafora oraz do tworzenia semafora. Należy włączyć pliki: #include <sys/types.h> #include <sys/ipc.h> #include <sys/sem.h> Kurs systemu UNIX 4

Kurs systemu UNIX 5

Semafory (2) Deklaracje int semctl(int semid, int semnum, int cmd,...); int semop(int semid, struct sembuf *sops, size_t nsops); int semget(key_t key, int nsems, int semflg); Parametr key jest liczbą całkowitą, służącą do identyfikacji semaforów pomiędzy procesami (coś jak nazwa pliku). Operacje na semaforach wykonuje się korzystając z identyfikatora semafora (coś jak deskryptor pliku). Kurs systemu UNIX 6

Tworzenie semafora Funkcja semget tworzy semafor lub zwraca identyfikator już istniejącego semafora. Można tworzyć semafory prywatne, korzystając ze specjalnej wartości parametru key o nazwie IPC_PRIVATE (warto o tym wiedzieć, by nie użyć tej stałej przypadkowo). Kolejnym argumentem jest liczba semaforów w tablicy oraz flagi (opcje) związane z semaforem. Flagi mogą być określające dostęp (takie jak w funkcji open) oraz IPC_CREAT; jeżeli zależy nam na nowym, unikatowym semaforze trzeba dodać IPC_EXCL. Kurs systemu UNIX 7

Zmiana wartości semafora Drugi parametr funkcji semop to wskaźnik na strukturę opisującą semafor. Struktura ta zawiera między innymi następujace rzeczy: struct sembuf { } short sem_num; short sem_op; short sem_flg; Pierwszy element to numer semafora w tablicy (0 jeżeli jest tylko jeden). Drugi element to wartość, o jaką chcemy zmienić semafor. Kurs systemu UNIX 8

Najczęściej używane są wartości +1 oraz -1, odpowiadające poleceniom signal oraz wait. Jeżeli flaga SEM_UNDO (w trzecim elemencie) jest włączona, to system śledzi zmiany semaforów i zwalnia semafory po zakończeniu działania procesu. Parametr ostatni funkcji semop to liczba semaforów, których dotyczy operacja. Kurs systemu UNIX 9

Sterowanie semaforem Funkcja semctl pozwala na bezpośrednie sterowanie semaforem. Znaczenie parametrów sem_id oraz sem_num takie jak w poprzednich funkcjach. Dwie najczęściej używane komendy: 1) SETVAL do ustalania wartości semafora (przed pierwszym użyciem) 2) IPC_RMD do usuwania semafora. Kurs systemu UNIX 10

Ustalanie wartości semafora Występuje wtedy czwarty parametr: wskażnik na unie semun, zdefiniowaną poniżej: union semun { int val; // (...) } W tej unii znajduje się wstawiana wartość. Kurs systemu UNIX 11

Uproszczony interfejs semaforowy int create(int key) { return semget(key, 1, 0666 IPC_CREAT); } void wait(int S) { sembuf sb; sb.sem_num = 0; sb.sem_op = -1; sb.flg = SEM_UNDO; semop(s,&sb,1); } void signal(int S) { //analogicznie, tyle»e sb.sem_op = +1; } Kurs systemu UNIX 12

void delete(int S) { } semctl(s,0,ipc_rmd); void set(int S, int v) { semun su; su.val = v; semctl(s,0,setval, &su); } Kurs systemu UNIX 13

Watki i ich koordynacja w Pythonie Podstawowy moduł to threading, który korzysta z niskopoziomowego modułu thread. Przypomnienie: wątki dzielą pamięć, wykonują się współbieżnie lub równolegle. Program zakończy działanie, gdy zakończą się wszystkie niedemoniczne jego wątki. Kurs systemu UNIX 14

Tworzenie watków Wątek reprezentuje specjalna klasa o nazwie Thread. W konstruktorze można podawać argumenty: target obiekt wykonywalny (na przykład funkcja), czyli to, co wątek będzie robił. args lista argumentów, przekazanych funkcji target name nazwa wątku (sam się jakoś nazwie, jak nie podamy) W konstruktorze należy używać przekazywania parametrów za pomocą słów kluczowych. Metoda start uruchomi wątek. Kurs systemu UNIX 15

Zamki (klasa Lock) Zamki mają funkcjonalność prostych binarnych semaforów, które każdy może zamknąć bądź otworzyć. acquire może oznaczać zawieszenie wątku (jeżeli zamek jest zamknięty) release oznacza otwarce zamku i być może obudzenie wątku czekającego. Kurs systemu UNIX 16

Przykład: filozofowie #!/usr/local/bin/python import time,random from threading import * def pauza(): time.sleep(3*random.random()) def jedzenie(n): print n + " zaczyna jedzenie" pauza() print n + " ko«czy jedzenie" def myslenie(n): print n + " zaczyna my±lenie" pauza() print n + " ko«czy my±lenie" Kurs systemu UNIX 17

def filozof(i,n): while 1: L,P = i, (i+1) % 5 W[L].acquire(); W[P].acquire() jedzenie(n) W[P].release(); W[L].release() myslenie(n) print "Hej, zaczynamy!" imiona = [ 'Platon', 'Arystoteles', 'Newton', 'Wittgenstein', 'Kubu± Puchatek'] F = [] W = [] Kurs systemu UNIX 18

for i in range(5): F.append(Thread(target = filozof, args = (i,imiona[i]) ) ) W.add(Lock()) for fil in F: fil.start() time.sleep(30) print "Koniec pracy zarz dcy!" Kurs systemu UNIX 19

Inne możliwości Wątki opóźnione (klasa Timer) Prawdziwe semafory (niekonieczne binarne) Wysyłanie sygnałów pomiędzy wątkami (Event), możliwe oczekiwanie. Kurs systemu UNIX 20

Co moga chronić semafory? Pliki (w przypadku wspólnego dostępu). Pamięć dzieloną pomiędzy różne procesy. I wiele innych rzeczy. Kurs systemu UNIX 21

Pamięć dzielona Każdy proces ma własną przestrzeń adresową. Istnieje możliwość podłączenia jednego fragmentu fizycznej pamięci do przestrzeni adresowej więcej niż jednego procesu. Jest to najszybsza metoda komunikacji międzyprocesowej. Ale niestety nie daje żadnych mechanizmów koordynacyjnych należy to do programisty (może skorzystać z semaforów). Kurs systemu UNIX 22

Podstawowe funkcje dotyczace pamięci dzielonej shmget tworzy segment p.d. shmat dołącza segment p.d. do przestrzeni adresowej procesu. shdt odłącza pamięć od przestrzeni adresowej. shmctl steruje pamięcią dzieloną. Pliki nagłówkowe: #include <sys/shm.h> #include <sys/types.h> #include <sys/ipc.h> Kurs systemu UNIX 23

Tworzenie segmentu pamięci dzielonej Realizujemy funkcją: int shmget(key_t key, size_t size, int shmflg); Idea podobna co w przypadku semaforów, zwraca używany później identyfikator. Flagi ustalają prawa dostępu, można dodatkowo IPC_CREAT Mozna zatem tworzyć pamięć dzieloną taką, którą inni tylko czytają. Parametr size zawiera wielkość (w bajtach) pamięci. Kurs systemu UNIX 24

Dołaczanie i odłaczanie segmentu Realizujemy funkcjami: void *shmat(int shmid, const void *shmaddr, int shmflg); int shmdt(char *shmaddr); Pierwszy parametr shmat to identyfikator segmentu, drugi to adres pod którym chcemy podłączyć najlepiej 0, wówczas system sam wybierze. Funkcja zwraca adres pod którym pamięć została podłączona. Przykładowa flaga to SHM_RDONLY sprawiająca, że pamięć jest tylko do odczytu. Przy odłączaniu argumentem jest adres zwrócony przez shmat. Kurs systemu UNIX 25

Sterowanie Realizujemy funkcją: int shmctl(int shmid, int cmd, struct shmid_ds *buf); Znaczenie parametrów: identyfikator pamięci, numer komendy i specjalny bufor zawierający argumenty. Możliwe polecenia: 1) IPC_STAT w trzecim argumencie odczytuje się pewne dane, związane z buforem. 2) IPC_RMID usuwa się segment pamięci. Kurs systemu UNIX 26

Niektóre dane w smid_ds Czas ostatnich operacji shmat, shmctl, shmdt. PID twórcy, PID procesu, który ostatnio coś robił. Ile jest aktualnie dołączeń. Kurs systemu UNIX 27

Potoki procesowe Jedna z najprostszych metod pozwalających na przekazywanie danych między procesami. Polecenie FILE* popen(char* polecenie,char* tryb) uruchamia polecenie i umożliwia przekazywanie mu danych za pomocą operacji plikowych. Można również przechwytywać dane wyprodukowane przez inny proces. Tryb musi być równy "r" lub "w" (nie "rw"). Potok zamykamy poleceniem pclose. Kurs systemu UNIX 28

Jak sa implementowane potoki z poprzedniego slajdu Funkcja pipe stanowi mechanizm niższego poziomu, umożliwiający implementację (między innymi) polecenia popen. Ma następującą sygnaturę: #include <unistd.h> int pipe(int file_descriptor[2]); Zapisujemy do fd[1], a odczytujemy z fd[0]. Zorganizowane jako kolejka FIFO. Umożliwia komunikację spokrewnionych procesów (dlaczego?). Kurs systemu UNIX 29

Nazwane potoki Umożliwiają komunikację pomiędzy procesami niespokrewnionymi. Można utworzyć potok (skrzynkę komunikacyjną) poleceniem mkfifo. Można wykonać następującą sekwencję poleceń: mkfifo moje-fifo cat < moje_fifo & echo "Tekst do fifo" >> moje_fifo Polecenie mkfifo ma swój odpowiednik biblioteczny: int mkfifo(char *nazwa,int tryb). Kurs systemu UNIX 30

Używanie nazwanych potoków Otwieramy i zamykamy za pomocą funkcji (niskopoziomowych) open oraz close. W opcjach funkcji open możemy dać stałą O_NONBLOCK. Wtedy open zawsze kończy się od razu. W przeciwnym razie po otwarciu do czytania (O_RDONLY) czeka, aż ktoś otworzy do pisania i odwrotnie. Stała O_NONBLOCK wpływa również nadziałanie funkcji read i write w przypadku czytania z pustego i pisania do pełnego potoku. Uwaga: komunikację dwustronną najlepiej zrealizować za pomocą dwóch potoków. Kurs systemu UNIX 31

Kolejki komunikatów pobieżnie Jest to alternatywny mechanizm w stosunku do nazwanych potoków. Podobnie jak przy semaforach i pamieci dzielonej kolejkę identyfikuje klucz (liczba całkowita) oraz lokalny identyfikator. Funkcje obsługujące to msgget, msgsnd, msgrcv, msgctl, zadeklarowane w pliku sys/msg.h. Funkcje te zajmują się otwieraniem, wysyłaniem, odbieraniem oraz obsługą kolejek komunikatów. Kurs systemu UNIX 32

Na liście jest zadanie......napisania prostej aplikacji klient-serwer, wykorzystuącej różne mechanizmy komunikacji: a) semafory + pamięć dzielona, b) nazwane potoki, c) kolejki komunikatów, d) gniazda Kurs systemu UNIX 33