Контекст переключения¶
Контекст переключения (англ. context switch) — это процедура, выполняемая операционной системой (ОС) или аппаратным обеспечением, при которой текущий исполняемый процесс (или поток) приостанавливается, а его состояние (контекст) сохраняется, после чего загружается и восстанавливается контекст другого процесса, которому передаётся управление центральным процессором (ЦП). Данная операция является основой многозадачности, позволяя одному ЦП поочерёдно выполнять несколько задач, создавая иллюзию их одновременной работы.
¶История и предпосылки
Концепция переключения контекста возникла с развитием многозадачных операционных систем в 1960-х годах. Ранние вычислительные системы, такие как IBM OS/360, использовали пакетную обработку, где задачи выполнялись последовательно. С появлением систем разделения времени (например, CTSS и Multics) потребовалась возможность быстрого переключения между пользовательскими сессиями. Аппаратная поддержка контекстного переключения была впервые реализована в процессорах с привилегированным режимом работы, таких как Intel 80286, который ввёл механизмы защиты памяти и переключения задач через таблицы дескрипторов.
¶Механизм переключения контекста
¶Сохраняемое состояние
Контекст процесса включает в себя:
- Регистры процессора: счётчик команд (PC), указатель стека (SP), регистры общего назначения, регистры состояния (флаги).
- Управляющие структуры: указатели на таблицы страниц виртуальной памяти, идентификатор процесса (PID), приоритет, маску сигналов.
- Данные ядра: информация о файловых дескрипторах, текущем рабочем каталоге, лимитах ресурсов.
¶Этапы выполнения
- Сохранение контекста текущего процесса: ОС копирует значения регистров ЦП в структуру task_struct (или PCB — Process Control Block) в памяти.
- Выбор следующего процесса: Планировщик (scheduler) определяет, какой процесс получит управление, на основе алгоритма (например, Round Robin, приоритетное планирование).
- Загрузка контекста нового процесса: Регистры ЦП заполняются сохранёнными значениями выбранного процесса.
- Передача управления: Счётчик команд (PC) устанавливается на адрес, с которого процесс должен продолжить выполнение.
¶Аппаратная и программная поддержка
- Аппаратное переключение: Некоторые процессоры (например, x86 с механизмом TSS — Task State Segment) поддерживают частичное автоматическое сохранение/загрузку контекста. Однако современные ОС (Linux, Windows) редко используют аппаратный TSS, предпочитая программное управление для гибкости.
- Программное переключение: Ядро ОС вручную сохраняет и восстанавливает регистры через инструкции типа
push/popили специализированные вызовы (например,swapcontextв POSIX-системах).
¶Типы контекстного переключения
¶По инициатору
- Добровольное (cooperative): Процесс сам уступает процессор, например, при вызове системного вызова
sleep()илиyield(). Используется в старых ОС (Windows 3.x) и некоторых встраиваемых системах. - Вытесняющее (preemptive): ОС принудительно прерывает процесс по таймеру (квант времени) или при возникновении события (ввод-вывод, аппаратное прерывание). Современные ОС (Linux, Windows NT, macOS) используют вытесняющую многозадачность.
¶По уровню
- Переключение между процессами: Полное сохранение контекста, включая адресное пространство (требует смены таблиц страниц, что дорого).
- Переключение между потоками одного процесса: Более лёгкое, так как потоки разделяют адресное пространство, что сокращает накладные расходы (не требуется сброс кэша TLB).
¶Накладные расходы
Контекстное переключение связано с временными затратами, которые снижают производительность системы:
- Прямые издержки: Время на сохранение/загрузку регистров (обычно 1–10 микросекунд на современных процессорах).
- Косвенные издержки:
- Промахи кэша: После переключения кэш ЦП содержит данные предыдущего процесса, что замедляет доступ к памяти нового процесса.
- Сброс TLB: При переключении между процессами с разными адресными пространствами требуется инвалидация буфера ассоциативной трансляции (TLB).
- Переключение режима: Переход из пользовательского режима в режим ядра и обратно добавляет задержки.
Для минимизации накладных расходов ОС используют:
- Квант времени, достаточный для компенсации издержек (обычно 10–100 мс).
- Приоритетное планирование, чтобы избегать частых переключений для фоновых задач.
- Оптимизацию кэша (например, привязка процессов к конкретным ядрам ЦП — CPU affinity).
¶Применение и значение
Контекстное переключение лежит в основе:
- Многозадачности: Позволяет одновременно выполнять браузер, текстовый редактор и фоновые службы на одном ядре.
- Виртуализации: Гипервизоры (например, KVM, VMware) переключают контекст между виртуальными машинами.
- Реального времени: В системах реального времени (RTOS) переключение должно быть предсказуемым и быстрым (менее 1 мкс).
- Обработки прерываний: При возникновении аппаратного прерывания (например, от диска) ОС переключается на обработчик, сохраняя контекст прерванного процесса.
¶Примеры в операционных системах
¶Linux
Ядро Linux использует вытесняющую многозадачность. Переключение контекста реализовано через функцию context_switch() в файле kernel/sched/core.c. Для потоков (threads) применяется облегчённое переключение — switch_to(), которое не меняет адресное пространство. В Linux также поддерживается контекстное переключение с сохранением FPU (блок операций с плавающей запятой), которое выполняется лениво (lazy FPU switching) для экономии времени.
¶Windows
В Windows NT (и её наследниках) переключение контекста осуществляется диспетчером ядра (Kernel Dispatcher). Процессы имеют приоритеты от 0 до 31, а планировщик использует очереди готовности. Для уменьшения издержек Windows применяет контекстное переключение с кэшированием — при повторном запуске процесса его контекст может быть частично восстановлен из кэша.
¶Встраиваемые системы
В RTOS, таких как FreeRTOS или VxWorks, контекстное переключение оптимизировано для минимальной задержки (обычно < 1 мкс). Часто используется добровольное переключение или переключение по прерываниям без вытеснения между задачами одного приоритета.
¶Критика и ограничения
- Избыточность при высокой нагрузке: При большом числе процессов (сотни) частые переключения могут привести к thrashing — ситуации, когда система тратит больше времени на переключение, чем на выполнение полезной работы.
- Неэффективность для коротких задач: Если процесс выполняет мало инструкций до переключения, накладные расходы могут превышать полезное время.
- Сложность отладки: Переключение контекста может вызывать состояния гонки (race conditions) и проблемы синхронизации, требующие использования мьютексов и семафоров.
¶Интересные факты
- В суперкомпьютерах и высокопроизводительных вычислениях (HPC) контекстное переключение часто отключается для критических задач — процессы привязываются к ядрам ЦП на всё время выполнения (pinning).
- В некоторых архитектурах (например, ARM Cortex-M) переключение контекста выполняется аппаратно для обработки прерываний, что сокращает задержки до 12 тактов.
- В операционной системе Plan 9 от Bell Labs контекстное переключение было реализовано через единый механизм сообщений, что упрощало межпроцессное взаимодействие.
¶Источники
- Таненбаум Э., Бос Х. «Современные операционные системы» (4-е издание, 2015).
- Лав Р. «Linux. Системное программирование» (2-е издание, 2013).
- Документация ядра Linux: «Context Switching» (kernel.org).
- Intel 64 and IA-32 Architectures Software Developer’s Manual (том 3A, раздел 7.2).
- Silberschatz A., Galvin P.B., Gagne G. «Operating System Concepts» (10-е издание, 2018).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →


