background image

Programowanie współbieżne

Wprowadzenie do programowania współbieżnego.

Podstawowe pojęcia programowania współbieżnego.

Prowadzący: dr inż. Dariusz Pierzchała

dariusz.pierzchala@wat.edu.pl

background image

Literatura przedmiotu

1. Literatura obowiązkowa
1.1. M. Ben-Ari: „Podstawy programowania współbieżnego i rozproszonego”, WNT, Warszawa 2009.
1.2. M. Ben-Ari: „Podstawy programowania współbieżnego i rozproszonego”, WNT, Warszawa 1996, sygn. 

53403.

1.3. A. Karbowski, E. Niewiadomska-Szynkiewicz: „Programowanie równoległe i rozproszone”, Oficyna 

Wydawnicza PW, Warszawa 2009.

1.4. Z. Weiss, T. Gruźlewski: „Programowanie współbieżne i rozproszone w przykładach i zadaniach”, 

WNT, Warszawa 1993.

1.5. W. Stallings: „Systemy operacyjne. Struktura i zasady budowy”, PWN, Warszawa 2006 (niniejsza 

książka została również wydana przez Wydawnictwo Robomatic w 2004 roku pt. „Systemy 

operacyjne”).

1.6. A. Silberschatz, P. B. Galvin: „Podstawy systemów operacyjnych”, WNT, Warszawa 1993, 2000, 2005 

- sygn. 56239, 51409 i in.

1.7. A.S. Tanenbaum: „Systemy operacyjne”, Helion, 2010.
1.8. B. Goetz i in.: „Java. Współbieżność dla praktyków”, Helion, 2007.
1.9. M. Herlihy, N. Shavit: „Sztuka programowania wieloprocesorowego”, PWN, 2010.

2. Literatura uzupełniająca
2.1. J. Berdychowski, G. Bliźniuk: „Techniki programowania”, skrypt WAT, sygn. S-53260.
2.2. G. Gębal: „Programowanie współbieżne w Adzie”, Wydawnictwo Stachowski, 1999.
2.3. B. Goodheart, J. Cox: „Sekrety magicznego ogrodu. UNIX® System V Wersja 4 od środka”, WNT, 

Warszawa 2001.

2.4. U. Vahalia: „Jądro systemu UNIX. Nowe horyzonty”, WNT, Warszawa, 2001.
2.5. J. Richter: „Programowanie aplikacji dla Microsoft Windows”, Wydawnictwo RM, 2002.
2.6. C. Breshears: „The Art of Concurrency”, O’Reilly, 2009.
2.7. D. Harel: „Rzecz o istocie informatyki. Algorytmika”, WNT, 1992 i późn.
2.8. S. Wrycza, B. Marcinkowski, K. Wyrzykowski: „Język UML 2.0”, Helion, 2005.
2.9. J. Richter, Ch. Nasarre: „Windows via C/C++”, Microsoft Press, 2007.
2.10. J. Duffy: „Concurrent Programming on Windows”, Addison-Wesley, 2009.
2.11. Z. Huzar, Z. Fryźlewicz, I. Dubielewicz, B. Hnatk: „Ada 95”, Helion, Gliwice 1998.

background image

Literatura przedmiotu

background image

Podstawowe pojęcia programowania współbieżnego

4

Klasyczne (sekwencyjne) ujęcie 

programu komputerowego

Program komputerowy składa się z opisu (deklaracji) 
danych oraz wykonywalnych instrukcji (zapisanych w 
języku programowania);

Instrukcje te wykonywane są przez procesor (komputer);

W trakcie wykonywania programu niezbędne do realizacji 
dane przechowywane są w pamięci (podręcznej, 
wewnętrznej, zewnętrznej);

Jak może (lub powinien) być 
konstruowany program, 
gdy mamy do dyspozycji 
więcej niż jeden procesor?

 Architektura wg von Neumanna 

Spójrzmy na typowe zadania (logistyczne, matematyczne)

background image

Podstawowe pojęcia programowania współbieżnego

5

Transport towarowy

  

                1 auto x 25 ton x 5 godz.

       

czy…

5 aut x 25 ton x 1 godz.?

background image

Podstawowe pojęcia programowania współbieżnego

6

Algorytmy obliczania całki 

oznaczonej 

sekwencyjny 

czy

 równoległy?

Każde pole może 
być wyznaczone 
przez jeden lub 
wiele procesorów 
(jednocześnie)

Każde pole może 
być wyznaczone 
przez jeden lub 
wiele procesorów 
(jednocześnie)

background image

Podstawowe pojęcia programowania współbieżnego

7

Rodzaje równoległości

Równoległość procesowa - zbiór współpracujących 
elementów, z których każdy jest dość złożony i działa w sposób 
zbliżony, ale niekoniecznie identyczny z innymi; 
Przykłady:

działanie supermarketu, banku, poczty - wiele kas (okienek),

budowa - wielu murarzy, malarzy, tynkarzy, itp.

transport – konwój ciężarówek jednocześnie wiozących 
ładunek;

Obok równoległości procesowej wyróżnia się także:

równoległość tablicową (np. musztra, aerobik) - pełna 
synchronizacja działań,

równoległość potokową (np. taśma produkcyjna) - jednoczesne 
wykonywanie kolejnych etapów złożonego procesu

;

background image

Podstawowe pojęcia programowania współbieżnego

8

„Równoległe” ujęcie procesu 

(programu) 

Podsumowując - z jednej strony wiemy, że:

Wiele problemów (z różnych dziedzin życia) jest ze swej 
natury „równoległych”;

Jeśli programy komputerowe muszą oczekiwać na dane,  
może to powodować wytracanie czasu procesora; 

Z drugiej zaś strony:

Aktualne ceny i dostępność sprzętu o architekturze 
wieloprocesorowej, a także szybkie sieci komputerowe 
wymusiły rozwój algorytmów, protokołów, narzędzi, języków 
pozwalających na „zrównoleglenie” części zadań – tym 
samym przyspieszenie ich realizacji;

 

Niezbędne jest „zrównoleglenie” działania programów!

       

Pojęcie „równolegle” jest abstrakcyjnie – nadamy mu znaczenia w czasie zajęć.

Pojęcie „równolegle” jest abstrakcyjnie – nadamy mu znaczenia w czasie zajęć.

background image

Podstawowe pojęcia programowania współbieżnego

9

Rodzaje równoległości (1/2)

Równoległość na poziomie bitów (ang. bit-level 
parallelizm
) –zwiększanie długości słowa procesora wpływa 
na liczbę instrukcji potrzebnych do wykonania operacji na 
zmiennych, których wielkość jest większa niż długość słowa.

Równoległość na poziomie instrukcji (ang. instruction 
level parallelizm
) – techniki implementowane zazwyczaj 
przez kompilator i wykorzystujące specjalną budowę 
mikroprocesorów, które umożliwiają uruchamianie niezależnych 
od siebie instrukcji równocześnie – np. potokowość, 
wykonywanie poza kolejnością, wykonywanie spekulatywne.

Równoległość na poziomie danych (ang. data 
parallelizm
) – ten sam zbiór instrukcji jest jednocześnie 
wykonywany na wielu blokach danych – np. przetwarzanie 
SIMD.

background image

Podstawowe pojęcia programowania współbieżnego

10

Rodzaje równoległości (2/2)

Równoległość na poziomie pętli (ang. loop-level 
parallelizm
) –iteracje pętli w kodzie wykonywalnym 
rozdzielane są między dostępnymi jednostkami 
obliczeniowymi - np. model obliczeniowy OpenMP.

