Jacek Naruniec. lato 2014, Politechnika Warszawska, Wydział Elektroniki i Technik Informacyjnych

Podobne dokumenty
Zapoznanie z technikami i narzędziami programistycznymi służącymi do tworzenia programów współbieżnych i obsługi współbieżności przez system.

Architektura komputerów

Algorytmy i Struktury Danych

Programowanie równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Podstawy Informatyki Systemy sterowane przepływem argumentów

Nowoczesne technologie przetwarzania informacji

i3: internet - infrastruktury - innowacje

Architektura mikroprocesorów TEO 2009/2010

Programowanie współbieżne i rozproszone

16. Taksonomia Flynn'a.

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Sprzęt komputerowy 2. Autor prezentacji: 1 prof. dr hab. Maria Hilczer

Architektura komputerów

Tworzenie programów równoległych cd. Krzysztof Banaś Obliczenia równoległe 1

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Numeryczna algebra liniowa

Obliczenia równoległe i rozproszone. Praca zbiorowa pod redakcją Andrzeja Karbowskiego i Ewy Niewiadomskiej-Szynkiewicz

Budowa komputera. Magistrala. Procesor Pamięć Układy I/O

Programowanie procesorów graficznych GPGPU. Krzysztof Banaś Obliczenia równoległe 1

Budowa Mikrokomputera

Porównanie wydajności CUDA i OpenCL na przykładzie równoległego algorytmu wyznaczania wartości funkcji celu dla problemu gniazdowego

Literatura. 11/16/2016 Przetwarzanie równoległe - wstęp 1

Programowanie procesorów graficznych GPGPU

Programowanie współbieżne Wykład 2. Iwona Kochańska

Programowanie z wykorzystaniem technologii CUDA i OpenCL Wykład 1

Obliczenia Wysokiej Wydajności

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Architektura Komputerów

Architektura komputerów

PRZEWODNIK PO PRZEDMIOCIE

PROBLEMATYKA OBLICZEŃ MASOWYCH W NAUKACH O ZIEMI. Satelitarny monitoring środowiska

10/14/2013 Przetwarzanie równoległe - wstęp 1. Zakres przedmiotu

Systemy wbudowane. Uproszczone metody kosyntezy. Wykład 11: Metody kosyntezy systemów wbudowanych

Larrabee GPGPU. Zastosowanie, wydajność i porównanie z innymi układami

Systemy operacyjne. Systemy operacyjne. Systemy operacyjne. Zadania systemu operacyjnego. Abstrakcyjne składniki systemu. System komputerowy

3.Przeglądarchitektur

Budowa komputera Komputer computer computare

Mechatronika i inteligentne systemy produkcyjne. Modelowanie systemów mechatronicznych Platformy przetwarzania danych

Analiza ilościowa w przetwarzaniu równoległym

PODSTAWY PRZETWARZANIA RÓWNOLEGŁEGO INFORMACJI

Wprowadzenie do systemów operacyjnych

Projektowanie algorytmów równoległych. Zbigniew Koza Wrocław 2012

3.Przeglądarchitektur

Poziom kwalifikacji: I stopnia. Liczba godzin/tydzień: 2W E, 2L PRZEWODNIK PO PRZEDMIOCIE

Architektury komputerów Architektury i wydajność. Tomasz Dziubich

Tworzenie programów równoległych. Krzysztof Banaś Obliczenia równoległe 1

Welcome to the waitless world. Inteligentna infrastruktura systemów Power S812LC i S822LC

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

Moc płynąca z kart graficznych

Architektura systemów komputerowych. Przetwarzanie potokowe I

Dr inż. hab. Siergiej Fialko, IF-PK,

Przetwarzanie Równoległe i Rozproszone

Literatura. 3/26/2018 Przetwarzanie równoległe - wstęp 1

Podsystem graficzny. W skład podsystemu graficznego wchodzą: karta graficzna monitor

4. Procesy pojęcia podstawowe

Algorytmy dla maszyny PRAM

LEKCJA TEMAT: Zasada działania komputera.

Przygotowanie kilku wersji kodu zgodnie z wymogami wersji zadania,

