Futex (Fast Userspace Mutex) Łukasz Białek

Podobne dokumenty
Pamięć współdzielona

Komunikacja za pomocą potoków. Tomasz Borzyszkowski

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

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

Pliki. Funkcje tworzące pliki i operujące na nich opisane są w części 2 pomocy systemowej. Tworzenie i otwieranie plików:

Przychodnia 0. Stwórz projekt aplikacja konsolowa lub WPF (przemyśl wybór, bo zmiana może być czasochłonna). 1. Stwórz abstrakcyjną klasę Osoba.

ZASADY PROGRAMOWANIA KOMPUTERÓW

Uniwersytet Zielonogórski Instytut Sterowania i Systemów Informatycznych. Ćwiczenie 3 stos Laboratorium Metod i Języków Programowania

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

Wskaźniki w C. Anna Gogolińska

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

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

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

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

Języki i techniki programowania Ćwiczenia 2

> C++ wskaźniki. Dane: Iwona Polak. Uniwersytet Śląski Instytut Informatyki 26 kwietnia 2017

Wstęp do programowania

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

Mechanizmy z grupy IPC

Kompilator języka C na procesor 8051 RC51 implementacja

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

Zwielokrotnianie wejścia wyjścia

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

Systemy operacyjne II

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

TABLICE W JĘZYKU C/C++ typ_elementu nazwa_tablicy [wymiar_1][wymiar_2]... [wymiar_n] ;

Zasady programowania Dokumentacja

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

Przykładowe sprawozdanie. Jan Pustelnik

Tworzenie sterowników dla FreeBSD. Michał Hajduk

Wykład 1: Wskaźniki i zmienne dynamiczne

Klasa jest nowym typem danych zdefiniowanym przez użytkownika. Najprostsza klasa jest po prostu strukturą, np

Linux Kernel III. Character devices

W dowolnym momencie można zmienić typ wskaźnika.

msgbox("akcja: Początek, argument: " + argument.tostring()); Thread.Sleep(1000); //opóźnienie msgbox("akcja: Koniec"); return DateTime.Now.

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

Podstawy programowania w języku C++

Wskaźnik może wskazywać na jakąś zmienną, strukturę, tablicę a nawet funkcję. Oto podstawowe operatory niezbędne do operowania wskaźnikami:

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

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

Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Podstawy programowania. Wykład 6 Złożone typy danych: struktury, unie. Krzysztof Banaś Podstawy programowania 1

9. Problem wzajemnego wykluczania i sekcji krytycznej

Programowanie w języku C++

Programowanie na poziomie sprzętu. Tryb chroniony cz. 1

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

Adam Kotynia, Łukasz Kowalczyk

IX. Wskaźniki.(3 godz.)

Podstawy programowania. Wykład: 12. Struktury, unie, pola bitowe. dr Artur Bartoszewski -Podstawy programowania, sem 1 - WYKŁAD

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

JĘZYKI PROGRAMOWANIA Z PROGRAMOWANIEM OBIEKTOWYM. Wykład 6

Enkapsulacja, dziedziczenie, polimorfizm

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

TCP - receive buffer (queue), send buffer (queue)

Laboratorium 6: Dynamiczny przydział pamięci. dr inż. Arkadiusz Chrobot dr inż. Grzegorz Łukawski

Podstawy programowania. Wykład Funkcje. Krzysztof Banaś Podstawy programowania 1

DYNAMICZNE PRZYDZIELANIE PAMIECI

4. Funkcje. Przykłady

Tablice, funkcje - wprowadzenie

Podstawy informatyki. Elektrotechnika I rok. Język C++ Operacje na danych - wskaźniki Instrukcja do ćwiczenia

Zadanie 2: transakcyjny protokół SKJ (2015)

Funkcja, argumenty funkcji

Wielozadaniowość w systemie Microsoft Windows

Dariusz Brzeziński. Politechnika Poznańska, Instytut Informatyki

Wykład 4. Tablice. Pliki