Równoległość na poziomie zadania (ang. task 
parallelizm
) –obliczenia realizowane są przez wiele 
jednostek obliczeniowych realizujących różne procesy 
sekwencyjne na tych samych lub różnych danych.

background image

Podstawowe pojęcia programowania współbieżnego

11

Równoległość na poziomie 

(pod)zadania 

Algorytm sekwencyjny:

Algorytm równoległy: 

START

STOP

Krok_1

Krok_2

Krok_4

Krok_6

Krok_3

Krok_5

START

STOP

Krok_1

Krok_2

Krok_3

Krok_4

Krok_5

Krok_6

Krok_2 i 
Krok_4 nie 
mogą być od 
siebie 
zależne!

background image

Podstawowe pojęcia programowania współbieżnego

12

Przykład - pierwiastki równania 

kwadratowego

START

STOP

=b

2

-4ac

x

1

=(-b-sqrt())/2a

x

2

=(-b+sqrt())/2a

Wypisz x

1

, x

2

START

STOP

=b

2

-4ac

x

1

=(-b-sqrt())/2a

x

2

=(-b+sqrt())/2a

Wypisz x

1

, x

2

Algorytm sekwencyjny:                           Algorytm 

równoległy:

background image

Podstawowe pojęcia programowania współbieżnego

13

Przykład – sortowanie tablicy N liczb

Algorytm sekwencyjny:

Algorytm sekwencyjny:

procedure sort (i, j)
 begin
   ...
   m := (i+j) div 2;
   
   sort (i, m);
   sort (m+1, j);
     
   merge (i, m, j);
 end

Algorytm równoległy:

procedure sort (i, j)
 begin
   ...
   m := (i+j) div 2;

cobegin

   sort (i, m);
   sort (m+1, j);

coend

   merge (i, m, j);
 end

 

cobegin

” i „

coend

” - specjalne instrukcje – kod między nimi wykonuje się 

współbieżnie

background image

Podstawowe pojęcia programowania współbieżnego

14

Programowanie współbieżne

Programowanie współbieżne (M. Ben-Ari) - zbiór technik i 
notacji programistycznych służących do wyrażania potencjalnej 
równoległości oraz do rozwiązywania zagadnień związanych
z powstającymi przy tym problemami: synchronizacji i 
komunikacji.

Programowanie współbieżne pozwala rozważać równoległość 
algorytmu obliczeniowego bez wdawania się w szczegóły 
implementacyjne 

(liczba procesorów, model procesu, model pamięci, 

implementacja obiektów synchronizacji, algorytm wznawiania 
procesów, mechanizmy komunikacji, itp.)

.

W istocie implementacja rzeczywistej równoległości 
(programowanie równoległe) jest zagadnieniem związanym z 
zasobami systemu komputerowego i w zasadzie niezależnym 
od programowania współbieżnego.

background image

Podstawowe pojęcia programowania współbieżnego

15

Programowanie:

- współbieżne, - równoległe, - 

rozproszone

PROGRAMOWANIE

ROZPROSZONE

(distributed)

PROGRAMOWANIE

RÓWNOLEGŁE

(parallel)

PROGRAMOWANIE

WSPÓŁBIEŻNE

(concurrent)

background image

Podstawowe pojęcia programowania współbieżnego

16

Programowanie:

- współbieżne, - równoległe, - 

rozproszone

- Architektura sprzętowa

Systemy z pamięcią 

współdzieloną

Wieloprocesory

Systemy ściśle powiązane

Systemy rozproszone

Multikomputery

Systemy luźno powiązane

background image

Podstawowe pojęcia programowania współbieżnego

17

Odmiany programowania 

współbieżnego

(z pominięciem programowania równoległego)

Programowanie współbieżne

Klasyczne

programowanie współbieżne

(systemy z pamięcią współdzieloną)

Współbieżność rozproszona

(systemy wieloprocesorowe

z pamięcią lokalną -

systemy rozproszone)

background image

Podstawowe pojęcia programowania współbieżnego

18

Współbieżność klasyczna i 

rozproszona

Klasyczne programowanie współbieżne - polega na 
dekompozycji problemu na wiele elementów 
oprogramowania, które są wykonywane przez pewną liczbę 
procesorów z pamięcią współdzieloną, tzw. systemy ściśle 
powiązane, inaczej systemy wieloprocesorowe.

Współbieżność rozproszona - polega na dekompozycji 
problemu na wiele elementów oprogramowania, które są 
wykonywane przez pewną liczbę niezależnych procesorów 
(własny zegar taktujący
i pamięć operacyjna) komunikujących się poprzez sieć 
połączeń
(np. sieć lokalna, przełącznica krzyżowa, itp.), czyli tzw. 
systemy luźno powiązane, inaczej systemy rozproszone.

background image

Podstawowe pojęcia programowania współbieżnego

19

Programowanie współbieżne

na tle innych dziedzin informatyki

                              Języki
                      programowania

                              Języki
                      programowania

            

            

Systemy

Systemy

          operacyjne

          operacyjne

            

            

Systemy

Systemy

          operacyjne

          operacyjne

Programowanie

Programowanie

współbieżne

współbieżne

• Większość języków programowania nie posiada mechanizmów 

programowania współbieżnego (równoległego);

• Pra–język C także nie został zaprojektowany do programowania 

zadań do współbieżnej realizacji - jednakże jako język systemu 
Unix może wywoływać funkcje systemowe;

• Pierwszym językiem dedykowanym była Ada (~1980r.);

• Kolejnym istotnie ważnym językiem (poza laboratoryjnymi 

rozwiązaniami) stała się Java;

• Większość języków programowania nie posiada mechanizmów 

programowania współbieżnego (równoległego);

• Pra–język C także nie został zaprojektowany do programowania 

zadań do współbieżnej realizacji - jednakże jako język systemu 
Unix może wywoływać funkcje systemowe;

• Pierwszym językiem dedykowanym była Ada (~1980r.);

• Kolejnym istotnie ważnym 

językiem (poza laboratoryjnymi 

rozwiązaniami) 

stała się Java

;

background image

Podstawowe pojęcia programowania współbieżnego

20

Języki i środowiska programowania współbieżnego

Z konstrukcjami programowania 

współbieżnego -

Concurrent Pascal, Concurrent C, CSP, Ada,

Modula, Java, C#, Linda, Occam, Orca

Umożliwiające programowanie 

współbieżne (C/C++, Delphi Pascal).

Język programowania nie zawiera 

mechanizmów synchronizacji procesów, lecz 

pozwala wykorzystywać obiekty synchronizacji 

dostarczane przez system operacyjny

Środowiska i biblioteki programowania 

równoległego i rozproszonego -

PVM, MPI, OpenMP, CUDA

background image

Podstawowe pojęcia programowania współbieżnego

21

Program sekwencyjny – program 

współbieżny

background image

Podstawowe pojęcia programowania współbieżnego

22

Program sekwencyjny

Program sekwencyjny

realizacja pojedynczego ciągu instrukcji;

zbiór operacji całkowicie uporządkowany w czasie.

Działanie programu sekwencyjnego polega na wykonywaniu 
kolejnych kroków obliczeń zgodnie z przyjętym algorytmem 
rozwiązania, przy czym warunkiem koniecznym wykonania 
następnego kroku jest zakończenie kroku poprzedniego.

W dowolnej chwili czasu jest wykonywany dokładnie jeden i 
tylko jeden krok (instrukcja) algorytmu.

 Należy zwrócić uwagę, że wyniki procesów sekwencyjnych można 