PROGRAMOWANIE WSPÓŁCZESNYCH ARCHITEKTUR KOMPUTEROWYCH DR INŻ. KRZYSZTOF ROJEK

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

Programowanie współbieżne Wykład 1. Rafał Skinderowicz

GRIDY OBLICZENIOWE. Piotr Majkowski

PRZEWODNIK PO PRZEDMIOCIE

Wstęp. Historia i przykłady przetwarzania współbieżnego, równoległego i rozproszonego. Przetwarzanie współbieżne, równoległe i rozproszone

Wstęp. Przetwarzanie współbieżne, równoległe i rozproszone

Zał nr 4 do ZW. Dla grupy kursów zaznaczyć kurs końcowy. Liczba punktów ECTS charakterze praktycznym (P)

Grafika komputerowa i wizualizacja

Architektura komputerów

Podstawy techniki cyfrowej i mikroprocesorowej - opis przedmiotu

Nazwa Wydziału Nazwa jednostki prowadzącej moduł Nazwa modułu kształcenia Kod modułu Język kształcenia Efekty kształcenia dla modułu kształcenia

Wykorzystanie architektury Intel MIC w obliczeniach typu stencil

Przetwarzanie Rozproszone i Równoległe

PROGRAMOWALNE STEROWNIKI LOGICZNE

Program Obliczeń Wielkich Wyzwań Nauki i Techniki (POWIEW)

dr inż. Jarosław Forenc

Klasyfikacja systemów komputerowych. Architektura von Neumanna Architektura harwardzka Zmodyfikowana architektura harwardzka. dr inż.

Obliczenia Wysokiej Wydajności

4. Procesy pojęcia podstawowe

Wydajność systemów a organizacja pamięci. Krzysztof Banaś, Obliczenia wysokiej wydajności. 1

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.1

Programowanie współbieżne. Iwona Kochańska

Mikroprocesory rodziny INTEL 80x86

Wykład I. Podstawowe pojęcia. Studia Podyplomowe INFORMATYKA Architektura komputerów

PRZEWODNIK PO PRZEDMIOCIE

Architektura i administracja systemów operacyjnych

Procesory wielordzeniowe (multiprocessor on a chip) Krzysztof Banaś, Obliczenia wysokiej wydajności.

System mikroprocesorowy i peryferia. Dariusz Chaberski

Architektura von Neumanna

USŁUGI HIGH PERFORMANCE COMPUTING (HPC) DLA FIRM. Juliusz Pukacki,PCSS

Systemy operacyjne. Informatyka Stosowana, I rok. Krzysztof Wilk. Katedra Informatyki Stosowanej i Modelowania

Budowa i zasada działania komputera. dr Artur Bartoszewski

Systemy Operacyjne. wykład 1. Adam Kolany. Październik, Instytut Techniczny Państwowa Wyższa Szkoła Zawodowa w Nowym Sączu

Informatyka. informatyka i nauki komputerowe (computer science)

Systemy operacyjne III

Wydajność systemów a organizacja pamięci, czyli dlaczego jednak nie jest aż tak źle. Krzysztof Banaś, Obliczenia wysokiej wydajności.

Tesla. Architektura Fermi

Wprowadzenie. Dariusz Wawrzyniak. Miejsce, rola i zadania systemu operacyjnego w oprogramowaniu komputera

Transkrypt:

lato 2014,, Wydział Elektroniki i Technik Informacyjnych

Wykład (poniedziałek 10:15) dr inż. Jacek Naruniec, dr inż. Maciej Sypniewski Laboratoria (3-godzinne) w 08 Środy 12:15 Projekt Punktacja: Laboratorium (L) Projekt (P) Egzamin (E) Suma = (L + P + E)*0.8 5*10 punktów - 25 punktów - 50 punktów 2

Zaliczenie po przekroczeniu progu 50 p. i min. 25 punktów za egzamin, dalsze progi standardowe Laboratorium można oddać maksymalnie tydzień po terminie bez utraty punktów (o ile jest to możliwe ze względów sprzętowych) Za każdy kolejny tydzień opóźnienia laboratorium 2 punkty straty Ostateczny termin oddania projektu do końca sesji 3

