Переключение контекста и 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 позволяет изолированным процессам общаться: каналы, разделяемая память, сигналы, сокеты.
  • Слишком частые переключения вредят производительности.
Проверьте себя
1. Зачем нужно переключение контекста?
AЧтобы ускорить отдельный процесс
BЧтобы процессор мог переключаться между процессами, создавая иллюзию параллелизма
CЧтобы освободить место на диске
DЧтобы зашифровать память процесса
2. Почему переключение контекста считается накладными расходами?
AОно требует доступа к сети
BВо время него процессор не делает полезной работы, а ещё страдает кэш и таблица страниц
CОно всегда завершает процесс
DОно требует перезагрузки системы
3. Какой механизм IPC стоит за символом | в командной строке (ls | grep)?
AСигнал
BРазделяемая память
CКанал (pipe)
DОчередь сообщений
4. Что делает сигнал SIGKILL?
AВежливо просит процесс завершиться
BПринудительно завершает процесс
CПриостанавливает процесс до сигнала продолжения
DСоздаёт копию процесса
Поддержать проект