Операционные системы
Все объяснения, задачи и лабораторная в одном месте.
Можно сохранить страницу в PDF через печать браузера. Для печати разборы ответов раскрываются автоматически.
1. Системные вызовы и граница user/kernel
Объяснение
Ядро управляет ресурсами и проверяет привилегии. Системный вызов — контролируемый вход в ядро из пользовательского процесса. Библиотечная функция может выполнить ноль, один или несколько системных вызовов.
Задача для самостоятельного решения
Почему printf не обязательно сразу пишет в терминал?
Показать разбор ответа
Стандартная библиотека буферизует вывод. Вызов write происходит при сбросе буфера, закрытии потока или некоторых переводах строки; поведение зависит от типа потока.
2. Процессы, потоки и планирование
Объяснение
Процессы обычно имеют разные адресные пространства. Потоки одного процесса разделяют память, но имеют собственные стеки и контекст исполнения. Планировщик распределяет CPU; ожидание ввода-вывода не равно вычислению.
Задача для самостоятельного решения
Два потока увеличивают общий счётчик без блокировки. Возможен ли потерянный инкремент?
Показать разбор ответа
Да: оба читают 7, оба записывают 8 вместо 9. Операция чтение–изменение–запись должна быть защищена mutex или подходящей атомарной операцией.
3. Синхронизация, deadlock и lock-free идеи
Объяснение
Deadlock возникает при циклическом ожидании ресурсов. Единый порядок захвата блокировок устраняет цикл. Lock-free не означает отсутствия ожидания у каждого отдельного потока и не отменяет модель памяти.
Задача для самостоятельного решения
Поток 1 захватил A и ждёт B; поток 2 захватил B и ждёт A. Исправьте протокол.
Показать разбор ответа
Оба потока должны захватывать сначала A, затем B. Если ресурс уже занят, второй поток ждёт, не удерживая B, поэтому замкнутого цикла не возникает.
4. Виртуальная память и аллокаторы
Объяснение
Виртуальный адрес переводится через таблицы страниц, а TLB кеширует переводы. Аллокатор выдаёт блоки внутри полученных у ОС областей. Освобождение объекта не гарантирует немедленного уменьшения RSS процесса.
Задача для самостоятельного решения
Почему после free память процесса может оставаться высокой?
Показать разбор ответа
Аллокатор сохраняет страницы для повторного использования, а живые мелкие объекты мешают вернуть целые страницы. Нужно различать утечку, кеширование и фрагментацию.
5. Файловые системы и надёжность хранения
Объяснение
Файловая система хранит данные и метаданные; успешный write не обязательно означает устойчивую запись. fsync просит синхронизировать файл. При атомарной замене важны также запись временного файла и синхронизация каталога.
Задача для самостоятельного решения
Опишите безопасное сохранение конфигурации при сбое питания.
Показать разбор ответа
Записать временный файл в том же каталоге, fsync файла, rename поверх старого, fsync каталога. Rename даёт атомарную видимость, но сам по себе не гарантирует сохранность после потери питания.
6. Изоляция, namespaces и контейнеры
Объяснение
Namespaces ограничивают видимость ресурсов, cgroups — их потребление. Контейнер разделяет ядро с хостом и не равен виртуальной машине. Root внутри контейнера требует отдельного анализа полномочий.
Задача для самостоятельного решения
Что предотвращает исчерпание памяти хоста контейнером?
Показать разбор ответа
Лимит памяти cgroup и продуманная политика OOM. PID namespace скрывает процессы, но не ограничивает RAM. Изоляцию видимости нельзя путать с квотой ресурсов.
Лабораторная работа
Подготовка
Linux, Python 3. Учебный пример создаёт только дочерний процесс.
Учебный пример
import subprocess
result = subprocess.run(
["printf", "hello\n"], capture_output=True, text=True, check=True
)
print(result.stdout.strip())
print(result.returncode)Как работает пример и что ожидать
Вывод hello и 0. Аргументы передаются массивом без shell, поэтому строка не интерпретируется как команда оболочки. stdout дочернего процесса идёт в pipe, родитель получает данные и код завершения. Захват всего вывода подходит только при ограниченном объёме.
Итоговая работа
Реализуйте mini-shell с запуском команды, pipe и обработкой exit status. Добавьте ограничение времени, уборку завершённых процессов и тест большого вывода. Документируйте владельцев файловых дескрипторов и порядок их закрытия.
Проверка результата
1. Опишите исходные данные и условия запуска, чтобы другой человек мог повторить работу.
2. Приложите результат обычного сценария и сравните его с ожидаемым.
3. Проверьте неверный вход, граничный случай и отказ зависимости, если она есть.
4. Объясните выбранное решение и известное ограничение.
5. Сохраните исправления после самопроверки вместе с примером, который раньше не работал.
Как оценить работу
По каждому пункту поставьте 0 (не выполнено), 1 (выполнено с пробелами) или 2 (результат воспроизводим и объяснён). Если обязательный сценарий не работает, вернитесь к нему независимо от общей суммы. Это рубрика самопроверки: сайт не исполняет присланный код и не выдаёт автоматическую оценку проекта.