Wykład: Wprowadzenie do programowania współbieżnego: (4h) (JN) Technologie obliczeń równoległych: (4h) (MS) przegląd Podstawy projektowania algorytmów równoległych: (2h) (JN) Programowanie procesorów graficznych: (6h) (JN+MS) CUDA, OpenCl, C++AMP Proste przykłady realizacji obliczeń na platformach GPU: (2h) (MS) od rozwiązania prostego po zoptymalizowane Wprowadzenie do analizy danych multimedialnych: (2h) (JN) Wybrane algorytmy wspomagające analizę danych multimedialnych: (6h) (JN) Algorytm FDTD analizy elektromagnetycznej: (4h) (MS) 4

Laboratorium Szczegóły będą określone w czasie trwania semestru, ogólnie: Realizacja matematycznych algorytmów obliczeniowych 1 (MS). Realizacja matematycznych algorytmów obliczeniowych 2 (JN). Algorytmy filtracji obrazów - CPU (JN). Algorytmy filtracji obrazów - GPU (JN). Uproszczony algorytm FDTD GPU (MS) Co najmniej jedno laboratorium na NVIDIA Grid Co najmniej jedno laboratorium na obliczeniach w chmurze 5

Projekt "System analizy obrazu" "Gra interaktywna" Porównanie wydajności obliczeniowej algorytmów FDTD realizowanych w różnych technologiach GPU Projekty samodzielne, można zaproponować (a nawet wskazany jest) własny temat. 6

Literatura podstawowa: 1. Notatki wykładowe. 2. Dokumentacja technologii CUDA, OpenCL i C++AMP. Literatura dodatkowa: 1. W. Malina, M. Smiatacz: "Metody cyfrowego przetwarzania obrazów", EXIT, 2005 2. A. Grama: "Introduction to Parallell Computing", Pearson, 2003. 3. R. Wyrzykowski: "Klastry komputerów PC i architektury wielordzeniowe: budowa i wykorzystanie", AOW Exit, 2009. 4. R.O. Duda: "Pattern Classification (2nd Edition)", Wiley-Interscience, 2000. 5. R.Gaster i inni: Heterogeneous Computing with OpenCL ] 7

1. Zapoznanie się z możliwościami najnowszych technologii przetwarzania równoległego. 2. Zdobycie doświadczenia w implementacji wielowątkowych aplikacji w najnowszych technologiach umożliwiających współbieżność. 8

