Synchronizacja w jądrze Linux

Podobne dokumenty
9. Problem wzajemnego wykluczania i sekcji krytycznej

Prosty sterownik. Michał mina86 Nazarewicz. 6marca

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

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

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

Współbieżność i równoległość w środowiskach obiektowych. Krzysztof Banaś Obliczenia równoległe 1

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

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

PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO

Futex (Fast Userspace Mutex) Łukasz Białek

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

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

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

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

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

Wielowątkowość mgr Tomasz Xięski, Instytut Informatyki, Uniwersytet Śląski Katowice, 2011

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

9. Problem wzajemnego wykluczania i sekcji krytycznej

Algorytmy i Struktury Danych. Co dziś? Drzewo decyzyjne. Wykład IV Sortowania cd. Elementarne struktury danych

synchronizacji procesów

Synchronizacja procesów i wątków

Wykład 7 Podręczna pamięć buforowa (ang. buffer cache) w systemie Linuks. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Struktury. Przykład W8_1

Wykład 5. Synchronizacja (część II) Wojciech Kwedlo, Wykład z Systemów Operacyjnych -1- Wydział Informatyki PB

Problemy współbieżności

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

Zaawansowany kurs języka Python

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

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.2

Zaawansowane programowanie w języku C++ Funkcje uogólnione - wzorce

1. Tworzenie nowego projektu.

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

Model pamięci. Rafał Skinderowicz

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

Jedrzej Ułasiewicz Komputerowe systemy sterowania 1

Jzyk C++ cz 3. Jarosław Gramacki Instytut Informatyki i Elektroniki ( $)*)+' *, - ( ' )*'.' '',*/ *, ','*0) 1 / ) %*+ 2'' 2" ( $%%) )'20 )*0) 1 / )

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

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

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

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

Systemy operacyjne III

E S - uniwersum struktury stosu

Klasyczne problemy synchronizacji

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

Język Java wątki (streszczenie)


Program współbieżny jest zbiorem sekwencyjnych PROGRAMOWANIE C++

2 Implementacja w systemie Linux 2.4

Embedded Systems Programming

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

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

Klasy Obiekty Dziedziczenie i zaawansowane cechy Objective-C

4. Procesy pojęcia podstawowe

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

Linux Kernel III. Character devices

Mariusz Rudnicki PROGRAMOWANIE SYSTEMÓW CZASU RZECZYWISTEGO CZ.4

Kurs programowania. Wykład 13. Wojciech Macyna. 14 czerwiec 2017

Laboratorium 5: Wątki jądra i mechanizmy synchronizacji (jedne zajęcia) dr inż. Arkadiusz Chrobot

Język ludzki kod maszynowy

Wykład 14. Rozwój systemu w kolenych wersjach jądra. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

1: ////////// 2: // test.c. 3: ssize_t ret = read(fd, buf, nbytes);

Programowanie obiektowe i zdarzeniowe wykład 4 Kompozycja, kolekcje, wiązanie danych

Programowanie współbieżne Zadanie 5 - Podstawowe problemy programowania współbieżnego

Dzisiejszy wykład. Wzorce projektowe. Visitor Client-Server Factory Singleton

Grzegorz Cygan. Wstęp do programowania mikrosterowników w języku C

Wykład 12. Zarządzanie pamięcią (część III) oraz urządzenia sieciowe. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

SYSTEMY CZASU RZECZYWISTEGO - VxWorks

WYKŁAD 8. Funkcje i algorytmy rekurencyjne Proste przykłady. Programy: c3_1.c..., c3_6.c. Tomasz Zieliński

Systemy operacyjne Wzajemne wykluczanie i synchronizacja

Kurs programowania. Wykład 9. Wojciech Macyna. 28 kwiecień 2016

Zwielokrotnianie wejścia wyjścia

Zaawansowane programowanie w języku C++ Biblioteka standardowa

Przykład wystąpienia wyścigu. Systemy operacyjne / Wzajemne wykluczanie i synchronizacja str.4/33. Wyścigi w systemie operacyjnym.

Łącza nienazwane(potoki) Łącza nienazwane mogą być używane tylko pomiędzy procesami ze sobą powiązanymi.

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

Wykład 13. Linux 2.0.x na maszynach SMP. Wojciech Kwedlo, Systemy Operacyjne II -1- Wydział Informatyki PB

Programowanie współbieżne Wykład 7. Iwona Kochaoska

