Учебник Операционные системы для начинающих
Операционная система — невидимый посредник между вашими программами и железом. Этот курс объясняет, как она устроена изнутри: что такое процессы и потоки, как планировщик делит процессор, почему возникают гонки данных и взаимоблокировки, как работает виртуальная память и из чего состоят файловые системы. Ключевые алгоритмы — планирование и замещение страниц — даны живыми запускаемыми симуляциями. Подойдёт студентам и разработчикам, которые готовятся к собеседованиям или хотят понимать, что происходит под капотом.
Курс «Операционные системы» состоит из 6 разделов и 24 уроков: Введение в ОС, Процессы и потоки, Планирование процессов, Синхронизация и взаимоблокировки, Управление памятью и Файловые системы и ввод-вывод. Уроки идут по порядку — от основ к более сложным темам, в каждом есть объяснение с примерами, а в конце — вопросы для самопроверки. К урокам привязаны задачи с автоматической проверкой: прочитали тему — сразу закрепили её кодом.
Программа курса
1 Введение в ОС
- Что делает операционная система
Операционная система как менеджер ресурсов и слой абстракций: зачем она нужна, какие проблемы решает и что прячет от программ.
- Ядро и пользовательский режим
Режим ядра и пользовательский режим, кольца защиты и зачем процессору два уровня привилегий: как ОС защищает себя и железо от программ.
- Системные вызовы
Что такое системный вызов, чем он отличается от обычной функции, какие бывают категории и как выглядит реальный код с fork, read и write.
- Прерывания и виды ОС
Что такое прерывание, чем отличается аппаратное от программного, как работает обработчик и какие бывают виды операционных систем.
- Что делает операционная система
2 Процессы и потоки
- Что такое процесс
Процесс как программа в исполнении: адресное пространство, состояния процесса, блок управления процессом (PCB) и переходы между состояниями.
- Потоки против процессов
Чем поток отличается от процесса, что потоки разделяют, а что у них своё, плюсы и минусы многопоточности и модели потоков.
- Создание процессов: fork и exec
Как создаются процессы: системные вызовы fork и exec, копирование адресного пространства, copy-on-write и дерево процессов.
- Переключение контекста и IPC
Что такое переключение контекста и почему оно стоит дорого, а также обзор межпроцессного взаимодействия: каналы, разделяемая память и сигналы.
- Что такое процесс
3 Планирование процессов
- Зачем нужен планировщик и его критерии
Зачем ОС нужен планировщик процессов, какие задачи он решает и по каким критериям оценивают качество планирования: загрузка CPU, время ожидания и оборота.
- FCFS и SJF
Невытесняющие алгоритмы планирования FCFS (первым пришёл — первым обслужен) и SJF (кратчайшая задача первой) с запускаемой симуляцией и расчётом метрик.
- Round Robin и приоритеты
Алгоритм Round Robin с квантом времени и приоритетное планирование: запускаемая симуляция, выбор кванта, голодание и старение.
- Вытесняющее и невытесняющее планирование
Разница между вытесняющим и невытесняющим планированием, их плюсы и минусы, и как современные ОС комбинируют алгоритмы в многоуровневых очередях.
- Зачем нужен планировщик и его критерии
4 Синхронизация и взаимоблокировки
- Состояние гонки и критическая секция
Что такое состояние гонки (race condition) на наглядном примере, понятие критической секции и условия корректной синхронизации.
- Мьютексы и семафоры
Примитивы синхронизации: мьютекс и семафор, разница между ними, и классическая задача производитель-потребитель с ограниченным буфером.
- Взаимоблокировки: четыре условия
Что такое взаимоблокировка (deadlock), четыре необходимых условия Коффмана и стратегии борьбы: предотвращение, избегание, обнаружение.
- Обнаружение и избегание deadlock
Обнаружение взаимоблокировки через поиск цикла в графе ожидания и идея алгоритма банкира для безопасного выделения ресурсов с запускаемыми примерами.
- Состояние гонки и критическая секция
5 Управление памятью
- Иерархия памяти и виртуальная память
Иерархия памяти от регистров до диска, принцип локальности и идея виртуальной памяти: зачем каждому процессу своё адресное пространство.
- Страничная организация памяти
Как работает paging: деление памяти на страницы и кадры, таблица страниц и трансляция виртуального адреса в физический с запускаемым примером.
- Подкачка и замещение страниц
Подкачка страниц и page fault, алгоритмы замещения FIFO, LRU и Optimal с запускаемой симуляцией и подсчётом промахов на одной строке обращений.
- Фрагментация и thrashing
Внешняя и внутренняя фрагментация памяти и явление thrashing: когда система занята почти только подкачкой страниц вместо полезной работы.
- Иерархия памяти и виртуальная память
6 Файловые системы и ввод-вывод
- Что такое файловая система
Зачем нужна файловая система, что такое файл и метаданные, как устроены каталоги и пути, и какие абстракции она предоставляет программам.
- Inode и методы выделения блоков
Идея inode как структуры с метаданными и указателями на блоки, и методы выделения дисковых блоков: непрерывный, связный и индексный.
- Буферизация, кэш и модели ввода-вывода
Зачем нужны буферизация и дисковый кэш, как они ускоряют ввод-вывод, и чем блокирующий ввод-вывод отличается от неблокирующего и асинхронного.
- Журналирование, RAID и вопросы собеседований
Журналируемые файловые системы и RAID для надёжности данных, плюс разбор частых вопросов про ОС на технических собеседованиях.
- Что такое файловая система