Typy wyliczeniowe Konwersje napis <-> liczba Struktury, unie Scanf / printf Wskaźniki

Dzisiejszy wykład. Klasa string. wersja prosta wersja ze zliczaniem odwołań. Wyjątki Specyfikator volatile Semafory

Wykład 13. Linux 2.0.x na maszynach SMP. 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

Programowanie aplikacji na iphone. Wstęp do platformy ios. Łukasz Zieliński

Podstawy Programowania Obiektowego

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

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

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

IdyllaOS. Prosty, alternatywny system operacyjny. Autor: Grzegorz Gliński. Kontakt:

znajdowały się różne instrukcje) to tak naprawdę definicja funkcji main.

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

PROE wykład 3 klasa string, przeciążanie funkcji, operatory. dr inż. Jacek Naruniec

Stworzenie klasy nie jest równoznaczne z wykorzystaniem wielowątkowości. Uzyskuje się ją dopiero poprzez inicjalizację wątku.

IPC: Kolejki komunikatów

Podstawy programowania komputerów

Działanie systemu operacyjnego

Programowanie niskopoziomowe

Programowanie obiektowe

Wskaźniki a tablice Wskaźniki i tablice są ze sobą w języku C++ ściśle związane. Aby się o tym przekonać wykonajmy cwiczenie.

Pomoc dla użytkowników systemu asix 6 i 7. Drajwer Bufor. Dok. Nr PLP6021 Wersja:

dr Artur Bartoszewski dr Artur Bartoszewski - Aplikacje mobilne - Wykład

Warstwy oprogramowania wejścia/wyjścia

Działanie systemu operacyjnego

Programowanie w C++ Wykład 4. Katarzyna Grzelak. 19 marca K.Grzelak (Wykład 1) Programowanie w C++ 1 / 37

Java. język programowania obiektowego. Programowanie w językach wysokiego poziomu. mgr inż. Anna Wawszczak

ISO/ANSI C - funkcje. Funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje. ISO/ANSI C - funkcje

Model procesu w systemie Linux. Tomasz Borzyszkowski

Ćwiczenie nr 6. Poprawne deklaracje takich zmiennych tekstowych mogą wyglądać tak:

Działanie systemu operacyjnego

Transport. część 2: protokół TCP. Sieci komputerowe. Wykład 6. Marcin Bieńkowski

Nazwa implementacji: Nauka języka Python pętla for. Autor: Piotr Fiorek

Na chwilę obecną biblioteka ElzabObsluga.dll współpracuje tylko ze sprawdzarkami RSowymi.

Transkrypt:

Futex (Fast Userspace Mutex) Łukasz Białek

Futex informacje podstawowe Stworzony w 2002 roku przez Hubertusa Franke, Matthew Kirkwooda, Ingo Molnára i Rustiego Russella. Jest mechanizmem w Linuxie, który pozwala na implementację podstawowego wzajemnego wykluczania Może być również użyty jako klocek do budowy wysoko-poziomowych mechanizmów wzajemnego wykluczania jak semafory

Od kiedy są z nami? Futexy pojawiły się po raz pierwszy w developerskiej wersji jądra o numerze 2.5.7 Ich semantyka zaczęła stabilizować się od wersji 2.5.40 Ostatecznie są już w stabilnych wersjach jądra o numerach 2.6.*

Co to tak naprawdę jest? Cały interfejs ze strony jądra zamyka się (głównie) w takim wywołaniu systemowym: long sys_futex (void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3)

Co to tak naprawdę jest? long sys_futex (void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) Futex to tak naprawdę zwykła zmienna typu int na poziomie użytkownika Bez względu na to, czy system jest 32 czy 64-bitowy jej rozmiar to zawsze 4 bajty Wartość tej zmiennej może być dowolnie zmieniana przez aplikacje

Co to tak naprawdę jest? long sys_futex (void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) Każdy adres w pamięci (oprócz obszarów DMA itp.) może być użyty jako futex Ciekawostka: jeśli dwa procesy odwołują się do futexa w pamięci, którą dzielą, to odwołują się do tego samego futexa!