Aplikacje w Javie- wykład 11 Wątki-podstawy

Programowanie współbieżne Laboratorium nr 12

Szeregowanie zadań w Linux Kernel 2.6. Daniel Górski Przemysław Jakubowski

Kurs rozszerzony języka Python

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

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

Warstwy oprogramowania wejścia/wyjścia

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

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

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

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

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

9. Problem wzajemnego wykluczania i sekcji krytycznej

Wykład 3 Składnia języka C# (cz. 2)

Współbieżność w Javie

WSPÓŁBIEŻNOŚĆ. MATERIAŁY:

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

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

Wykład 3: Implementacja programów wbudowanych

Systemy operacyjne II

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

Wydział Elektryczny. Katedra Telekomunikacji i Aparatury Elektronicznej. Konstrukcje i Technologie w Aparaturze Elektronicznej.

Zaawansowane programowanie w C++ (PCP)

Transkrypt:

Synchronizacja w jądrze Linux Michał Nazarewicz Instytut Informatyki Politechniki Warszawskiej 3 kwietnia 2010

1 Wstęp Po co synchronizować? Synchronizacja w kontekście jądra? 2 Mechanizmy nieblokujące Brak synchronizacji i bariery pamięci Zmienne atomowe i licznik referencji Operacje na bitach Porównaj i zamień 3 Śpiące mechanizmy blokujące Kolejka oczekiwania Semafory i muteksy 4 Nieśpiące mechanizmy blokujące Przerwania i wywłaszczanie Spinlocki 5 Zakończenie Podsumowanie Źródła

Po co synchronizować? Systemy z wieloma procesorami stają się powszechne. Współbieżność pozwala lepiej wykorzystać zasoby sprzętu. Stosowanie wątków może uprościś logikę aplikacji. Jest to prawdziwe również w jądrze. Jeżeli wiele jednostek wykonania operuje na tych samym danych potrzebna jest synchronizacja.

Po co synchronizować? Systemy z wieloma procesorami stają się powszechne. Współbieżność pozwala lepiej wykorzystać zasoby sprzętu. Stosowanie wątków może uprościś logikę aplikacji. Jest to prawdziwe również w jądrze. Jeżeli wiele jednostek wykonania operuje na tych samym danych potrzebna jest synchronizacja. Wyścig Sytuacja, w której co najmniej dwa logiczne konkteksty wykonania (procesy, zadania itp.) wykonują operację na zasobach dzielonych, a ostateczny wynik zależy od momentu realizacji. za dr. Krukiem

Po co synchronizować?, kont. Inkrementacja licznika Wątek 1 Wątek 2 rejestr licznik rejestr rejestr + 1 rejestr licznik licznik rejestr rejestr rejestr + 1 licznik rejestr

Po co synchronizować?, kont. Inkrementacja licznika Wątek 1 Wątek 2 rejestr licznik rejestr rejestr + 1 rejestr licznik licznik rejestr rejestr rejestr + 1 licznik rejestr Ogólny schemat odczyt-modyfikacja-zapis Wątek 1 Wątek 2 odczyt modyfikacja odczyt zapis modyfikacja zapis

Synchronizacja w kontekście jądra? W przestrzeni użytkownika też synchronizujemy. To już wszystko było! Ale... Każdy cykl zegara spędzony w jądrze to cykl stracony. Jednocześnie wszyscy korzystają z usług jądra. Stąd bardzo duży nacisk na wydajność. Jądro pracuje w wielu kontekstach. Przerwania przychodzą w dowolnym momencie. Jest wiele poziomów przerwań.

Mechanizmy nieblokujące Tradycyjna sekcja krytyczna zmusza wątki na czekanie przy wchodzeniu. Czekanie to... strata czasu. Lepiej nie czekać, niż czekać. Wiele algorytmów można zrealizować korzystając z lekkich mechanizmów synchronizacji, które nie blokują kontekstu wykonania.

Kiedy nie synchronizować? Istnieje duży nacisk na wydajność jądra. Dlatego niektóre operacje nie są synchronizowane. System zakłada, że jest to powinność użytkownika.

