Celem wykładu jest zapoznanie słuchaczy z wybranymi aspektami systemu uniksowego z punktu widzenia programisty. Na przykładzie wywołań systemowych i narzędzi systemu _Linux_ zostaną przedstawione najważniejsze osiągnięcia w dziedzinie systemów operacyjnych.
Organizacja oraz algorytmy i struktury danych jądra systemu operacyjnego będą omawiane na przedmiocie _„Struktura jądra UNIX”_.
## Lista tematów
1. Wprowadzenie
* jądro systemu operacyjnego
* przestrzeń adresowa
* izolacja przestrzeni jądra i użytkownika
* zmiana kontekstu i przestrzeni adresowej
* przerwania sprzętowe i wywłaszczanie
* dyspozytor i planista zadań
* wywołania systemowe `strace`, obsługa pułapek i błędów
* model aplikacji w systemach uniksowych
* model maszyny procesu w systemie uniksowym
2. Procesy
* zasoby i stan procesu
* parametry procesu `argv` i zmienne środowiskowe `envp`
* tworzenie procesów `fork`
* ładowanie programów `execve`
* kończenie procesów `exit`
* oczekiwanie na zmianę stanu procesów potomnych `waitpid`
* hierarchia procesów: `getpid`, `getppid`
3. Sygnały
* sygnały synchroniczne i asynchroniczne, domyślne akcje
* wysyłanie sygnałów: `kill`
* procedury obsługi sygnałów: `signal` i `sigaction`
* pojęcie sekcji krytycznej i wyścigu
* funkcje wielobieżne
* blokowanie i odblokowanie sygnałów `sigprocmask`
* oczekiwanie na sygnały `sigsuspend`
* nielokalne skoki: `setjmp` i `longjmp`
4. Zarządzanie zadaniami
* grupy procesów: `setpgid`
* grupa pierwszoplanowa i grupy drugoplanowe: `tcsetpgrp`
* sesje i terminal sterujący
* organizacja powłoki uniksowej
* wstrzymywanie `SIGSTOP` i wznawianie procesów `SIGCONT`
5. Pliki
* różnice między interfejsem `stdio.h` i uniksowym `unistd.h`
* typy plików: zwykłe, katalogi, urządzenia, potoki, gniazda, etc.
* hierarchia plików, ścieżki, punkty montażowe
* bieżący katalog roboczy
* domyślnie otwarte pliki `stdin`, `stdout`, `stderr`
* otwieranie `open` i zamykanie `close` plików oraz wybrane flagi plików
* odczyt `read` i zapis `write`, pułapki z _short counts_
* właściwości pliku terminala
* kursor pliku i zmiana jego pozycji `lseek`, powstawanie dziur
* zmiana rozmiaru pliku `truncate`
* zmiana właściwości urządzeń wejścia-wyjścia `ioctl`
* tablica deskryptorów vs. otwarte pliki
* wpływ `fork` na tablicę deskryptorów
* przekierowania plików `dup` i `dup2`
* operacje na deskryptorach plików `fcntl`
* zamykanie plików przy `execve` i flaga `CLOEXEC`
6. System plików
* metadane i lista bloków pliku, i-węzły
* odczyt metadanych pliku `stat`
* sprawdzenie uprawnień dostępu do plików
* zmiana uprawnień `chmod` i właściciela pliku `chown`
* wpisy katalogów `dirent`, odczyt katalogu `readdir`
* dowiązania twarde `link` i symboliczne `symlink`
* odczyt dowiązań symbolicznych `readlink` i `lstat`
* superblok i odczyt metadanych systemu plików `statvfs`
* księgowanie i operacje idempotentne
7. Buforowanie plików
* wpływ buforowania na wydajność programów
* buforowanie plików w jądrze `fsync`
* buforowanie danych vs. metadanych
* spójność danych a buforowanie
* wybór strategii buforowania w _stdio_ `setvbuf`
* odczyty i zapisy rozproszone `readv` i `writev`
8. Tożsamość, autoryzacja i uwierzytelnianie
* autoryzacja vs. uwierzytelnianie
* tożsamość procesu `getuid`, `getgid`, `getgroups`
* identyfikatory vs. nazwy `getent`
* przestrzenie nazw zasobów
* przejęcie tożsamości pliku wykonywalnego (set-uid, set-gid)
* zmiana tożsamości `setreuid`
9. Komunikacja międzyprocesowa
* tworzenie potoków `pipe` i `pipe2`
* łączenie procesów przy pomocy potoków
* właściwości potoków, atomowe zapisy
* gniazda datagramowe i strumieniowe
* gniazda domeny uniksowej
10. Pamięć wirtualna
* metody przydziału pamięci wirtualnej `sbrk` i `mmap`
* odwzorowania plików i obiektów anonimowych
* struktury opisujące przestrzeń adresową `pmap`
* obsługa błędu strony, przestrzeń wymiany
* zbiór roboczy i rezydentny, buforowanie stron
* współdzielenie pamięci i mechanizm _copy-on-write_
* tworzenie `mmap` i niszczenie `munmap` odwzorowań
* zmiana uprawnień odwzorowań `mprotect`
* synchronizacja pamięci z obiektami wspierającymi `msync`
* przechwytywanie błędów stron, obsługa `SIGSEGV`
11. Zarządzanie stertą
* interfejs biblioteki standardowej: `malloc`, `realloc` i `free`
* organizacja pamięci alokatora: bloki i areny
* fragmentacja wewnętrzna i zewnętrzna, kompaktowanie
* zarządzanie listą wolnych bloków
* podział i złączanie bloków
* polityki przydziału (first-fit, best-fit)
* algorytm znaczników granicznych (boundary tags)
* algorytm kubełkowy (segregated fits)
* wykrywanie błędnych odwołań do pamięci (kanarki)
* pule obiektów i przydział płytowy (slab allocator)
12. Programowanie sieciowe
* architektura klient-serwer
* nazewnictwo stron komunikacji
* protokoły połączeniowe i bezpołączeniowe
* interfejs gniazd BSD
* nawiązywanie połączeń
* nasłuchiwanie i akceptowanie połączeń
* adres powiązany z gniazdem
* współbieżna obsługa wielu połączeń `select` i `poll`
13. Wątki
* model wielowątkowości w uniksach
* współdzielenie pamięci
* wyścigi i procedury wątkowo bezpieczne
* thread local storage
* tworzenie `pthread_create` wątków
* złączanie `pthread_join` wątków i wątki odczepione (detached)
* wątki i `fork`, `exit` i `execve`
* wątki i sygnały
* wątki i operacje wejścia-wyjścia
14. Synchronizacja
* muteksy i semafory
* problem czytelników i pisarzy
* ziarnistość blokad
* głodzenie i zakleszczenia
* problem odwócenia priorytetów
* zmienne warunkowe i monitory
* blokady współdzielone
##### Zajęcia
Większość zajęć do przedmiotu będzie prowadzona w postaci ćwiczeń z deklaracjami. Na pracowni programistycznej będą do wykonania co najmniej trzy duże projekty:
* prosta powłoka uniksowa `shell`
* algorytm przydziału pamięci `malloc`
* system plików `ext2`
##### Zmiana od roku akademickiego 2021/2022
**W związku ze zmianą wymiaru godzinowego, od roku 2021/2022 zmienia się liczba punktów ECTS z 6 do 8.**