[źródło: http://www.piotrowice.katowice.pl/wp-content/uploads/2009/11/katowice_satelitarne.jpg] 9

Zadanie znajdź część wspólną tak, aby stworzyć obraz panoramiczny Wymagania podpikselowa dokładność (do ułamka piksela) [źródło: http://www.piotrowice.katowice.pl/wp-content/uploads/2009/11/katowice_satelitarne.jpg] 10

Typowa droga postępowania: wykryj punkty charakterystyczne (np. narożniki, T punkty SIFT, SURF, itp.), określ charakterystykę każdego z punktów, znajdź przekształcenie jednego z obrazów, które da najlepsze dopasowanie jak największej liczby punktów. Jacek Naruniec 11

Znajdź przekształcenie (translację, rotację, skalowanie), które najlepiej wpasuje oba obrazy na siebie. [źródło: http://www.piotrowice.katowice.pl/wp-content/uploads/2009/11/katowice_satelitarne.jpg] 12

Detekcja punktów szczególnych (SIFT) dla danych obrazów: ok. 27 sekund dla jednego procesora ok. 7 sekund dla czterech procesorów (3GHz) Obrazy były zmniejszone do wielkości ~1000x500 Oryginalne obrazy były wielkości ~3000x2000 Inne typowe wielkości takich obrazów to np. 17000x17000 pikseli, czyli ok. 500x większa powierzchnia niż 1000x500! 13

SLAM - Simultaneous localization and mapping automatyczne tworzenie map otoczenia przez robot wymaga szybkiego przetwarzania chmur punktów w celu lokalizacji jeszcze nieznanych terenów chmura może przykładowo zawierać 500000 punktów 14

Inne przykładowe problemy wymagające szybkich, równoległych obliczeń: przepowiadanie pogody, sztormów analiza danych finansowych wyszukiwanie informacji (data mining) kryptologia przetwarzanie danych radarowych modelowanie zjawisk fizycznych modelowanie urządzeń gry komputerowe W przetwarzaniu obrazów: trenowanie złożonych algorytmów klasyfikacyjnych filtracje obrazów operacje macierzowe/wektorowe (podstawowe, czy też transformaty) detekcja/śledzenie obiektów w czasie rzeczywistym programy graficzne 15

Przyspieszenie obliczeń możemy Z osiągnąć np. poprzez: optymalizację algorytmów zrównoleglenie zdań eliminowanie wąskich gardeł minimalizację dostępu IO minimalizację komunikacji między procesami 16

Zgodnie z prawem Moora (współzałożyciel Intela) liczba tranzystorów w układzie scalonym będzie podwajać się co 2 lata. W 2006 roku sam Moore stwierdził, że za 2 czy 3 lata prawo przestanie obowiązywać. Informacje producentów sprzętu (m.in. Intela) zaprzeczają temu i twierdzą, że trend będzie się utrzymywał. 17

[źródło: http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html] 18

[źródło: http://docs.nvidia.com/cuda/cuda-c-programming-guide/index.html] 19

Blue Gene (IBM) konstrukcje superkomputerów przetwarzających petabajty operacji / s stosowane, m.in. w symulacji wybuchów jądrowych (USA): testowanie nowych broni, symulowanie podziemnych wybuchów jądrowych. [https://asc.llnl.gov/publications/sequoia2012.pdf] 20

Ranking superkomputerów (www.top500.org) Z Rmax maksymalna wydajność otrzymana dla biblioteki LINPACK Rpeak teoretyczna szczytowa wydajność Cores liczba rdzeni 21

Obliczenia w chmurze. Z udostępniane wirtualne środowisko pracy do wykonywania obliczeń płacimy za określoną liczbę wykorzystywanych maszyn w czasie nie mamy fizycznego kontaktu ze sprzętem skalowalność! Amazon EC2 Google Cloud Windows Azure 22

Pamięć podręczna (cache) Szybka pamięć zawierająca najczęściej używane instrukcje, dane oraz odwzorowania adresów wirtualnych na adresy fizyczne. Prowadzi do minimalizacji dostępu do powolnych pamięci. Szybsza od pamięci w której znajdują się pełne dane. Może być wielopoziomowa (L1, L2, L3) CPU 0x25? 0x33 Cache Adres wartość 0x25 0x33 0x28 0xff 0x01 0x00 RAM Adres wartość 0x00 0x02 0x01 0x00 0x02 0x00 0x03 0x82 0x04 0xcd 0x05 0xff 23

Pamięć wirtualna odwzorowuje ciągłe, wirtualne adresy na fizyczne adresy w pamięci umożliwia, m.in. wykorzystanie przestrzeni dyskowej jako pamięci programu Pamięć wirtualna Adres 0x00 RAM 0x01 0x03 0x04 0x05 0x06 0x07 0x08 0x09 0x0A Dysk twardy 0x0B 24

Pamięć dzielona (shared) pamięć, do której wspólny dostęp ma wiele wątków aplikacji, jeden wątek może rezerwować obszar pamięci, inne korzystają z tego samego wątka. należy pamiętać (w szczególności przy GPU), że nie zawsze tworząc oddzielne podzadania mamy dostęp do tych samych obszarów pamięci! Wątek 1 Pamięć dzielona Adres wartość Wątek 3 0x00 0x02 0x01 0x00 0x02 0x00 0x03 0x82 0x04 0xcd 0x05 0xff Wątek 2 Wątek 4 25

Architektury komputerów: Single Instruction Single Data stream (SISD) (pojedyncza instrukcja, pojedynczy strumień danych) Najprostsza architektura procesorów nie umożliwiająca prawdziwej równoległości procesów. Natura sekwencyjna. jednostka sterująca instrukcja procesor dane pamięć 26

Architektury komputerów: Multiple Instruction Single Data stream (MISD) (wiele instrukcji, pojedynczy strumień danych) Wiele operacji operujących na tych samych danych. W praktyce w większości niespotykane niepraktyczne ze względu na czasy dostępu do pamięci. instrukcja 1 procesor jednostka sterująca dane dane pamięć instrukcja 2 procesor 27

Architektury komputerów: Single Instruction Multiple Data stream (SIMD) (pojedyncze instrukcje, wiele strumieni danych) Wiele procesorów w ramach jednej instrukcji przetwarza wiele danych. Powszechnie stosowane, np. SSE, SEE2, AVX, w GPU. jednostka sterująca instrukcja procesor dane 1 dane 2 pamięć instrukcja procesor 28

Architektury komputerów: Multiple Instruction Multiple Data stream (MIMD) (wiele instrukcji, wiele strumieni danych) Wiele procesorów przetwarza wiele danych przy pomocy różnych instrukcji. Spotykane np. w popularnych PCtach wielordzeniowych. jednostka sterująca Instrukcja 1 procesor dane 1 dane 2 pamięć Instrukcja 2 procesor 29

Proces: Jest to program dla którego system przygotowuje oddzielny zestaw zasobów, w tym pamięć, licznik rozkazów. Rozpoczyna się wywołaniem głównego wątku procesu. Wątek: Proces może wywołać wątki, które dzielą ze sobą zasoby systemowe i pamięć wirtualną. Każdy wątek ma swój unikalny identyfikator. 30

Wielozadaniowość (multitasking) pozwala na wykonywanie wielu zadań jednocześnie. nie musi oznaczać przetwarzania równoległego! jeśli mamy więcej zadań niż procesorów, zwykle przyjmowana jest zasada timeslicing, czyli przydzielanie po krótkim okresie czasu procesora każdemu zadaniu na zmianę czasy powinny być na tyle małe, aby nawet na procesorze jednordzeniowym mieć wrażenie jednoczesnego wykonania wielu zadań. procesor do zadania przydziela planista (sheduler), zgodnie z priorytetami 31

Przykład (multitasking): Zadanie wyświetlania (W), złożona operacja Załóżmy jeden procesor i zadania W i L występujące zawsze po sobie (jeden proces) wolny komputer czas [ms] 10 20 30 40 50 60 70 zadanie L(1) W(1) W(2) L(1) W(1) W(2) L(1) Zadanie kroku czasowego ligiki (L), szybka operacja szybki komputer czas [ms] 10 20 30 40 50 60 70 zadanie L(1) W(1) W(2) L(1) W(1) W(2) L(1) W(1) W(2) L(1) 32

Przykład (multitasking): Zadanie wyświetlania (W), złożona operacja Załóżmy jeden procesor i zadania W i L występujące w oddzielnych wątkach wolny komputer czas [ms] 10 20 30 40 50 60 70 zadanie L(1) W(1) L(1) W(2) L(1) W(1) L(1) Zadanie kroku czasowego ligiki (L), szybka operacja szybki komputer czas [ms] 10 20 30 40 50 60 70 zadanie L(1) W(1) W(2) L(1) W(1) W(2) L(1) W(1) W(2) L(1) 33

Wieloprocesorowość (multiprocessing) pozwala na wykonywanie wielu zadań jednocześnie na osobnych procesorach. rzeczywiste przetwarzanie równoległe wymaga obecności więcej niż jednego procesora time-slicing w przypadku większej liczby zadań niż procesorów 34

Przykład (multiprocessing): Zadanie wyświetlania (W), złożona operacja Załóżmy dwa procesory i zadania W i L występujące w oddzielnych wątkach wolny komputer czas [ms] 10 20 30 40 50 60 70 Procesor 1 L(1) L(1) L(1) L(1) Procesor 2 W(1) W(2) W(1) W(2) W(1) W(2) W(1) Zadanie kroku czasowego ligiki (L), szybka operacja szybki komputer czas [ms] 10 20 30 40 50 60 70 Procesor 1 L(1) L(1) L(1) L(1) Procesor 2 W(1) W(2) W(1) W(2) W(1) W(2) W(1) W(2) W(1) W(2) W(1) W(2) W(1) W(2) 35

Ziarnistość zadań określa nam liczbę i wielkość przetwarzanych zadań: drobnoziarniste: duża liczba małych zadań Przykład: obrót obrazu o wysokości h, szerokości w, gdzie dla każdego piksela tworzymy oddzielny wątek, otrzymując w*h procesów. Każdy wątek odczytuje wartość jednego piksela, znajduje jego nową pozycję i wpisuje ją do nowej tablicy zawierającej obrócony obraz. jeden wątek Czy taki algorytm byłby efektywny czy może lepiej podzielić obraz na większe bloki? 36

Ziarnistość zadań określa nam liczbę i wielkość przetwarzanych zadań: gruboziarniste: mała liczba dużych zadań Przykład: obrót obrazu o wysokości h, szerokości w, gdzie dla każdego bloku pikseli tworzymy oddzielny wątek, otrzymując w*h/(powierzchnia bloku) procesów. Każdy wątek odczytuje wartość pikseli bloku, znajduje ich nową pozycję i wpisuje je do nowej tablicy zawierającej obrócony obraz. jeden wątek Który algorytm będzie efektywniejszy? Na to pytanie odpowiemy sobie później. 37

Ziarnistość zadań określa nam liczbę i wielkość przetwarzanych zadań: Często specyfika aplikacji wymusza ziarnistość zadań. Bywa, że w jednej aplikacji mamy wymuszoną mieszaną ziarnistość. [źródło: R.Gaster i inni: Heterogeneous Computing with OpenCL ] 38

Dekompozycję pojedynczych zadań na podzadania mogące być wywołane równolegle można przedstawić w postaci grafów zależności zadań. W grafie tym węzeł będzie oznaczał zadanie, natomiast połączenie zależność. Kolejne zadanie nie może zostać wykonane dopóki wszystkie wchodzące do niego zależności nie są spełnione. Przykład: rozwiązanie równania macierzowego Y ( AB CD EF ) G HI AB CD EF (AB +CD+EF)G HI (AB +CD+EF)G + HI 39

Inny przykład: detekcja twarzy od szczegółu do ogółu 1 1. Pozyskanie obrazu wejściowego. 2. Detekcja konturów. 3. Detekcja punktów szczególnych w konturach. 4. Wybranie z wybranych punktów tych, które odpowiadają określonej części twarzy (oko, oko, nos, usta). 5. Wybranie kombinacji części twarzy tworzących całą twarz. 3 4 2 5 40

Ścieżka krytyczna jest to określona ścieżka w grafie zadań, której opóźnienie będzie oznaczać opóźnienie całego systemu. jest to najdłuższa ważona ścieżka grafu niewielkie opóźnienie pozostałych elementów nie wpłynie na długość wykonania procesu AB (8) CD (8) EF (10) (AB +CD+EF)G (40) HI (10) (AB +CD+EF)G + HI (10) 41

Zdarzenie synchroniczne Będziemy tutaj rozumieli jako funkcję, która po wywołaniu zwraca sterowanie do wywołującego wątku dopiero w momencie wykonania pełnej operacji. Zdarzenie asynchroniczne Będziemy tutaj rozumieli jako funkcję, która po wywołaniu zwraca sterowanie do wywołującego wątku natychmiast. Zakończenie zadania jest zwykle sygnalizowane przez określone zdarzenie. 42

Architektury heterogeniczne architektury komputerów przystosowane do rozwiązywania zadań o różnej naturze, np. o różnej ziarnistości. złożone z różnych podsystemów przykładem może być połączenie CPU z FPGA bądź CPU z GPGPU (General Purpose computing on Graphical Processing Unit). Współczesne komputery pozwalają na równoległe wykonywanie zadań GPU i CPU CPU zadania sekwencyjne GPU zadania silnie równoległe 43

Architektury heterogeniczne Cel naukowy stworzyć taką obsługę systemową, która dla zaprojektowanych zadań sama wybierze które urządzenie jest najlepsze dla danego zadania. CPU zadania sekwencyjne GPU zadania silnie równoległe 44

Problem pisarz/czytelnik Metody tworzenia wątków i synchronizacji między nimi. 45