Kiedy nie synchronizować?, kod Wywołanie systemowe read(2) static ssize t sys read (unsigned fd, char user buf, size t count) { ssize t ret = -EBADF; struct file file ; int fput needed; file = fget light (fd, &fput needed); if ( file ) { loff t pos = file ->f off ; ret = vfs read( file, buf, count, &pos); file ->f off = pos; fput light ( file, fput needed); return ret ;

Bufor cykliczny Jeden producent. Jeden konsument. Jak obsługa klawiatury w DOS-ie.

Bufor cykliczny, kod Bufor cykliczny, dane static unsigned buffer [16], head, tail ; #define inc(v) (((v) + 1) % (sizeof buffer / sizeof buffer )) Bufor cykliczny, funkcje static int pop(unsigned ret) { if (head!= tail ) return -ENOENT; ret = buffer [ tail ]; tail = inc( tail ); return 0; static int push(unsigned value) { if ( inc(head) == tail) return -ENOSPC; buffer [head] = value; head = inc(head); return 0;

Bariery pamięci Procesor może przestawiać operacje zapisu i odczytu. Procesor może postrzegać operacje w losowej kolejności. Bariery wymuszają częściowy porządek operacji.

Bariery pamięci Procesor może przestawiać operacje zapisu i odczytu. Procesor może postrzegać operacje w losowej kolejności. Bariery wymuszają częściowy porządek operacji. Bufor cykliczny, poprawiony static int pop(unsigned ret) { if (head!= tail ) return -ENOENT; smp rmb(); ret = buffer [ tail ]; tail = inc( tail ); return 0; static int push(unsigned value) { if ( inc(head) == tail) return -ENOSPC; buffer [head] = value; smp wmb(); head = inc(head); return 0;

Bariery pamięci, kont. Niepoprawny wielowątkowy singleton struct foo foo singleton () { static struct mutex mutex; static struct foo foo; if (!foo) { mutex lock(&mutex); if (!foo) { struct foo f = malloc(sizeof f); init foo (f); foo = f mutex unlock(&mutex); return foo;

Zmienne atomowe Linux wyposażony jest w zmienne atomowe (atomic t). Operacja na zmiennych atomowych są... atomowe. Dostępne operacje na zmiennych atomowych atomic set atomic read atomic add atomic add return atomic add negative atomic sub atomic sub return atomic sub and test atomic inc atomic inc return atomic inc and test atomic dec atomic dec return atomic dec and test atomic add unless atomic inc not zero atomic xchg atomic cmpxchg

Licznik referencji W oparciu o zmienne atomowe zaimplementowany jest licznik referencji (struct kref). Dostępne operacje: kref set, kref init, kref get oraz kref put.

Licznik referencji, kod Obiekt współdzielony struct foo { struct kref ref ; /... / ; struct foo new foo(/... /) { struct foo foo = kmalloc( sizeof foo, GFP KERNEL); kref init (&foo->ref); /... / return foo; void foo get( struct foo foo) { kref get (&foo->ref); void foo release ( struct kref ref ) { struct foo foo = container of ( ref, struct foo, ref ); /... / kfree (foo); void foo put( struct foo foo) { kref put (&foo->ref, foo release );

Zmienne atomowe w przestrzeni użytkownika basic string assign (const basic string & str) { CharT tmp = str. M rep()-> M grab(); M rep()-> M dispose(); M dataplus. M p = tmp; return this ; CharT M grab() { if ( M refcount >= 0) { sync fetch and add (& M refcount, 1); return M refdata() ; else { Rep r = Rep:: S create ( M length, M capacity); M copy( r-> M refdata(), M refdata(), M length); M refcount = 0; return r -> M refdata(); void M dispose() { if ( sync fetch and add (& M refcount, -1) <= 0) M destroy(); void M leak() { if ( M rep()-> M refcount > 0) M mutate(0, 0, 0); M rep()-> M refcount = -1;

Operacje na bitach Podobnym mechanizmem są atomowe operacja na bitach. Nadają się idealnie, jeżeli chcemy wykonać coś raz. Dostępne operacje na bitach set bit test and set bit clear bit test and clear bit change bit test and change bit

Operacje na bitach, kod Tasklety static inline void tasklet schedule ( struct tasklet struct t) { if (! test and set bit (TASKLET STATE SCHED, &t->state)) tasklet schedule (t); static void tasklet action ( struct softirq action a) { /... / if (! test and set bit (TASKLET STATE RUN, &t->state)) { clear bit (TASKLET STATE SCHED, &t->state); t->func(t->data); smp mb before clear bit () ; clear bit (TASKLET STATE RUN, &t->state); /... /

Porównaj i zamień Atomowe operacje porównaj i zamień xchg atomic xchg cmpxchg atomic cmpxchg

Porównaj i zamień Atomowe operacje porównaj i zamień xchg atomic xchg cmpxchg atomic cmpxchg Operacje na stosie static void push(struct node firstp, struct node n) { struct node f; do { f = firstp ; n->next = f; while (cmpxchg(firstp, f, n)!= f); static struct node pop(struct node firstp ) { struct node f; do { f = first ; while ( f && cmpxchg(firstp, f, f ->next)!= f); return f ;

Mechanizmy blokujące Proste atomowe operacje często nie wystarczają. Zazwyczaj trzeba modyfikować wiele zmiennych na raz. Często trzeba również czekać na wystąpienie pewnych warunków. W takich sytuacjach sprawdzają się mechanizmy blokujące.

Kolejka oczekiwania Podstawowym mechanizmem blokującym jest kolejka oczekiwania (wait queue head t), która służy do tworzenia listy, w której zadania oczekują, aż inne zadania je obudzą. Zazwyczaj korzysta się z niej poprzez interfejs wait event (i warianty).

Kolejka oczekiwania, kod Blokujący bufor cykliczny, dane static DECLARE WAIT QUEUE HEAD(push queue); static DECLARE WAIT QUEUE HEAD(pop queue); unsigned empty = sizeof buffer / sizeof buffer, full ; Blokujący bufor cykliczny, funkcje static int pop(unsigned ret) { wait event (pop queue,! full ); -- full ; ret = buffer [ tail ]; tail = inc( tail ); ++empty; wake up(push queue); return 0; static int push(unsigned value) { wait event (push queue,!empty); --empty; buffer [head] = value; head = inc(head); ++full; wake up(pop queue); return 0;

Spanie a sygnały Funkcja wait event blokuje sygnały! Procesu blokującego sygnały nie da się zabić! Lepiej użyć wait event interruptible.

Spanie a sygnały Funkcja wait event blokuje sygnały! Procesu blokującego sygnały nie da się zabić! Lepiej użyć wait event interruptible. Kolejka oczekiwania, wersja interruptible static int pop(unsigned ret) { if ( wait event interruptible (pop queue,! full )) return -EINTR; -- full ; ret = buffer [ tail ]; tail = inc( tail ); ++empty; wake up(push queue); return 0; static int push(unsigned value) { if ( wait event interruptible (push queue,!empty)) return -EINTR; --empty; buffer [head] = value; head = inc(head); ++full; wake up(pop queue); return 0;

Semafory Użyty mechanizm to klasyczny semafor. Semafory są rzecz jasna dostępne w jądrze. Dostępne operacje: sema init, down, down trylock, down interruptible, down killable, down timeout oraz up. Semafor Obiekt inicjowany nieujemną liczbą całkowitą, na której zdefiniowane są dwie niepodzielne operacje: down(sem) { while (!sem); --sem;. up(sem) { ++sem; i za dr. Krukiem

Semafory, kod Bufor cykliczny na semaforach, dane static struct semaphore push sem, pop sem; static void init (void) { sema init(&push sem, sizeof buffer / sizeof buffer ); sema init(&pop sem, 0); Bufor cykliczny na semaforach, funkcje static int pop(unsigned ret) { if ( down interruptible (pop sem)) return -EINTR; ret = buffer [ tail ]; tail = inc( tail ); up(push sem); return 0; static int push(unsigned value) { if ( down interruptible (push sem)) return -EINTR; buffer [head] = value; head = inc(head); up(pop sem); return 0;

Muteksy Pewnym szczególnym rodzajem semaforów są muteksy. Z założenia stworzone do implementowania sekcji krytycznej. Dostępne operacje: mutex is locked, mutex lock i wiarianty plus wersje... nested, mutex try lock, mutex unlock.

Muteksy, kod Kolejka chroniona muteksem static DEFINE MUTEX(mutex), LIST HEAD(first); static int push(struct list head n) { if ( mutex lock interruptible (&mutex)) return -EINTR; list add tail (& first, n); mutex unlock(&mutex); return 0; static struct list head pop(void) { struct list head ret = NULL; if ( mutex lock interruptible (&mutex)) return PTR ERR(-EINTR); if (! list empty (& first )) { ret = first.next; list del ( ret ); mutex unlock(&mutex); return ret ;

Muteksy, nested? Zakleszczenie Pojęcie opisujące sytuację, w której co najmniej dwie różne akcje czekają na siebie nawzajem, więc żadna nie może się zakończyć. za Wikipedią

Muteksy, nested? Zakleszczenie Pojęcie opisujące sytuację, w której co najmniej dwie różne akcje czekają na siebie nawzajem, więc żadna nie może się zakończyć. za Wikipedią Linux ma mechanizm weryfikacji synchronizacji. Dzieli muteksy itp. na klasy. Sprawdza, czy klasy są blokowane w tej samej kolejności. Nie można zablokować dwóch muteksów z tej samej klasy. Co w takim razie z muteksami w hierarchii? Po to jest właśnie mutex lock nested itp.

Nieśpiące mechanizmy Przedstawione dotychczas mechanizmy blokujące mogą przełączyć zadanie w stan uśpienia. W pewnych kontekstach spanie jest niedopuszczalne. Wewnątrz funkcji obsługi przerwania. Gdy przerwania są wyłączone. Ogólnie w kontekście atomowym. Ale na szczęście są inne mechanizmy.

Wyłączanie przerwań Będąc w kodzie jądra możemy wyłączyć przerwania. local irq diable wyłącza, a local irq enable włącza przerwania. Ale co jeśli w momencie wejścia do sekcji krytycznej przerwania już były wyłączone? Na pomoc przychodzą local irq save i local irq restore. Trzeba uważać pewne funkcje mogą spowodować przełączenie kontekstu nawet jeżeli przerwania są wyłączone. A poza tym, wyłączanie przerwań jest lokalne dla procesora.

Wyłączanie wywłaszczania Linux wspiera wywłaszczanie wewnątrz kodu jądra. Zmniejsza to czas reakcji, ale komplikuje synchronizację. Można ten mechanizm wyłączyć. Dostępne operacje preempt disable i preempt enable są rekurencyjne, ale lokalne dla konkretnego procesora.

Spinlock Spinlock działa jak muteks, ale stosuje aktywne oczekiwanie, dzięki czemu nie zasypia. Użycie: spin lock... spin unlock. Też mają wersję... nested.

Spinlock, kod Kolejka chroniona spinlockiem static DEFINE SPINLOCK(lock), LIST HEAD(first); static void push(struct list head n) { spin lock (&lock); list add tail (& first, n); spin unlock(&lock); static struct list head pop(void) { struct list head ret = NULL; spin lock (lock); if (! list empty (& first )) { ret = first.next; list del ( ret ); spin unlock(&lock); return ret ;

Spinlock a przerwania Co jeśli w sekcji krytycznej przyjdzie przerwanie? Przerwanie w sekcji krytycznej Kontekst użytkownika spin lock przychodzi przerwanie Przerwanie spin lock zakleszczenie Gdy spinlock używany jest również w przerwaniu, w kontekście użytkownika trzeba przerwania wyłączyć (spin lock irqsave... spin unlock irqrestore). Jest też wersja spin lock irq... spin unlock irq

Spinlock a przerwania, kod Kolejka chroniona spinlockiem, poprawiona static void push(struct list head n) { unsigned long flags ; spin lock irqsave (&lock, flags ); list add tail (& first, n); spin unlock irqrestore (&lock, flags ); static struct list head pop(void) { struct list head ret = NULL; unsigned long flags ; spin lock irqsave (&lock, flags ); if (! list empty (& first )) { ret = first.next; list del ( ret ); spin unlock irqrestore (&lock, flags ); return ret ;

Podsumowanie Linux jest bardzo złożonym oprogramowaniem. Wiele mechanizmów jest znanych z przestrzeni użytkownika. Nacisk na wydajność i przerwania komplikują sytuację. Dlatego jest wiele mechanizmów unikalnych dla jądra. Czyni to synchronizację w kernelu bardzo ciekawą! Ale i złożoną i trudną.

Czego nie było... Siedem rodzai barier pamięci. Big Kernel Lock. Kolejka oczekiwań to coś o wiele więcej niż wait event. spin lock bh. Zmienne per CPU. Alokacja pamięci a synchronizacja.

Skąd czerpać informacje? Use the Source, Luke. Podkatalog Documentation w źródlach. Publiczne serwery LXR. http://lxr.linux.no/ LWN.net STER z dr. W. Zabołotnym Linux Device Drivers, Third Edition http://lwn.net/kernel/ldd3/ Daniel P. Bovet, Marco Cesati. Understanding the Linux Kernel.

Dziękuję za uwagę! Pytania? Opinie? Sugestie? Michał Nazarewicz http://mina86.com/ mina86@mina86.com mina86@jabber.org