zawsze odtworzyć na podstawie danych wejściowych.
„Ta własność procesów sekwencyjnych wraz z ich szczególną 
prostotą powoduje że są one ważnymi składnikami służącymi do 
budowy obliczeń współbieżnych.” – 

Per Brinch Hansen „Podstawy systemów 

operacyjnych”, WNT 1979, str. 44

background image

Podstawowe pojęcia programowania współbieżnego

23

Program sekwencyjny – sekwencja 

procesów

czas

Proces 4

t

4P

P.. 3

t

3P

Proces 2

t

2P

Proces 1

t

1Z 

=

 

t

1P

t

2Z

t

iZ

 – czas żądania uruchomienia procesu

t

iP

 

– czas rozpoczęcia wykonywania procesu

gdzie i - numer procesu

t

3Z

t

4Z

t

= t

+ t

2

+ t

+ t

t

1

t

2

t

3

t

background image

Podstawowe pojęcia programowania współbieżnego

24

Program sekwencyjny

Program sekwencyjny może być:

skończony – osiąga stan końcowy w czasie 
skończonym:

typowy proces usługowy, np. wyliczenie wartości zmiennej;

nieskończony – realizuje algorytm dopóty, dopóki np. 
pracuje sprzęt i środowisko operacyjne (na którym został 
uruchomiony) lub nie został spełniony określony 
warunek końcowy :

interaktywny program reagujący na polecenia użytkownika 
napływające w losowych chwilach;

system operacyjny;

proces w błędnie zdefiniowanej nieskończonej pętli;

background image

Podstawowe pojęcia programowania współbieżnego

25

Program współbieżny

Program współbieżny jest zbiorem programów sekwencyjnych 
wykonywanych abstrakcyjnie „równolegle”.

Każdy program sekwencyjny wchodzący w skład programu 
współbieżnego będziemy nazywali procesem sekwencyjnym.

Każdy proces sekwencyjny może być realizowany na abstrakcyjnym 
(wirtualnym) procesorze – fizycznie występują różne architektury;

Mówimy, że dwa (lub więcej) procesy są współbieżne, jeśli jeden z 
nich rozpoczyna się przed zakończeniem drugiego;

W świetle tej definicji proces nieskończony jest współbieżny ze 
wszystkimi procesami, które rozpoczęły się od niego później;

 

 

Powyższa definicja mówi jedynie o potencjalnej równoległości.

Na poziomie sprzętu równoległość może być rzeczywista lub pozorna.
Gdy liczba procesorów dorównuje lub przewyższa liczbę procesów 
sekwencyjnych, to mówimy o równoległości rzeczywistej.
W przeciwnym przypadku mówimy o równoległości pozornej.

background image

Podstawowe pojęcia programowania współbieżnego

26

Program współbieżny

czas

Proces 4

P.. 3

Proces 2

Proces 1

t

1ZP

t

2ZP

t

3ZP

t

4ZP

t

<= t

+ t

2

+ t

+ t

t

1

t

2

t

3

t

background image

Podstawowe pojęcia programowania współbieżnego

27

Wieloprogramowość - wielozadaniowość

background image

Podstawowe pojęcia programowania współbieżnego

28

Wieloprogramowość i 

wielozadaniowość

(z punktu widzenia programowania 

współbieżnego)

Wieloprogramowość - jest współbieżnym wykonywaniem 
wielu niezależnych programów na jednym procesorze.

Obejmuje ona przełączanie procesora do innego programu, 
gdy aktualnie wykonywany zamówi operację WE/WY oraz 
systemu
z podziałem czasu procesora. 

Pojawienie się wieloprogramowości stworzyło konieczność 
synchronizacji pracy programów.

Wielozadaniowość (multitasking) - rozwiązywanie problemu 
przez jego dekompozycję na wiele procesów współbieżnych.

Wielozadaniowość jest metodą rozwiązania problemu.

Ziarnistość współbieżności;

 Należy zwrócić uwagę na różnice w definicjach powyższych pojęć w 

programowaniu współbieżnym oraz systemach operacyjnych.

background image

Podstawowe pojęcia programowania współbieżnego

29

Wieloprogramowość i 

wielozadaniowość

Ziarnistość programowania współbieżnego

Ziarnistość obliczeń nie jest pojęciem ścisłym - opisuje liczbę 
operacji obliczeniowych między punktami synchronizacji 
procesów oraz synchronizacji dostępu do danych (na maszynach 
z pamięcią wspólną) lub komunikacji (na maszynach z pamięcią 
lokalną).

W przypadku programowania współbieżnego zlicza się operacje 
między kolejnymi chwilami synchronizacji lub wymiany 
komunikatów.

Im większa jest liczba operacji, tym większa ziarnistość (grube 
ziarno, gruboziarnistość - ang. coarse grain). 