Co to tak naprawdę jest? - operacje long sys_futex (void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) FUTEX_WAIT sprawia, że proces jest usypiany do czasu, gdy nie zostanie obudzony Przed uśpieniem sprawdzana jest wartość zmiennej futexa jeśli nie jest równa val1, to od razu zwracany jest błąd EWOULDBLOCK. Jeśli timeout!= NULL, to po określonym czasie bez obudzenia zostanie zwrócony ETIMEDOUT.

Co to tak naprawdę jest? - operacje long sys_futex (void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) FUTEX_WAKE sprawia, że val1 procesów śpiących na addr1 zostanie obudzonych Najczęściej używa się 1 albo MAX_INT (wszystkie śpiące) Zwraca liczbę procesów, które zostały obudzone

Co to tak naprawdę jest? - operacje long sys_futex (void *addr1, int op, int val1, struct timespec *timeout, void *addr2, int val3) A po co są addr2 i val3? Są używane na przykład do operacji FUTEX_CMP_REQUEUE, która działa tak jak FUTEX_WAKE, ale dodatkowo nie obudzone procesy przerzuca na futex związany ze zmienną addr2. Całość rozpocznie się, jeśli wartość val3 jest równa wartości zmiennej wskazywanej przez addr1.

Dlaczego Fast? Tradycyjnie w systemie Linux do synchronizacji służą semafory, msgqueues, gniazda, system blokowania plików (flock()) Wszystkie te mechanizmy odwołują się do obiektów systemowych Każde odwołanie do tych mechanizmów wymaga wywołania systemowego A to jest wolne

Dlaczego Fast? Możliwym rozwiązaniem tego problemu jest system wzajemnego wykluczania na poziomie użytkownika Pozwala on pominąć dużą część odwołań do jądra, które były niezbędne przy wcześniej wymienionych mechanizmach Jednym z takich rozwiązań jest właśnie futex

Dlaczego Fast? Wszystkie operacje na futexach rozpoczynają się w przestrzeni użytkownika. Być może będą musiały komunikować się z jądrem, ale nie jest to koniecznie Jeśli aplikacja chce podnieść futex, to powinna po prostu zwiększyć wartość zmiennej futexa Jeśli wartość zmieniła się z 0 na 1 (lub inną dodatnią), to wszystko przebiegło zgodnie z planem (zero odwołań do jądra!)

Dlaczego Fast? Jeśli zmieniana wartość jest ujemna (co oznacza, że są czekający), to trzeba powiedzieć systemowi, żeby obudził czekających na tej zmiennej (co wymaga odwołania systemowego FUTEX_WAKE). Powinno się przed zrobieniem tego ustawić zmienną futexa na 1 Jeśli chcemy zamknąć futex, to powinniśmy zmniejszyć wartość zmiennej. Jeśli wartość po zmianie jest większa od 0, to wszystko wykonało się dobrze (znów żadnych odwołań do jądra!)

Dlaczego Fast? Jeśli jednak nowa wartość jest mniejsza od zera, to proces powinien ustawić tę wartość na -1 i powiedzieć systemowi (przez FUTEX_WAIT), że chce poczekać na podniesienie futexa Jak widać odwołania systemowe występują tylko w niektórych przypadkach!

Uwaga Podkreślane jest, że futexy nie są przeznaczone do bezpośredniego użycia jako prosta abstrakcja dla użytkownika końcowego. Oczekuje się od osób ich używających biegłości w asemblerze oraz konieczności czytania źródeł biblioteki futexów.

Bibliografia http://www.kernel.org/doc/ols/2002/ols2002- pages-479-495.pdf http://dept- info.labri.fr/~denis/enseignement/2004- SSECPD/Articles/01.pdf http://www.kernel.org/doc/manpages/online/pages/man7/futex.7.html http://www.kernel.org/doc/manpages/online/pages/man2/futex.2.html