Systemy operacyjne

Język wykładowy Polski
Semestr Zimowy
Status Poddana pod głosowanie
Opiekun Krystian Bacławski
Liczba godzin 30 (wyk.) 30 (ćw.) 15 (prac.) 15 (rep.)
Rodzaj Informatyczny 1
ECTS 8
Polecany dla I roku Nie
Egzamin Tak
Tagi SO (Systemy operacyjne)
Grupy efektów kształcenia Systemy operacyjne

Opis przedmiotu:

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.**