SYSTEMY OPERACYJNE
dr. hab. Vitaliy Yakovyna
yakovyna@matman.uwm.edu.pl http://wmii.uwm.edu.pl/~yakovyna/
UNIWERSYTET WARMIŃSKO-MAZURSKI W OLSZTYNIE
Wydział Matematyki i Informatyki
Wątki i Współbieżność
Wątki. Przegląd
Wątek
• Wątek jest podstawową jednostką wykorzystania procesora
• Wątek zawiera:
• Identyfikator wątku
• Licznik programu
• Zestaw rejestrów
• Stos
• Wątek dzieli z innymi wątkami:
• Sekcję kodu
• Sekcję danych
• Inne zasoby systemu operacyjnego (otwarte pliki, sygnały itp.)
Procesy Jednowątkowe i
Wielowątkowe
Motywacja
• Aplikacja zazwyczaj jest implementowana jako oddzielny proces z kilkoma wątkami
• Metoda tworzenia procesów była powszechnie stosowana, zanim wątki stały się popularne
• Tworzenie procesów jest czasochłonne i wymaga dużych zasobów
• Zwykle bardziej efektywne jest używanie jednego procesu zawierającego wiele wątków
Wielowątkowa Architektura
Serwera
Korzyści
• Responsywność
• Współdzielenie zasobów
• Ekonomia
• Skalowalność
Programowanie
Wielordzeniowe
Równocześnie i Równoległe
Wykonywanie
Wyzwania Programistyczne
1) Identyfikacja zadań. Idealnie, zadania są niezależne.
2) Równowaga. Zadania powinny wykonywać równą pracę o równej wartości.
3) Podział danych. Dane muszą być podzielone, aby działały na osobnych rdzeniach.
4) Zależność od danych. Wykonywanie zadań musi być zsynchronizowane.
5) Testowanie i debugowanie. Gdy program działa
równolegle na wielu rdzeniach, możliwych jest wiele różnych ścieżek wykonania.
Reguła Amdahla
• Jeśli S jest częścią aplikacji, która musi być wykonywana sukcesywnie w systemie z N rdzeniami, formuła wygląda następująco:
𝑝𝑟𝑧𝑦𝑠𝑝𝑖𝑒𝑠𝑧𝑒𝑛𝑖𝑒 ≤ 1
𝑆 + (1 − 𝑆)
• Gdy N → ∞, przyspieszenie zbiega się do 1/S𝑁
• Szeregowa część aplikacji może mieć
nieproporcjonalny wpływ na wydajność, którą uzyskujemy poprzez dodanie dodatkowych rdzeni
Reguła Amdahla: Przykład
Rodzaje Równoległości
Modele Wielowątkowości
• Model „wiele do jednego” (Green threads – biblioteka dla systemu Solaris)
• Model „jeden do jednego” (Windows, Linux)
Modele Wielowątkowości
• Model „wiele do wielu”
• Model dwupoziomowy
Wątki Asynchroniczne
• Gdy rodzic tworzy wątek dziecko, rodzic wznawia wykonanie
• Rodzic i dziecko wykonują się równocześnie i niezależnie
• Zwykle niewiele danych są dzielone między wątkami
• Asynchroniczne wątkowanie jest strategią
stosowaną na serwerze wielowątkowym i jest również powszechnie używane do projektowania responsywnych interfejsów użytkownika
Wątki Synchroniczne
• Wątek rodzic tworzy jedno lub więcej dzieci, a następnie musi czekać, aż wszystkie jego dzieci zakończą się, zanim wznowi działanie
• Wątki utworzone przez rodzica wykonują pracę jednocześnie, ale rodzic nie może kontynuować wykonanie, póki ta praca nie zostanie zakończona
• Zazwyczaj wątki synchroniczne wymagają znacznej wymiany danych między wątkami
• Na przykład wątek macierzysty może łączyć wyniki obliczone przez różne dzieci
Biblioteki Wątków
• Biblioteka wątków – API do tworzenia i zarządzania wątkami
• biblioteka na poziomie użytkownika, bez obsługi jądra
• biblioteka na poziomie jądra, obsługiwana bezpośrednio przez system operacyjny
• Główne biblioteki wątków:
• POSIX Pthreads (na poziomie użytkownika lub jądra)
• Windows (biblioteka na poziomie jądra)
• Java (JVM działa na szczycie SO → API wątków Java jest zazwyczaj implementowany przy użyciu biblioteki
wątków dostępnej w systemie hosta)
Niejawne Wątkowanie
• Przeniesienie tworzenia wątków i zarządzania nimi od programistów do kompilatorów i bibliotek czasu wykonywania – niejawne wątkowanie:
oPule wątków oFork Join
oOpenMP
oGrand Central Dispatch
oIntel Thread Building Blocks
Pule Wątków
• Ogólny pomysł polega na utworzeniu kilku wątków
podczas uruchamiania i umieszczeniu ich w pulę, gdzie czekają na pracę. Korzyści:
1) Obsługa żądania za pomocą istniejącego wątku jest często szybsza niż oczekiwanie na tworzenie wątku 2) Pula wątków ogranicza liczbę wątków, które istnieją
w dowolnym momencie
3) Oddzielenie zadania od mechaniki jego tworzenia pozwala korzystać z różnych strategii do
uruchamiania zadania (np. wykonywanie po pewnym czasie lub okresowo)
Fork Join
• Model synchroniczny
• Biblioteka zarządza liczbą tworzonych wątków i odpowiada również za przypisywanie zadań do wątków
Fork Join w Javie
• Wersja 1.7 interfejsu API
• Zaprojektowany do użycia z rekurencyjnymi algorytmami dziel-i-rządź
Task(problem)
if problem is small enough
solve the problem directly else
subtask1 = fork(new Task(subset of problem)) subtask2 = fork(new Task(subset of problem)) result1 = join(subtask1)
result2 = join(subtask2) return combined results
OpenMP
• Zestaw dyrektyw
kompilatora oraz API dla programów napisanych w C, C ++ lub FORTRAN
• Dostępne na kilku kompilatorach open- source i komercyjnych dla systemów Linux, Windows i MacOS
#include <omp.h>
#include <stdio.h>
int main(int argc, char
*argv[]) {
/* sequential code */
#pragma omp parallel {
printf("I am a parallel region.");
}
/* sequential code */
return 0;
}
Grand Central Dispatch
• Technologia opracowana przez Apple dla MacOS i iOS
• GCD to połączenie biblioteki czasu wykonywania, interfejsu API i rozszerzeń językowych
• GCD planuje zadania do wykonania, umieszczając ich w kolejce wysyłki
• Gdy usuwa zadanie z kolejki, przypisuje to zadanie do dostępnego wątku z puli wątków
• Liczba wątków w puli rośnie i zmniejsza się w
zależności od potrzeb aplikacji i wydajności systemu
Intel Thread Building Blocks
• Biblioteka szablonów obsługująca projektowanie aplikacji równoległych w C ++
• Programiści określają zadania, które mogą działać równolegle, a planista zadań TBB mapuje te zadania na podstawowe wątki
• Planista zadań zapewnia równoważenie obciążenia i jest świadomy pamięci podręcznej
• Intel TBB ma zarówno wersje komercyjne, jak i
open-source, które działają w systemie Windows, Linux i MacOS
Wątki i Współbieżność.
Streszczenie
Streszczenie (1)
• Wątek jest podstawową jednostką wykorzystania
procesora, a wątki należące do tego samego procesu współdzielą wiele zasobów procesu, w tym kod i dane.
• Aplikacje wielowątkowe mają cztery podstawowe zalety: (1) szybkość reakcji, (2) współużytkowanie zasobów, (3) oszczędność i (4) skalowalność.
• Współbieżność występuje, gdy postępuje wiele wątków, równoległość istnieje, gdy wiele wątków postępuje jednocześnie. W systemie z pojedynczym procesorem możliwa jest tylko współbieżność;
równoległość wymaga systemu wielordzeniowego.
Streszczenie (2)
• W projektowaniu aplikacji wielowątkowych jest kilka wyzwań. Obejmują one dzielenie i
równoważenie pracy, dzielenie danych między
różne wątki i identyfikowanie zależności pomiędzy danymi. Wreszcie programy wielowątkowe są
szczególnie trudne do testowania i debugowania.
• Równoległość danych rozdziela podzbiory danych na różne rdzenie i wykonuje tę samą operację na każdym rdzeniu. Równoległość zadań rozdziela nie dane, ale zadania na wiele rdzeni. Każde zadanie uruchamia unikalną operację.
Streszczenie (3)
• Aplikacje tworzą wątki na poziomie użytkownika, które muszą być ostatecznie zmapowane na wątki jądra, aby mogły zostać uruchomione na CPU. Model „wiele-do- jednego” odwzorowuje wiele wątków na poziomie użytkownika na jeden wątek jądra. Inne podejścia obejmują modele jeden-do-jednego i wiele-do-wielu.
• Biblioteka wątków zapewnia interfejs API do tworzenia i zarządzania wątkami. Trzy popularne biblioteki
wątków to Windows, Pthreads i Java. Windows jest
przeznaczony tylko dla systemu Windows, podczas gdy Pthreads jest dostępny dla systemów zgodnych z POSIX, takich jak UNIX, Linux i macOS. Wątki Java będą działać na dowolnym systemie obsługującym wirtualną
maszynę Java.
Streszczenie (4)
• Niejawne wątki obejmują identyfikację zadań – a nie wątków – i umożliwienie językom lub
strukturom API tworzenia i zarządzania wątkami.
Istnieje kilka podejść do niejawnego wątkowania, w tym pule wątków, ramy fork-join i Grand Central
Dispatch. Niejawne wątkowanie staje się coraz powszechniejszą techniką, z której programiści mogą korzystać przy tworzeniu aplikacji
współbieżnych i równoległych.