Ziarnistość mała (drobnoziarnistość -  ang. fine grain
występuje, gdy mała liczba danych przypada na procesor, 
natomiast jest duża częstotliwość komunikacji i synchronizacji.

Im „mniejsze” procesy, tym więcej możliwej współbieżności
ale także większy narzut czasu obsługi.

background image

Podstawowe pojęcia programowania współbieżnego

30

Prawo Amdahl’a (1967) 

http://en.wikipedia.org/wiki/File:AmdahlsLaw.svg

Potencjalne możliwe przyśpieszenie algorytmu jest równe:

n – liczba procesów,
T

1

 – czas wykonania (n=1),

T

n

 – czas wykonania dla n 

procesów,
F – udział części nierównoległej.

 Główny zarzut: prawo 

Amdahl’a ma zastosowanie 
tylko dla aplikacji z 
niezmiennym rozmiarem 
zadania

background image

Podstawowe pojęcia programowania współbieżnego

31

Zasady: (1) dekompozycji, (2) 

abstrakcji

(3) sprzyjania naturalnym ludzkim 

własnościom

„Dostatecznie zadawalający model 

funkcjonowania obiektów i systemów świata 

rzeczywistego”

powstaje poprzez zastosowanie zasad:

Zasada dekompozycji - rozdzielenie złożonego problemu na podproblemy, 

które można rozpatrywać i rozwiązywać niezależnie od siebie i niezależnie od 

całości  procesy sekwencyjne;

Zasada abstrakcji - eliminacja, ukrycie lub pominięcie mniej istotnych 

szczegółów rozważanego przedmiotu lub mniej istotnej informacji; 

wyodrębnianie cech wspólnych i niezmiennych dla pewnego zbioru bytów i 

wprowadzaniu pojęć lub symboli oznaczających takie cechy

 stany i oddziaływania procesów;

Zasada sprzyjania naturalnym ludzkim własnościom - dopasowanie 

modeli pojęciowych i modeli realizacyjnych systemów do wrodzonych ludzkich 

własności psychologicznych, instynktów oraz mentalnych mechanizmów 

percepcji i rozumienia świata.

 Powyższe zasady + (4-ta) zasada ponownego użycia 

 podstawowe 

zasady inżynierii oprogramowania!

background image

Podstawowe pojęcia programowania współbieżnego

32

Abstrakcja programowania 

współbieżnego (1/2)

Dwiema najważniejszymi technikami stosowanymi przy 
tworzeniu abstrakcji programistycznych są:

modularność (hermetyzacja, enkapsulacja),

współbieżność.

Programowanie współbieżne jest abstrakcją stworzoną w 
celu modelowania i wnioskowania o dynamicznym 
zachowaniu programów.

Abstrakcja programowania współbieżnego polega na 
modelowaniu i badaniu przeplatanych ciągów wykonań 
atomowych instrukcji procesów sekwencyjnych.

background image

Podstawowe pojęcia programowania współbieżnego

33

Abstrakcja programowania 

współbieżnego (2/2)

Abstrakcja programowania współbieżnego obejmuje:

1.

 model wzajemnych oddziaływań procesów,

2.

 instrukcje atomowe,

3.

 czas,

4.

 przeplot,

5.

 poprawność programu.

background image

Podstawowe pojęcia programowania współbieżnego

34

Proces a wątek  (1/2)

Abstrakcja procesu sekwencyjnego jest fizycznie realizowana 
przez:

Proces (systemu operacyjnego):

program z danymi wykonywany pod kontrolą systemu 
operacyjnego, posiadający przydzielone zasoby (pamięć, 
urządzenia we/wy) i rywalizujący o dostęp do procesora; 

Wątek (thread) – lekki proces (lightweight process)

część programu, która może być wykonywana niezależnie od 
innych części;

kod i dane są często współdzielone między wątkami;

każdy wątek posiada własny wirtualny procesor;

pracą wątków steruje planista wątków (thread scheduler);

wiąże się z tym pojęcie wielowątkowści (multithreading);

   Uwaga – np. w Java każdy program jest wielowątkowy!

background image

Podstawowe pojęcia programowania współbieżnego

35

Proces a wątek 2/2

W

ą

te

k

 g

łó

w

n

y

Proces

W

ą

te

k

W

ą

te

k

W

ą

te

k

W

ą

te

k

Zasoby

Zasoby

W

ą

te

k

Zasoby

I/O

Gotowy do uruchomienia (ang. ready to run)

Zawieszony (ang. suspended)

Wznowiony (ang. resumed)

Zablokowany (ang. blocked)

Zakończony (ang. terminated)

Działający (ang. running)

Zazwyczaj jest również wątkiem kończącym wykonywanie 

programu

Jest to wątek, od którego pochodzą inne wątki 

„potomne”

background image

Podstawowe pojęcia programowania współbieżnego

36

Model wzajemnych oddziaływań 

procesów (1/4)

Zajmujemy się abstrakcjami, w których procesy ze sobą 
współpracują lub między sobą współzawodniczą;

Współpraca wymaga od procesów komunikowania się – 
wykonanie jednego wymaga informacji wytworzonej w innym;

Współzawodnictwo wymaga wzajemnego wykluczania

  W ogólności różne procesy wykonywane jednocześnie na  wielu 

niepołączonych procesorach (komputerach), niezależnie od 
siebie, także można nazwać współbieżnymi 
– takie przypadki nie są jednak dla nas interesujące, gdyż nie 
wymagają dodatkowych mechanizmów ani na wielu procesorach 
ani na jednym (wystarcza cykliczne przełączanie przez system 
operacyjny);

background image

Podstawowe pojęcia programowania współbieżnego

37

Model wzajemnych oddziaływań 

procesów (2/4)

 Powyższy rysunek odpowiada teoretycznemu spojrzeniu na 

program współbieżny. Rzeczywisty obraz programu jest uzależniony 
od zastosowanego języka programowania, systemu operacyjnego, 
bibliotek i/lub obiektów synchronizacji.

proces

sekwencyjny

proces

sekwencyjny

proces

sekwencyjny

proces

sekwencyjny

program współbieżny

współdzielony 

zasób

komunikat

próba 

zajęcia

próba 

zajęcia

background image

Podstawowe pojęcia programowania współbieżnego

38

Model wzajemnych oddziaływań 

procesów (3/4)

(

wg M. Ben-Ari

)

Komunikacja (kooperacja):

występuje, gdy procesy realizują oddzielne zadania, lecz w sumie 
działają, aby osiągnąć wspólny cel;

w trakcie działania procesy mogą chcieć przesłać dane;

wymaga to uporządkowania w czasie (synchronizowania), np. 
dane procesu P1 muszą być utworzone zanim zostaną wykorzystane w 
P2;

Współzawodnictwo:

dwa procesy ubiegają się o ten sam zasób – np. obliczeniowy, 
dostęp do pewnej komórki pamięci lub kanału komunikacyjnego;

współzawodnictwo zawsze wymaga synchronizacji, w tym 
rozwiązania problemu wzajemnego wykluczania;

Synchronizacja w komunikacji nie musi wymagać wzajemnego 
wykluczania;

background image

Podstawowe pojęcia programowania współbieżnego

39

Wzajemne oddziaływania procesów 

(4/4)

(

William Stalling „Systemy operacyjne”, Wyd. 

Robomatic, 2004

)

Stopień zależności

Relacje

Wpływ jednego 

procesu na inny

Potencjalne 

sposoby 

sterowania

Procesy niezależne od 
siebie

Rywalizacja
(współzawodnictwo)

1. Wynik jednego procesu 
nie zależy od działań 
pozostałych
2. Możliwe jest 
oddziaływanie na tempo 
wykonywania procesu

1. Wzajemne 
wykluczanie
2. Blokowanie (zasoby 
wymienne)
3. Zagłodzenia

Procesy pośrednio 
zależne od siebie
(poprzez obiekty 
współdzielone)

Współpraca poprzez 
wspólne 
wykorzystywanie 
obiektów

1. Wynik jednego procesu 
może zależeć od danych 
otrzymanych od innych
2. Możliwy jest wpływ na 
tempo wykonywania 
procesu

1. Wzajemne 
wykluczanie
2. Blokowanie (zasoby 
wymienne)
3. Zagłodzenia
4. Zachowanie spójności 
danych

Procesy bezpośrednio 
zależne od siebie
(korzystanie z 
elementarnych procedur 
komunikacyjnych)

Współpraca poprzez 
komunikację

1. Wynik jednego procesu 
może zależeć od danych 
otrzymanych od innych
2. Możliwy jest wpływ na 
tempo wykonywania 
procesu

1. Blokowanie (zasoby 
wyczerpywalne)
2. Zagłodzenia

background image

Podstawowe pojęcia programowania współbieżnego

40

Instrukcje atomowe (1/3)

Przez instrukcje atomowe rozumie się podzbiór wybranych 
rozkazów procesora realizujących algorytm współbieżny.

Wymaganie atomowości instrukcji odnosi się do koncepcji, w 
której operacje na obiekcie wykonuje się jako sekwencje, 
charakteryzujące się dwiema cechami:

1.

 niepodzielności – stan „przed” i stan „po”,

2.

 nieprzerywalności – jeżeli się rozpoczęła, to musi się 

zakończyć.

Atomowość instrukcji oznacza, że niezależnie od sposobu 
implementacji instrukcji w procesorze jest ona wykonywana
w całości
.

W trakcie jej wykonywania nie są obsługiwane żadne 
przerwania.

Instrukcje atomowe są bardzo ważnym założeniem 
programowania współbieżnego, gdyż pozwalają osiągnąć 
jednoznaczność wyniku instrukcji.

background image

Podstawowe pojęcia programowania współbieżnego

41

Instrukcje atomowe – przykłady - 

poziom CPU (2/3)

Procesor UltraSPARC:

-

 ldstub (load and store unsigned byte),

-

 cas (compare and swap),

-

 swap (swap byte locations).

Procesor Intel Pentium:

-

 cmpxchgl (compare/exchange long; CAS – compare-and-

swap).

Procesor Alpha AXP:

-

 ldl_l/stl_c (load-linked/store-conditioanal LL/SC).

Procesor IBM PowerPC:

-

 lwarx/stwcx (load-linked/store-conditioanal LL/SC).

Procesor MIPS:

-

 ll/sc (load-linked/store-conditioanal LL/SC).

Procesor ARM:

-

 ldrex/strex (load-linked/store-conditioanal LL/SC).

background image

Podstawowe pojęcia programowania współbieżnego

42

Instrukcje atomowe – przykłady

– języki programowania (3/3)

W języku Java pakiet java.util.concurrent.atomic 
dostarcza atomowych typów danych:
AtomicBoolean,
AtomicInteger,
AtomicLong,
AtomicReference

Metoda compareAndSet() w Java implementuje prymityw 
synchronizacyjny CAS (porównaj aktualną wartość z zadaną 
i jeśli są równe, to podstaw nową wartość);

C# dostarcza analogiczną funkcjonalność poprzez metodę 
Interlocked.CompareExchange;

background image

Podstawowe pojęcia programowania współbieżnego

43

Czas

Czas wykonania instrukcji na różnych procesorach może 
być różny;

Abstrakcja programowania współbieżnego zakłada 
ignorowanie czasu

Niedopuszczalna jest zależność czasowa między 
procesami!

Interesuje nas poprawność wykonania ciągu instrukcji;

Na wynik analizy poprawności algorytmu nie ma i nie 
może mieć wpływu rzeczywisty upływ czasu;

czas

pobier
z

dodaj

mnóż

zapamięt
aj

pobier
z

dodaj

mnóż

zapamięt
aj

realnie różne czasy 
wykonania
modelowo równe 
(jednostkowe) czasy 
wykonania

background image

Podstawowe pojęcia programowania współbieżnego

44

Przeplot (interleave) (1/3)

Instrukcje atomowe wchodzące w skład wszystkich 
procesów programu współbieżnego przeplatają się 
między sobą;

Możliwe są dowolne kombinacje ciągu wykonań instrukcji;

Jeżeli rozważymy przypadek dwóch instrukcji I1 i I2 w 
dwóch procesach P1 i P2, to muszą one spełniać warunek:

 koniec(I1) <= początek(I2) 

(„Przypadek 1”)

Wykluczamy „Przypadek 2” 

początek(I2) < koniec(I1)

gdyż wynik dwu jednocześnie wykonywanych instrukcji 
musi być taki sam, jak wynik każdego z dwu możliwych 
ciągów uzyskanych przez wykonanie tych instrukcji jedna 
po drugiej;

I1

I2

I1

I2

czas

Przypadek 2

Przypadek 1

background image

Podstawowe pojęcia programowania współbieżnego

45

Przeplot (interleave) (2/3)

Procesory, które przetwarzają procesy programu współbieżnego 
mogą działać z różną szybkością - powoduje to losowość przeplotu;

Poprawnie skonstruowany program współbieżny musi być 
poprawny przy wszystkich przeplotach powstałych na różnych 
procesorach;

Niech algorytm procesu sekwencyjnego P1 składa się z instrukcji:
P_1: 

i11, i12, i13

Niech algorytm procesu sekwencyjnego P1 składa się z instrukcji:
P_2: 

i21, i22, i23

Możliwe są przeploty:
PRZ_1: 

i11, i21, i12, i22, i13, i23

PRZ_2: 

i21, i22, i11, i12, i13, i23

Przeplot:
PRZ_3: 

i11, i22, i21, i12, i23, i13

jest niedopuszczalny (błędny). Dlaczego?

Nie wszystkie przeploty współbieżnych procesów są 
dopuszczalne z punktu widzenie oczekiwanego 
wyniku.

Stąd potrzeba zarządcy procesów współbieżnych 
(planisty) odpowiedzialnego za sterowanie 
procesami. 

Mając ciągi instrukcji przynależne do zbioru 
procesów ma on zadanie skonstruowania 
poprawnego przeplotu

Nie wszystkie przeploty współbieżnych procesów są 
dopuszczalne z punktu widzenie oczekiwanego 
wyniku.

Stąd potrzeba zarządcy procesów współbieżnych 
(planisty) odpowiedzialnego za sterowanie 
procesami. 

Mając ciągi instrukcji przynależne do zbioru 
procesów ma on zadanie skonstruowania 
poprawnego przeplotu

background image

Podstawowe pojęcia programowania współbieżnego

46

Przeplot (interleave) (3/3)

Uwaga:

poprawny program współbieżny działa dobrze dla 
każdego przeplotu; 

program współbieżny nie działa poprawnie, gdy istnieje 
co najmniej jeden przeplot, przy którym dochodzi do 
sytuacji błędnej;

Istnienie przeplotu w programach współbieżnych: 

implikuje konieczność specyfikacji zbioru poprawnych 
przeplotów;

jest przyczyną trudności w badaniu poprawności 
programu: formalnym (teoretycznym) oraz praktycznym;

background image

Podstawowe pojęcia programowania współbieżnego

47

Poprawność programu

background image

Podstawowe pojęcia programowania współbieżnego

48

Poprawność programów 

(sekwencyjnych)

Pojęcie poprawności programów sekwencyjnych jest następujące: 
Program jest poprawny, jeśli: 

kończy się (zatrzymuje)

oraz zwraca poprawny wynik;

W przypadku programów współbieżnych jest to słuszne w 
ograniczonych przypadkach (np. sortowanie), gdyż cechą wielu 
programów współbieżnych (np. systemów operacyjnych, systemów 
czasu rzeczywistego) jest to, że działają w nieskończonej pętli;

Istnieją dwie definicje poprawności dla programów sekwencyjnych, 
różniące się podejściem co do zakończenia programu. 

Przyjmijmy, że: 

zmienne wejściowe 

x

 spełniają warunek P(

x

) – tzw. precondition

zmienne wejściowe 

x

 i wyjściowe 

y

 spełniają warunek Q(

x

,

y

). 

background image

Podstawowe pojęcia programowania współbieżnego

49

Częściowa poprawność

Dla dowolnych wartości 

a

 zmiennych wejściowych definiujemy 

Poprawność częściową (lokalną) – partial correctness

Jeśli zachodzi P(

a

jeżeli program uruchomiony z 

a

 jako wartościami zmiennych 

wejściowych 

x

 zatrzymuje się, 

to zachodzi Q(

a

,

b

), gdzie 

b

 są poprawnymi wartościami 

zmiennych wyjściowych w chwili jego zakończenia.

Częściowa poprawność zakłada, że jeśli program zatrzyma się, 
to odpowiedzi muszą być „poprawne”
.

Przy badaniu poprawności częściowej nie bierze się pod uwagę, czy 
program się zakończył czy nie!

Analogią dla częściowej poprawności jest tzw. własność 
bezpieczeństwa 
(safety) programu współbieżnego - musi być 
zawsze spełniona
!

background image

Podstawowe pojęcia programowania współbieżnego

50

Całkowita poprawność

Poprawność całkowita (globalna) – total correctness

:

Każde wykonanie programu kończy się

oraz spełnione są P(

a

) i Q(

a

,

b

);

Całkowita poprawność określa zatem, że program zakończy 
swoje działanie i wyniki będą „poprawne” (spełnią 
warunek Q)
.

Kończenie się programu dla wszystkich prawidłowych danych 
wejściowych (spełniających P(a)) nazywane jest także 
warunkiem stopu (stop condition).

W praktyce dowodzi się częściową poprawność programu oraz 
spełnienie warunku stopu;

Analogią dla całkowitej poprawności jest tzw. własność 
żywotności 
(liveness) programu współbieżnego – musi być 
kiedyś spełniona (teraz lub w przyszłości);
 

background image

Podstawowe pojęcia programowania współbieżnego

51

Poprawność programu 

współbieżnego

(wg M. Ben-Ari, „Podstawy programowania 

współbieżnego i rozproszonego”, WNT, Warszawa 1996 )

 

Własność bezpieczeństwa 

określa własności statyczne 

poprawnego 
     programu współbieżnego – zawsze muszą być spełnione;

 

Własność żywotności 

dotyczy własności dynamicznych – 

kiedyś muszą 
     być spełnione;

poprawność 

własność 

bezpieczeństwa

wzajemne wykluczanie

(mutual exclusion)

własność żywotności

wykluczenie zagłodzenia

(starvation)

własność uczciwości

(fairness)

brak zakleszczeń

(deadlock)

background image

Podstawowe pojęcia programowania współbieżnego

52

Poprawność programu 

współbieżnego

(m. in. po uwzględnieniu zmian w terminologii)

Zakleszczenie  nazywane  jest  również  blokadą  (M.  Ben-Ari:  „Podstawy  programowania 
współbieżnego  i  rozproszonego”,  WNT,  1996;  M.  Ben-Ari:  „Podstawy  programowania 
współbieżnego”,  WNT,  1989;  A.  Silberschatz  i  in.:  „Podstawy  systemów  operacyjnych”,  WNT, 
1993), impasem (W. Stallings: „Systemy operacyjne. Struktura i zasady budowy”, PWN, 2006), 
zastojem (A.S. Tanenbaum: „Rozproszone systemy operacyjne”, PWN, 1997) a nawet martwym 
punktem (Z. Weiss, T. Gruźlewski: „Programowanie współbieżne i rozproszone”, WNT, 1993).

poprawność 

własność 

bezpieczeństwa

wzajemne wykluczanie

własność żywotności

wykluczenie zagłodzenia

własność uczciwości

brak zakleszczeń 

(zastojów, impasów, 
blokad)

brak lokalnych i/lub 
globalnych blokad i 
in. (np. livelock
 - 
uwięzień)

background image

Podstawowe pojęcia programowania współbieżnego

53

Poprawność – bezpieczeństwo i 

żywotność

Ilustracją dla własności bezpieczeństwa i żywotności może być 
sytuacja na skrzyżowaniu drogowym:

Własność bezpieczeństwa: na poprawnie działającym 
skrzyżowaniu nigdy jednocześnie nie znajdą się pojazdy 
jadące w kierunkach „wschód-zachód” i „północ-południe”;

Własność żywotności: każdy pojazd, który zamierza 
przejechać przez skrzyżowanie, kiedyś przez nie przejedzie;

background image

Podstawowe pojęcia programowania współbieżnego

54

Poprawność – bezpieczeństwo i 

żywotność

Dowodzenie poprawności nawet bardzo prostych programów 
nie jest rzeczą łatwą, ale dowodzenie własności 
bezpieczeństwa i żywotności 
jest jeszcze trudniejsze.

Metody dowodzenia poprawności wykorzystują techniki znane z 
dowodzenia poprawności algorytmów:

oparte o logikę:

własność częściowej poprawności (logika pierwszego rzędu),

logika Hoare’go,

własność stopu (tzw. całkowita poprawność)

oraz inne:

logiki: temporalna (algorytmy i programy reaktywne), modalna,

specyfikacja algebraiczna,

wykorzystanie modeli abstrakcyjnych (programowanie 
obiektowe).

background image

Podstawowe pojęcia programowania współbieżnego

55

Podstawowe problemy synchronizacji w 

programowaniu współbieżnym

background image

Podstawowe pojęcia programowania współbieżnego

56

Wykluczanie, zakleszczenia, 

zagłodzenia i blokady

w programach współbieżnych

W życiu codziennym powszechna jest rywalizacja o wspólne 
zasoby, oczekiwanie aktywne lub pasywne na, rezygnacja z nich 
lub zaprzestanie działania w przypadku ich braku;

Np. dwie osoby chcą jednocześnie wykorzystać wspólną łazienka, 
telefon, skrzyżowanie, obsługa w okienku (a raczej jej działanie);  

Brak rozwiązania tego problemu wyklucza wspólne 
funkcjonowanie:

1.

 naprzemienne wykonywanie (przeplot) niektórych czynności,

2.

 naprzemienne korzystanie z tego samego zasobu;

Rozwiązaniem jest stosowanie:

zwykłej uczciwości i uprzejmości;

dobrych obyczajów i reguł niesformalizowanych;

przepisów, zasad, regulaminów, etc; 

stosowanie wzajemnego wykluczania

background image

Podstawowe pojęcia programowania współbieżnego

57

Wykluczanie, zakleszczenia, 

zagłodzenia i blokady

w programach 

współbieżnych

Skupmy się na problemach synchronizacji podstawowych 
dla teorii i praktyki programowania współbieżnego:

wykluczanie procesu współbieżnego (ang. lockout)

zakleszczenie procesu współbieżnego (ang. deadlock, 
tackle)

zagłodzenie procesu współbieżnego (ang. starvation)

blokada procesu współbieżnego (ang. blockade, lock),

background image

Podstawowe pojęcia programowania współbieżnego

58

Problem wzajemnego wykluczania

Problem (i potrzeba) wzajemnego wykluczania w programowaniu 
współbieżnym występuje, gdy co najmniej dwa procesy nie mogą:

1.

 przeplatać pewnych ciągów instrukcji,

2.

 jednocześnie korzystać z tego samego zasobu.

Wspólny zasób nosi nazwę krytycznego;

Schemat pracy procesów współbieżnych wyglądać może następująco:

begin 

while true do 

begin 

• lokalne_obliczenia; 
• protokół_wstępny; 

sekcja_krytyczna; 

• protokół_końcowy; 

end 

end;

Sekcja_krytyczna to fragment programu, który może być 
jednocześnie wykonywany przez co najwyżej jeden proces.

background image

Podstawowe pojęcia programowania współbieżnego

59

Problem wzajemnego wykluczania

Zatem problem wzajemnego wykluczania można zdefiniować: 

Zsynchronizować N procesów, z których każdy

w nieskończonej pętli na przemian zajmuje się własnymi obliczeniami 

a następnie wykonuje działania na części współdzielonej, 

• w taki sposób, aby wykonanie tej części w dwóch lub więcej procesach nie 

pokrywało się w czasie;

Należy zapewnić spełnienie zasad:

W sekcji krytycznej może przebywać co najwyżej jeden proces 
jednocześnie (bezpieczeństwo).

Każdy proces, który chce wykonać sekcję krytyczną, w 
skończonym czasie powinien do niej wejść (żywotność).

Protokoły wstępny i końcowy korzysta z dostępnych mechanizmów 
synchronizacyjnych;

W przypadku braku wsparcia ze strony systemu operacyjnego należy 
zastosować algorytmy synchronizacyjne, np. algorytm Petersona;

background image

Podstawowe pojęcia programowania współbieżnego

60

Zakleszczenia procesów 

współbieżnych

Warunkiem zakleszczenia procesu współbieżnego jest 
procesu żądania równoczesnego dostępu do więcej niż 
jednego współdzielonego zasobu przez jeden proces.

Proces współbieżny po zajęciu jednego z zasobów 
bezskutecznie usiłuje zająć pozostałe z potrzebnych mu 
zasobów równocześnie nie zwalniając uprzednio zajętego 
zasobu(ów).

W tym czasie każdy z zasobów, który został wywłaszczony 
przez zakleszczony proces współbieżny jest blokowany 
dla pozostałych procesów oczekujących na ten zasób.

Wyróżnia się: 

zakleszczenia symetryczne

cykle zakleszczeń symetrycznych.

background image

Podstawowe pojęcia programowania współbieżnego

61

Warunki Coffmana – Warunki 

konieczne dla wystąpienia 

zakleszczenia procesów

Wzajemne wykluczanie (Mutual exclusion condition)

Każdy z zasobów jest w stanie: wolny albo zajęty (przez dokładnie jeden 
proces);

Szeregowanie bez wywłaszczania (No prememption condition)

Zasoby nie podlegają wywłaszczeniu - zasób zajęty przez pewien 
proces może być zwolniony tylko przez ten sam proces;

Częściowy przydział - przetrzymywanie i oczekiwanie (Wait and hold 
condition
)

Proces posiadający pewien zasób może żądać innego zasobu;

Wzajemne czekanie - oczekiwanie cykliczne (Circular wait condition)

Musi istnieć zamknięty łańcuch procesów oczekujących na zasób 
zajęty przez następnika (‚1’ na ‚2’…‚i’ na ‚i+1’…‚N’ na ‚1’) 

 Zapobieganie zakleszczeniom jest możliwe, jeśli jeden lub więcej z 

warunków koniecznych nigdy nie będzie spełniony.

background image

Podstawowe pojęcia programowania współbieżnego

62

Przykładowe powody braku 

żywotności (1/4)

Ac1

Ac2

R1

R2

dostęp

dostęp

żądanie

proces

zakleszczony:

Ac1

background image

Podstawowe pojęcia programowania współbieżnego

63

Przykładowe powody braku 

żywotności (2/4)

Symetryczne zakleszczenia procesów

Zakleszczenie symetryczne jest uważane za 
klasyczny przykład zakleszczenia:

Ac1

Ac2

R1

R2

żądanie

dostęp

dostęp

procesy

zakleszczone:

Ac1, Ac2

background image

Podstawowe pojęcia programowania współbieżnego

64

Przykładowe powody braku 

żywotności (3/4)

procesy

zakleszczone:

Ac1, Ac2, Ac3

Acp

Ac1

R1

R2

Ac2

R3

Ac3

Rp

dostęp

żądanie

background image

Podstawowe pojęcia programowania współbieżnego

65

Przykładowe powody braku 

żywotności (4/4)

Cykl zakleszczeń procesów

procesy

zakleszczone:

Ac1, Ac2,    

Ac3, ..., Acn

Acn

Ac1

R1

R2

Ac2

R3

Ac3

Rn

żądanie

dostęp

background image

Podstawowe pojęcia programowania współbieżnego

66

Wykluczanie się procesów 

współbieżnych

W czasie wykonywania się programu współbieżnego działa 
tzw. planista (zarządca);

Jest to składowa oprogramowania systemowego 
odpowiedzialna za sprawiedliwe (uczciwe) dopuszczanie do 
zasobów procesów oczekujących na ich usługi;

Jeżeli jednak w działającym programie współbieżnym 
występują takie procesy, które pomimo dopełnienia 
wszelkich warunków niezbędnych dla poinformowania 
planisty o tym, że oczekują one na dostęp do zasobów 
współdzielonych, takiego dostępu nie otrzymują, to mówi 
się o nich, że są wykluczane;

Inaczej o takich procesach mówi się, że są głodzone;

background image

Podstawowe pojęcia programowania współbieżnego

67

Efekt (zjawisko) zagłodzenia 

procesu współbieżnego

Głodzenie procesów współbieżnych może być spowodowane 
brakiem uczciwości w działaniu planisty lub zakleszczeniami 
procesów współbieżnych;

Końcowym stanem nieskończonego wstrzymywania 
(blokowania, głodzenia) procesu jest efekt zagłodzenia 
(starvation), lub inaczej wykluczenia.

Mimo że możliwość zagłodzenia świadczy o niepoprawności 
programu, to czasami jest akceptowane (na przykład 
wszędzie tam, gdzie stosuje się kolejkę priorytetową). 

Wynika to z faktu, że zagłodzenie jest zwykle mało 
prawdopodobne.

background image

Podstawowe pojęcia programowania współbieżnego

68

Oczekiwanie procesu na 

wywłaszczenie zasobu 

współdzielonego

Blokada procesu

Występują dwa sposoby oczekiwania procesu 

współbieżnego na udostępnienie przez „planistę” 

współdzielonego zasobu:

aktywne czekanie (ang. busy-waiting) – proces 

samoczynnie co pewien interwał czasowy ponawia 

swoje żądanie dostępu do zasobu:

trwałe aktywne czekanie – proces ponawia żądania 

dostępu aż do skutecznego wywłaszczenia zasobu,

nietrwałe aktywne czekanie – proces ponawia żądanie 

dostępu do zasobu określoną liczbę razy, po czym 

przechodzi do pasywnego czekania.

pasywne czekanie – proces jednorazowo wysyła do 

„planisty” żądanie dostępu do zasobu, po czy przestaje 

być aktywny. Jedynie planista jest w stanie ponownie 

uaktywnić ten proces.

background image

Podstawowe pojęcia programowania współbieżnego

69

Globalna blokada programu 

współbieżnego

Globalna blokada programu współbieżnego (ang. global 
deadlock
) występuje wtedy, gdy w programie nie ma takiego 
procesu współbieżnego, który nie występowałby w stanie 
zagłodzenia albo w stanie zakleszczenia.

Nie można wtedy zidentyfikować w systemie żadnego 
procesu współbieżnego, który wykonywałby sensowną pracę. 

Zablokowany program współbieżny nie jest poprawny 
(bezpieczny, żywotny).

background image

Podstawowe pojęcia programowania współbieżnego

70

Własność uczciwości - rodzaje 

Uczciwość słaba - jeżeli proces nieprzerwanie zgłasza 
żądanie, to kiedyś będzie ono obsłużone.

Uczciwość mocna -  jeżeli proces zgłasza żądanie 
nieskończenie wiele razy, to kiedyś będzie ono obsłużone.

Oczekiwanie liniowe - jeżeli proces zgłasza żądanie, to 
będzie ono obsłużone zanim dowolny inny proces zostanie 
obsłużony więcej niż raz.

FIFO (pierwszy wszedł, pierwszy wyjdzie) - jeżeli proces 
zgłasza żądanie, to będzie ono obsłużone przed dowolnym 
żądaniem zgłoszonym później.

Uczciwość słaba i mocna ma znaczenie teoretyczne.

W praktyce jest stosowane oczekiwanie liniowe lub FIFO. 

Obydwa mogą być implementowane w systemach 
scentralizowanych -  w systemach rozproszonych występują 
problemy z realizacją algorytmu FIFO.

background image

Podstawowe pojęcia programowania współbieżnego

71

Zalecenia i przykłady

background image

Podstawowe pojęcia programowania współbieżnego

72

8 reguł projektowania aplikacji 

współbieżnych

(C. Breshears: „The Art of Concurrency”)

Reguła 1 – Zidentyfikuj naprawdę niezależne obliczenia

Reguła 2 – Implementuj współbieżność w możliwie 

najwyższej warstwie systemu komputerowego

Reguła 3 – Od początku planuj skalowanie aplikacji, aby 

wyzyskiwać możliwość zwiększenia liczby CPU

Reguła 4 – Wykorzystuj biblioteki bezpieczne wątkowo 

(ang. thread-safe libraries) gdziekolwiek to możliwe

Reguła 5 – Użyj właściwego modelu wątków (explicit vs. 

implicit thread model) – preferuj model typu „implicit

Reguła 6 – Nigdy nie zakładaj określonego porządku 

wykonywania instrukcji

Reguła 7 – Używaj zmiennych lokalnych w wątkach lub 

kojarz blokady (ang. locks) do określonych danych

Reguła 8 – Odważ się zmienić algorytm dla zwiększenia 

szansy na współbieżne wykonywanie

background image

Podstawowe pojęcia programowania współbieżnego

73

Całkowanie numeryczne (numerical 

integration)

static long num_rects = 100000;
void main () {
int i;
double mid, height, width, sum = 0.0;
double area;

width = 1.0/(double) num_rects;
for (i = 0; i < num_rects; i++) {

mid = (i + 0.5) * width;
height = 4.0/(1.0 + mid * mid);
sum += height;

}

area = width * sum;

printf("Computed pi = %f\n", area);
}

dx

x

1

0

2

1

4

background image

Podstawowe pojęcia programowania współbieżnego

74

Implicit Threading – ukryta 

współbieżność

np. Open MP, Intel Threading 

Building Blocks (TBB)

static long num_rects = 100000;

int main(int argc, char* argv[]) {
double mid, height, width, sum = 0.0;
int i;
double area;

width = 1.0/(double) num_rects;

#pragma omp parallel for private(mid, height) reduction(+:sum)

for (i = 0; i < num_rects; i++) {

mid = (i + 0.5) * width;
height = 4.0/(1.0 + mid * mid);
sum += height;

}

area = width * sum;
printf("Computed pi = %f\n", area);
return 0;
}

Zmienna środowiskowa OMP_NUM_THREADS określa liczbę wątków.

background image

Podstawowe pojęcia programowania współbieżnego

75

Explicit Threading – jawna 

współbieżność

np. POSIX threads (Pthreads), 

Windows Threads

#include <stdio.h>
#include <pthreads.h>

#define NUM_RECTS   100000
#define NUM_THREADS 4

double gArea = 0.0;
pthread_mutex_t gLock;

void *threadFunction(void *pArg) {
int myNum = *((int *) pArg);
double partialHeight = 0.0, lWidth = 1.0 / NUM_RECTS, x;

for (int i = myNum; i < NUM_RECTS; i += NUM_THREADS) {

x = (i + 0.5f) / NUM_RECTS;
partialHeight += 4.0f / (1.0f + x * x);

}

pthread_mutex_lock(&gLock);

gArea += partialHeigth * lWidth;

pthread_mutex_unlock(&gLock);
}

/* cd. następny slajd */

background image

Podstawowe pojęcia programowania współbieżnego

76

Explicit Threading – jawna 

współbieżność

np. POSIX threads (Pthreads) – cd.

/* cd. poprzedniego slajdu */
void main () {
pthread_t tHandles[NUM_THREADS];
int tNum[NUM_THREADS];

pthread_mutex_init(&gLock, NULL);
for (int i = 0; i < NUM_THREADS; i++) {

tNum[i] = i;

pthread_create(&tHandles[i], NULL, threadFunction, (void *)&tNum[i]);

}

for (int j=0; j < NUM_THREADS; j++) {

pthread_join(tHandles[j], NULL);

}

pthread_mutex_destroy(&gLock);
printf("Computed pi = %f\n", gArea);
}

background image

Podstawowe pojęcia programowania współbieżnego

77

Podsumowanie

background image

Podstawowe pojęcia programowania współbieżnego

78

Zalety obliczeń współbieżnych

Przyspieszenie obliczeń - możliwość szybszego uzyskania 
wyniku niż na najszybszej maszynie sekwencyjnej.

Zwiększenie niezawodności działania lub dokładności 
obliczeń.

Możliwość rozwiązania zadań zbyt dużych dla maszyn 
sekwencyjnych.

Obliczenia współbieżne pozwalają na lepsze 
(efektywniejsze) wykorzystanie instalacji maszyny cyfrowej, 
gdyż synchronizacyjne ograniczenia między fizycznymi 
składowymi są zredukowane do minimum.

Dostatecznie zadawalający model funkcjonowania 
obiektów
i systemów świata rzeczywistego.

background image

Podstawowe pojęcia programowania współbieżnego

79

Wady obliczeń współbieżnych

Konieczność dekompozycji problemu na niezależne od 
siebie części mogące być wykonywane równolegle.

Mechanizmy synchronizacji wprowadzają dodatkowy narzut 
czasowy na ich obsługę, co przy ich nieumiejętnej 
implementacji lub użyciu może nawet doprowadzić do 
zwiększenia czasu wykonania obliczeń.

Złożone testowanie programu wymagające uwzględnienia 
dynamiki zmian stanów procesów.

Wyniki obliczeń współbieżnych mogą być zależną od czasu 
funkcją danych wejściowych. Powtórzenie błędnego 
obliczenia, w celu umiejscowienia i poprawienia błędów, 
jest prawie niemożliwe.

background image

Podstawowe pojęcia programowania współbieżnego

80

Materiał dodatkowy

background image

Rozwój architektury komputerów

background image

Podstawowe pojęcia programowania współbieżnego

82

Inne definicje blokad 

background image

Podstawowe pojęcia programowania współbieżnego

83

Deadlock

, Livelock, Starvation

(wg Richard H. Carver, Kuo-Chung Tai: Modern 

Multithreading,

John Wiley&Sons, 2006)

Deadlock – wymaga jednego lub większej liczby na stałe 

zablokowanych procesów.

Proces P jest zablokowany jeśli się nie wykonuje i czeka na 

zajście pewnego zdarzenia, które nigdy nie zajdzie.

Ex: Załóżmy, że na końcu pracy programu współbieżnego CP 

istnieje proces P, który spełnia warunki:

a) proces P jest zablokowany podczas wykonywania pewnego 

kodu służącego synchronizacji (np. oczekiwanie na odebranie 

wiadomości),

b) proces P pozostaje zablokowany na zawsze, niezależnie od 

