Wielozadaniowość w systemie Microsoft Windows

Podobne dokumenty
Tworzenie i zarządzanie wątkami

Programowanie współbieżne. Tworzenie i obsługa semaforów oraz wątków przy użyciu funkcji Windows API.

Plan prezentacji: 1. Czym jest proces? 2. Czym jest wątek? 3. Funkcje do zarządzania wątkami w Win32API. 4. Mechanizmy synchronizacji wątków

Programowanie współbieżne i rozproszone. Procesy współbieżne

Procesy, wątki i zasoby

4. Procesy pojęcia podstawowe

Obserwacje kierunku rozwoju współczesnych

4. Procesy pojęcia podstawowe

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

4. Procesy pojęcia podstawowe

Procesy, zasoby i wątki

Procesy, zasoby i wątki

Procesy, zasoby i wątki

Kurs programowania. Wykład 8. Wojciech Macyna

Jak Windows zarządza pamięcią?

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

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

Programowanie wielowątkowe. Jarosław Kuchta

Projektowanie oprogramowania systemów PROCESY I ZARZĄDZANIE PROCESAMI

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

Przeplot. Synchronizacja procesów. Cel i metody synchronizacji procesów. Wątki współbieżne

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

Co to jest sterta? Sterta (ang. heap) to obszar pamięci udostępniany przez system operacyjny wszystkim działającym programom (procesom).

Procesy i wątki. Krzysztof Banaś Obliczenia równoległe 1

Przetwarzanie Rozproszone

Podstawy programowania. Wykład 6 Wskaźniki. Krzysztof Banaś Podstawy programowania 1

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

Obliczenia równoległe i rozproszone w JAVIE. Michał Kozłowski 30 listopada 2003

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

Java. Wykład. Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ

I.Wojnicki, Tech.Inter.

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

Monitory. Jarosław Kuchta

1. Uruchom poniższy program tworzący pojedynczy wątek:

1.1 Definicja procesu

DYNAMICZNE PRZYDZIELANIE PAMIECI

Przetwarzanie Rozproszone

I.Wojnicki, PHP. PHP PHP Hypertext Preprocessor. Igor Wojnicki. Ktedra Informatyki Stosowanej Akademia Górniczo-Hutnicza w Krakowie.

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

Interfejs programowy Windows Sockets 2. Aplikacja klient-serwer TCP Echo

Zaawansowane programowanie w języku C++ Zarządzanie pamięcią w C++

Działanie systemu operacyjnego

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Windows.

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

Języki i Techniki Programowania II. Wykład 7. Współbieżność 1

Działanie systemu operacyjnego

Wskaźniki w C. Anna Gogolińska

część 8 wskaźniki - podstawy Jarosław Gramacki Instytut Informatyki i Elektroniki Podstawowe pojęcia

IPC: Kolejki komunikatów

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

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

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

Temat: Dynamiczne przydzielanie i zwalnianie pamięci. Struktura listy operacje wstawiania, wyszukiwania oraz usuwania danych.

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

Działanie systemu operacyjnego

Podstawy informatyki. System operacyjny. dr inż. Adam Klimowicz

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

Prezentacja systemu RTLinux

Synchronizacja procesów i wątków

Jądro systemu operacyjnego

Język JAVA podstawy. Wykład 3, część 3. Jacek Rumiński. Politechnika Gdańska, Inżynieria Biomedyczna

Systemy wbudowane. Systemy operacyjne czasu rzeczywistego

Adam Kotynia, Łukasz Kowalczyk

Od uczestników szkolenia wymagana jest umiejętność programowania w języku C oraz podstawowa znajomość obsługi systemu Linux.

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

Wersja dokumentacji1.01. TeleToken API

Systemy operacyjne. Zajęcia 11. Monitory

Zegary. Zegary (timers) umożliwiają cykliczne w danych odstępach czasu wykonać określone operacje.

Futex (Fast Userspace Mutex) Łukasz Białek

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

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

Systemy Operacyjne 2: Wątki pthreads. dr inż. Arkadiusz Chrobot

Wskaźniki i dynamiczna alokacja pamięci. Spotkanie 4. Wskaźniki. Dynamiczna alokacja pamięci. Przykłady

