Открыть сервис

Перемежающееся выполнение

Перемежающееся выполнение (англ. 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 →