tego co zrobią inne procesy;

 Proces P jest zakleszczony (ang. deadlocked) a w programie 

CP wystąpiło zakleszczenie (ang. deadlock).

background image

Podstawowe pojęcia programowania współbieżnego

84

Deadlock, 

Livelock

, Starvation

(wg Richard H. Carver, Kuo-Chung Tai: Modern 

Multithreading,

John Wiley&Sons, 2006)

Livelock – analogiczna sytuacja do deadlock’a z aktywnym 
czekaniem.

Proces P wykonuje się (albo jest gotowy do działania), nie jest 
zablokowany, ale nigdy nie wykona żadnego postępu w 
realizacji algorytmu.

Ex: Załóżmy, że istnieje przeplot S programu współbieżnego 
CP, dla którego proces P spełnia warunki:

a) proces P nie jest zablokowany ani zakleszczony (ang. 

deadlock),

b) proces P nigdy nie wykonana postępu;
 Proces P jest wstrzymywany (ang. livelocked) a w programie 

CP wystąpiła blokada (ang. livelock).

background image

Podstawowe pojęcia programowania współbieżnego

85

Deadlock, Livelock, 

Starvation

(wg Richard H. Carver, Kuo-Chung Tai: Modern 

Multithreading,

John Wiley&Sons, 2006)

Starvation - zagłodzenie.

Ex: Załóżmy, że w programie współbieżnym CP istnieje 
przeplot S, dla którego na koniec cyklu są spełnione trzy 
warunki:

a) przeplot S zakończył się nieskończenie powtarzanym 

wykonaniem kodu spełniającego zasadę uczciwości,

b) istnieje niezakończony proces P, który nie wykonuje postępu 

w realizacji alorytmu,

c) proces P nie jest zakleszczony (ang. deadlock), ani 

wstrzymywany (ang. livelock);

 Proces P jest zagłodzony (ang. starved) a w programie CP 

wystąpiło zagłodzenie (ang. starvation).


Document Outline