Переключение контекста и IPC
Как ОС создаёт иллюзию, что десятки процессов работают одновременно на одном ядре, и как процессы общаются между собой.
Переключение контекста (context switch) — это сохранение состояния одного процесса и загрузка состояния другого, чтобы процессор мог переключиться с одной задачи на другую.
Как создаётся иллюзия параллелизма
На одном ядре в каждый момент выполняется ровно один процесс. Но ОС переключается между процессами так быстро (десятки и сотни раз в секунду), что нам кажется, будто всё работает одновременно. Это как киноплёнка: отдельные кадры статичны, но при быстрой смене возникает движение.
Что происходит при переключении
Процесс A выполняется
|
| происходит прерывание (квант истёк или ввод-вывод)
v
1. сохранить регистры и счётчик команд A в его PCB
2. выбрать следующий процесс B (работа планировщика)
3. загрузить регистры и счётчик команд B из его PCB
|
v
Процесс B выполняется
Во время этой процедуры процессор не делает полезной работы — он занят «бухгалтерией». Поэтому переключение контекста — это накладные расходы (overhead). Чем чаще переключаемся, тем больше времени теряем впустую.
Почему переключение дорогое
- Нужно сохранить и восстановить десятки регистров.
- Часто «протухает» кэш процессора: новый процесс работает с другими данными, и быстрый кэш приходится заполнять заново.
- При смене процесса (а не потока) перенастраивается таблица страниц памяти.
Отсюда практический вывод: слишком частые переключения вредны. Это важный компромисс в планировании — об этом следующий раздел.
Межпроцессное взаимодействие (IPC)
Процессы изолированы — это хорошо для безопасности, но иногда им нужно общаться. Для этого ОС предоставляет механизмы IPC (Inter-Process Communication). Главные из них:
| Механизм | Идея | Когда применяют |
| Канал (pipe) | поток байтов от одного процесса к другому | ls | grep в shell |
| Разделяемая память | общий участок памяти для двух процессов | быстрый обмен большими данными |
| Сигнал (signal) | короткое уведомление о событии | «заверши работу», «приостановись» |
| Сокет | обмен по сети или локально | клиент-сервер |
| Очередь сообщений | именованные сообщения в очереди | асинхронный обмен |
Каналы (pipes)
Канал — это однонаправленная труба: один процесс пишет в неё, другой читает. Именно так работает символ | в командной строке. Вывод одной команды становится вводом следующей:
ps -ef | grep python | wc -l
# ps пишет в канал -> grep читает и фильтрует -> wc считает строки
Разделяемая память
Самый быстрый IPC: два процесса отображают один и тот же физический участок памяти к себе. Запись одного сразу видна другому — копировать данные не нужно. Плата за скорость — нужно самим синхронизировать доступ (иначе гонки).
Сигналы
Сигнал — это как стук в дверь: короткое асинхронное уведомление. Когда вы нажимаете Ctrl+C, терминал шлёт процессу сигнал SIGINT («прервись»). Сигнал SIGKILL завершает процесс принудительно.
kill -SIGTERM 1234 # вежливо попросить процесс 1234 завершиться
kill -9 1234 # SIGKILL — завершить принудительно
Цена переключений в цифрах
Смоделируем, сколько времени теряется на переключения контекста при разной частоте переключений за 1 секунду.
switch_cost_us = 5 # одно переключение, микросекунды
second_us = 1_000_000 # 1 секунда в микросекундах
for switches in (100, 1000, 10000):
overhead = switches * switch_cost_us
percent = overhead / second_us * 100
print(f"{switches:5} переключений/с -> накладные {overhead:7} мкс ({percent:.1f}% времени)")
Вывод:
100 переключений/с -> накладные 500 мкс (0.1% времени) 1000 переключений/с -> накладные 5000 мкс (0.5% времени) 10000 переключений/с -> накладные 50000 мкс (5.0% времени)
Видно: 100 переключений в секунду почти бесплатны, а 10000 уже «съедают» 5% процессора впустую. Поэтому планировщик не должен переключаться слишком часто.
Итог
- Переключение контекста сохраняет состояние одного процесса и грузит другой.
- Быстрое переключение создаёт иллюзию одновременной работы процессов.
- Это накладные расходы: страдают регистры, кэш и таблица страниц.
- IPC позволяет изолированным процессам общаться: каналы, разделяемая память, сигналы, сокеты.
- Слишком частые переключения вредят производительности.