SYSTEMY OPERACYJNE WYKLAD 6 - wątki

Kompilator języka C na procesor 8051 RC51 implementacja

Zaawansowane programowanie w C++ (PCP)

Działanie systemu operacyjnego

Programowanie niskopoziomowe

Simulator of Operating System

Czym jest DLL Injection

ZASADY PROGRAMOWANIA KOMPUTERÓW

Wykład 2 Proces, stany procesu i przejścia pomiędzy nimi. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Programowanie równoległe i rozproszone. W1. Wielowątkowość. Krzysztof Banaś Programowanie równoległe i rozproszone 1

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

Zarządzanie procesami i wątkami

Algorytm. a programowanie -

Podręcznik programisty

Adresowanie obiektów. Adresowanie bitów. Adresowanie bajtów i słów. Adresowanie bajtów i słów. Adresowanie timerów i liczników. Adresowanie timerów

Podstawy programowania. Wykład 7 Tablice wielowymiarowe, SOA, AOS, itp. Krzysztof Banaś Podstawy programowania 1

Programowanie w języku C++

Wstęp do programowania INP001213Wcl rok akademicki 2018/19 semestr zimowy. Wykład 4. Karol Tarnowski A-1 p.

Podstawy programowania komputerów

Wykład 4: Klasy i Metody

Procesy, zasoby i wątki

Programowanie obiektowe Wykład 3. Dariusz Wardowski. dr Dariusz Wardowski, Katedra Analizy Nieliniowej, WMiI UŁ 1/21

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

Programowanie. Ćwiczenie Język C. Środowisko programowania Visual Studio

Wątki. Definiowanie wątków jako klas potomnych Thread. Nadpisanie metody run().

Wykład 4. Synchronizacja procesów (i wątków) cześć I. Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Transkrypt:

Wielozadaniowość w systemie Microsoft Windows mgr inż. Tomasz Jaworski tjaworski@kis.p.lodz.pl http://tjaworski.kis.p.lodz.pl/

Idea wielozadaniowości Proces główny Wątki Algorytm szeregowania ustala kolejność wykonywanych zadań, uwzględnia priorytety Dzielenie czasu rozdzielenie czasu procesora dla wielu pracujących na nim wątków Wywłaszczenie możliwość odgórnego wstrzymania wątku przez planistę (scheduler) i przełączenie zadania (np. Win95, Linux) Brak wywłaszczenia programy same muszą zwalniać procesor. Wadliwa aplikacja może zawiesić cały system (np. Win31)

Tworzenie nowego wątku HANDLE WINAPI CreateThread( SECURITY_ATTRIBUTES lpthreadattributes, SIZE_T dwstacksize, LPTHREAD_START_ROUTINE lpstartaddress, LPVOID lpparameter, DWORD dwcreationflags, LPDWORD lpthreadid ); Parametry: lpthreadattributes - wskaźnik do struktury opisującej parametry bezpieczeństwa nowego wątku. Domyślnie NULL. dwstacksize - określa rozmiar stosu dla nowego wątku. Domyślnie 0. lpstartaddress - wskaźnik do funkcji, której instrukcje będą wykonywane w nowo utworzonym wątku programu lpparameter - argument przekazywany do nowego wątku dwcreationflags - określa początkowy status procesu, np. CREATE_SUSPENDED lpthreadid - wskaźnik do identyfikatora nowego wątku Wartość zwracana Wartością zwracaną przez funkcję CreateThread jest uchwyt nowo utworzonego wątku, lub wartość -1 w przypadku wystąpienia błędu.

Tworzenie nowego wątku: przykład HANDLE th1, th2, th3, th4; th1 = CreateThread(NULL, 0, my_thread, (void*)1, CREATE_SUSPENDED, NULL); th2 = CreateThread(NULL, 0, my_thread, (void*)2, CREATE_SUSPENDED, NULL); th3 = CreateThread(NULL, 0, my_thread, (void*)3, CREATE_SUSPENDED, NULL); th4 = CreateThread(NULL, 0, my_thread, (void*)4, CREATE_SUSPENDED, NULL); Kod wykonywane w oddzielny wątku jest opisany na następnym slajdzie Przykład tworzy 4 wątki domyślnie zawieszone (CREATE_SUSPENDED) wykonujące ten sam kod (th1p) ale z różnymi parametrami (1..4). Aby wznowić któryś z wątków, należy skorzystać z funkcji ResumeThread.

