Перемежающееся выполнение
Перемежающееся выполнение (англ. interleaved execution, также interleaving, чередование) — это способ организации вычислений в многозадачных и многопоточных системах, при котором несколько задач или потоков выполняются не параллельно (одновременно на разных процессорах), а последовательно, с частым переключением контекста между ними. В результате создаётся иллюзия одновременного выполнения, хотя в каждый конкретный момент времени процессор занят обработкой только одной задачи. Перемежающееся выполнение является фундаментальным принципом работы операционных систем, реализующих вытесняющую и кооперативную многозадачность.
История
Концепция перемежающегося выполнения возникла в 1950-х — 1960-х годах с появлением первых многозадачных операционных систем. До этого компьютеры работали в пакетном режиме, выполняя программы последовательно, одну за другой. В 1960 году на компьютере IBM 7090 была впервые реализована система CTSS (Compatible Time-Sharing System), которая позволяла нескольким пользователям одновременно работать с машиной за счёт быстрого переключения между их задачами. Это был один из первых примеров перемежающегося выполнения в реальном времени.
В 1970-х годах, с развитием многопользовательских систем Unix, механизмы перемежающегося выполнения стали стандартом. В 1980-х годах появление персональных компьютеров и операционных систем с графическим интерфейсом (например, Microsoft Windows 3.0) сделало чередование задач повсеместным. В 1990-х годах, с распространением многоядерных процессоров, перемежающееся выполнение дополнилось истинным параллелизмом, но осталось важным для управления потоками в рамках одного ядра.
Принцип работы
Перемежающееся выполнение основано на механизме переключения контекста (context switch). Процессор последовательно обрабатывает инструкции каждой задачи, а по истечении определённого кванта времени (time slice) или при возникновении события (например, ожидания ввода-вывода) операционная система приостанавливает текущую задачу, сохраняет её состояние (регистры, счётчик команд, стек) в памяти, загружает состояние следующей задачи и возобновляет её выполнение. Этот процесс повторяется циклически.
Квантование времени
В системах с вытесняющей многозадачностью (например, Windows, Linux, macOS) операционная система выделяет каждой задаче фиксированный квант времени — обычно от 10 до 100 миллисекунд. По истечении кванта происходит принудительное переключение. В кооперативной многозадачности (например, в ранних версиях macOS до Mac OS X или в Windows 3.x) задачи сами добровольно передают управление, что может приводить к зависаниям при ошибках в программе.
Виды перемежающегося выполнения
По способу управления
- Вытесняющее (preemptive) — операционная система принудительно прерывает задачу по таймеру или приоритету. Обеспечивает равномерное распределение процессорного времени и устойчивость к ошибкам.
- Кооперативное (cooperative) — задача сама решает, когда уступить процессор. Проще в реализации, но менее надёжно.
По уровню реализации
- На уровне процессов — переключение между отдельными программами (процессами), имеющими изолированное адресное пространство.
- На уровне потоков (threads) — переключение между потоками внутри одного процесса, разделяющими общую память. Требует меньше накладных расходов, чем переключение процессов.
По типу планировщика
- Циклическое (round-robin) — задачи получают равные кванты времени по кругу.
- Приоритетное — задачи с более высоким приоритетом выполняются чаще или получают большие кванты.
- Смешанное — комбинация циклического и приоритетного планирования.
Преимущества и недостатки
Преимущества
- Иллюзия параллелизма — позволяет одному процессору обслуживать несколько задач, что критично для многопользовательских систем и интерактивных приложений.
- Эффективность использования ресурсов — процессор не простаивает, пока одна задача ожидает ввода-вывода, а переключается на другую.
- Устойчивость — в вытесняющих системах одна зависшая задача не блокирует всю систему.
Недостатки
- Накладные расходы — каждое переключение контекста требует времени (сохранение и восстановление состояния), что снижает производительность. При слишком частых переключениях (менее 1 мс) процессор тратит больше времени на переключение, чем на полезную работу.
- Сложность синхронизации — при перемежающемся выполнении потоков, совместно использующих данные, возникают проблемы гонок (race conditions), требующие использования мьютексов, семафоров и других механизмов синхронизации.
- Неравномерность — в системах с кооперативной многозадачностью недобросовестная задача может монополизировать процессор.
Применение
Перемежающееся выполнение используется во всех современных операционных системах общего назначения, включая Windows, Linux, macOS, Android и iOS. Оно также применяется:
- В веб-серверах — для обработки множества одновременных запросов на одном ядре процессора (например, в архитектуре Nginx с event-driven моделью).
- В встраиваемых системах — в реальном времени (RTOS), где требуется быстрый отклик на внешние события.
- В виртуализации — гипервизоры (например, VMware, KVM) используют перемежающееся выполнение для разделения процессорного времени между гостевыми операционными системами.
- В графических процессорах — для обработки множества потоков шейдеров.
Критика
Основная критика перемежающегося выполнения связана с его неэффективностью на современных многоядерных процессорах. При наличии нескольких ядер истинный параллелизм (одновременное выполнение на разных ядрах) часто предпочтительнее, но перемежающееся выполнение остаётся необходимым для управления потоками в рамках одного ядра, а также для задач, чувствительных к задержкам. Кроме того, в системах с большим количеством потоков (например, в серверах баз данных) накладные расходы на переключение контекста могут стать узким местом, что привело к развитию асинхронного программирования и моделей на основе событий (event-driven), где переключение контекста минимизируется.
Интересные факты
- В первых версиях Windows (3.x) использовалась кооперативная многозадачность, что приводило к частым зависаниям системы при ошибках в приложениях. Переход на вытесняющую многозадачность произошёл в Windows 95.
- В операционной системе Linux квант времени по умолчанию составляет 100 мс для процессов с обычным приоритетом, но может быть изменён через sysctl.
- Термин «перемежающееся выполнение» часто используется в контексте формальной верификации параллельных программ, где чередование операций потоков может приводить к непредсказуемым результатам.
Источники
- Таненбаум Э., Бос Х. «Современные операционные системы». 4-е изд. — СПб.: Питер, 2015.
- Silberschatz A., Galvin P. B., Gagne G. «Operating System Concepts». 10th ed. — Wiley, 2018.
- Керниган Б., Пайк Р. «UNIX. Профессиональное программирование». 2-е изд. — М.: Вильямс, 2006.
- Love R. «Linux Kernel Development». 3rd ed. — Addison-Wesley, 2010.
- Документация Microsoft по планировщику задач Windows (Microsoft Docs).
BFOmetr — база данных и аналитика по компаниям России.
На главную BFOmetr →