Procedura wykonywana w oddzielny wątku Typ: LPTHREAD_START_ROUTINE Przykład: DWORD WINAPI my_thread(lpvoid arg) { int i = (int)arg; for (int j = 1; j < 10; j++) { Sleep(0); printf("%d", i); } VOID WINAPI Sleep( DWORD dwmilliseconds); Funkcje Sleep usypia aktualnie wykonywany wątek na dwmilliseconds milisekund. Gdy wartość parametru jest równa 0, to następuje wymuszone przełączenie do następnego wątku w kolejce. } return 0; LPVOID arg jest wartością argumentu przekazaną w wywołaniu funkcji CreateThread. W przypadku powyższego przykładu jest to liczba typu int.

Zwalnianie zasobów istniejącego wątku Wątek jest zasobem systemu operacyjnego wymaga zwolnienia. W przypadku pracującego wątku następuje jego przerwanie. BOOL WINAPI CloseHandle(HANDLE hobject); Parametry: hobject uchwyt wątku utworzonego funkcja CreateThread. Uwaga! Pamięć zaalokowana przy pomocy funkcji malloc, calloc oraz operatorów new i new[] nie zostanie zwolniona podczas zwalniania pamięci wątku.

Wznawianie/Zawieszanie wykonywania wątku BOOL WINAPI ResumeThread(HANDLE hthread); BOOL WINAPI SuspendThread(HANDLE hthread); Funkcja ResumeThread wznawia wykonywanie zawieszonego wątku, szczególnie jeśli wątek został utworzony z parametrem CREATE_SUSPENDED. SuspendThread zawiesza (chwilowo wstrzymuje) wykonywanie wątku. W przypadku błędu obie funkcje zwracają -1 (kod błędu z GetLastError). Funkcje posługują się licznikiem zawieszeń. Gdy wartość licznika == 0, wątek pracuje. th1 = CreateThread(NULL, 0, my_thread, (void*)1, CREATE_SUSPENDED, NULL); ResumeThread(th1); SuspendThread(th1);

Kończenie wątku Wątek może zakończyć działanie wywołując funkcję ExitThread z dowolnym kodem powrotu. VOID WINAPI ExitThread(DWORD dwexitcode); Ponieważ procedura będąca uruchamia w oddzielny wątku zwraca parametr DWORD, można wykorzystać instrukcję return języka C do zwrócenia kodu powrotu. Do odczytania kodu powrotu służy funkcja GetCodeThread: BOOL WINAPI GetExitCodeThread(HANDLE hthread, LPDWORD lpexitcode); Przykład: DWORD code; GetExitCodeThread(th1, &code); printf("kod zakonczenia watku: %d\n", code);

Oczekiwanie na zakończenie wątku Podstawową funkcją do synchronizacji poprzez oczekiwania za kończenie działającego wątku jest funkcja DWORD WINAPI WaitForSingleObject( HANDLE hhandle, DWORD dwmilliseconds); Oczekuje ona dwmilliseconds na zakończenie wątku. Wartość INFINITE spowoduje oczekiwanie w nieskończoność. Wynik: WAIT_OBJECT_0 wątek zakończył się samoistnie (np. ExitThread) WAIT_TIMEOUT przekroczony czas oczekiwania (dwmilliseconds). Przykład: th1 = CreateThread(NULL, 0, my_thread, (void*)1, 0/*CREATE_SUSPENDED*/, NULL); WaitForSingleObject(th1, INFINITE);

Problem z dostępem do zasobów Kod do wykonania: x = cnt; x = x + 1; cnt = x; Stan początkowy: cnt = 1; Ilość wątków: 2

Problem z dostępem do zasobów Kod do wykonania: x = cnt; x = x + 1; cnt = x; Wątek Operacja cnt x 1 x 2 1 x x 1 x 1 = cnt 1 1 x 1 x 1 = x 1 + 1 1 2 x Stan początkowy: cnt = 1; Ilość wątków: 2 2 x 2 = cnt 1 2 1 1 cnt = x 1 2 2 1 2 x 2 = x 2 + 1 2 2 2 2 cnt = x 2 2 2 2

Mechanizmy synchronizacji wątków Sekcja krytyczna Semafor Mutex (Mutual Exclusion wzajemne wykluczenie) działają podobnie do sekcji krytycznych, są ponadto mechanizmem IPC (Interprocess Communication)

Sekcja krytyczna Obszar kodu objęty sekcją krytyczną może być wykonywany przez tylko jeden wątek w danej chwili czasowej. Sekcja_krytyczna { x = cnt; x = x + 1; cnt = x; }

Sekcja krytyczna CRITICAL_SECTION cs; //... DWORD WINAPI my_thread(lpvoid arg) { EnterCriticalSection(&cs); KOD; LeaveCriticalSection(&cs); } //... int main(void) { InitializeCriticalSection(&cs); HANDLE th1, th2, th3; th1 = CreateThread(NULL, 0, my_thread, (void*)1, 0, NULL); th2 = CreateThread(NULL, 0, my_thread, (void*)1, 0, NULL); th3 = CreateThread(NULL, 0, my_thread, (void*)1, 0, NULL); WaitForSingleObject(th1, INFINITE); WaitForSingleObject(th2, INFINITE); WaitForSingleObject(th3, INFINITE); DeleteCriticalSection(&cs); }

Semafor Semafor jest uogólnieniem sekcji krytycznej. Pozwala na określenie ilości wątków wykonujących jednocześnie dany kod. Semafory można stosować do wyzwalania zdarzeń, synchronizacji wątków, itd Z każdym semaforem skojarzony jest licznik. Jeśli wartość licznika > 0, to semafor otwiera możliwość dostępu (sygnalizuje). Jeśli wartość licznika == 0, to semafor zamyka drogę dostępu (nie sygnalizuje) Dostępne są dwa typy instrukcji: wait i signal. Wait monitoruje semafor i jeśli ten sygnalizuje, to wait dopuszcza wykonanie. Jeśli semafor nie sygnalizuje, to wątek jest wstrzymywany (aż do ponownej sygnalizacji). Signal zawsze uruchamia sygnalizację (poprzez zwiększenie licznika).

Semafory bardziej życiowy przykład 4 3

Semafory bardziej życiowy przykład 2 1

Semafory bardziej życiowy przykład 0 1

Semafory bardziej życiowy przykład 0 2

Semafory Windows API Semafor tworzy się za pomocą CreateSemaphore a zwalnia za pomocą CloseHandle. HANDLE WINAPI CreateSemaphore( LPSECURITY_ATTRIBUTES lpsemaphoreattributes, LONG linitialcount, LONG lmaximumcount, LPCTSTR lpname); Parametry: lpsemaphoreattributes - wskaźnik na strukturę przechowującą atrybuty semafora do utworzenia; domyślnie NULL, linitialcount wartość początkowa semafora. Dla omawianego przykładu z samochodami będzie to 4. lmaximumcount maksymalna wartość licznika semafora. Dla omawianego przykładu będzie to 4. Jaka będzie interpretacja tej wartości na podstawie omawianego przykładu? lpname nazwa semafora. Jeśli semafor o tej nazwie już istnieje, zwracany jest jego uchwyt. Domyślnie NULL. Zwalnianie zasobów semafora: BOOL WINAPI CloseHandle(HANDLE hobject);

Instrukcja wait: DWORD WINAPI WaitForSingleObject( HANDLE hsemaphore, DWORD dwmilliseconds); Instrukcja signal: BOOL WINAPI ReleaseSemaphore( HANDLE hsemaphore, LONG lreleasecount, LPLONG lppreviouscount); Parametry: hsemaphore uchwyt semafora, Semafory Windows API dwmilliseconds ilość milisekund oczekiwania; domyślnie INFINITE, lreleasecount wartość o jaką zostanie zwiększony licznik; domyślnie 1, lppreviouscount wskaźnik na poprzednią wartość; domyślnie NULL.

Dziękuję za uwagę!