В вычислительной технике вытеснение — это действие по временному прерыванию выполняемой задачи с намерением возобновить ее позднее. Это прерывание выполняется внешним планировщиком без какой-либо помощи или сотрудничества со стороны задачи. [1] : 153 Этот вытесняющий планировщик обычно работает в самом привилегированном кольце защиты , что означает, что прерывание и последующее возобновление считаются высокозащищенными действиями. Такие изменения в текущей выполняемой задаче процессора известны как переключение контекста .
В любой данной конструкции системы некоторые операции, выполняемые системой, могут не быть вытесняемыми. Обычно это относится к функциям ядра и прерываниям служб , которые, если им не разрешить работать до завершения , будут иметь тенденцию к созданию условий гонки, приводящих к взаимоблокировке . Запрет планировщику вытеснять задачи, пока они обрабатывают функции ядра, упрощает конструкцию ядра за счет отзывчивости системы . Различие между пользовательским режимом и режимом ядра , которое определяет уровень привилегий в системе, также может использоваться для различения того, является ли задача в данный момент вытесняемой.
Большинство современных операционных систем имеют вытесняющие ядра , которые разработаны для того, чтобы разрешать вытеснение задач даже в режиме ядра. Примерами таких операционных систем являются Solaris 2.0/SunOS 5.0, [2] Windows NT , ядро Linux (2.5.4 и новее), [3] AIX и некоторые системы BSD ( NetBSD , начиная с версии 5).
Термин «вытесняющая многозадачность» используется для различения многозадачной операционной системы , которая допускает вытеснение задач, от кооперативной многозадачной системы, в которой процессы или задачи должны быть явно запрограммированы на прекращение работы, когда им не нужны системные ресурсы.
Проще говоря: вытесняющая многозадачность подразумевает использование механизма прерывания , который приостанавливает текущий выполняемый процесс и вызывает планировщик для определения того, какой процесс должен выполняться следующим. Таким образом, все процессы будут получать некоторое количество процессорного времени в любой момент времени.
В вытесняющей многозадачности ядро операционной системы также может инициировать переключение контекста для удовлетворения ограничения приоритета политики планирования , тем самым вытесняя активную задачу. В общем, вытеснение означает «предварительный захват». Когда высокоприоритетная задача в этом случае захватывает текущую запущенную задачу, это называется вытесняющим планированием.
Термин «вытесняющая многозадачность» иногда ошибочно используется, когда подразумевается более конкретное значение, вместо этого относясь к классу политик планирования, известных как планирование с разделением времени или разделение времени .
Вытесняющая многозадачность позволяет компьютерной системе более надежно гарантировать каждому процессу регулярный «отрезок» рабочего времени. Она также позволяет системе быстро справляться с важными внешними событиями, такими как входящие данные, которые могут потребовать немедленного внимания того или иного процесса.
В любой конкретный момент времени процессы можно сгруппировать в две категории: те, которые ждут ввода или вывода (называемые « привязанными к вводу/выводу »), и те, которые полностью используют ЦП (« привязанные к ЦП »). В ранних системах процессы часто « опрашивали » или « занимались-ждали », ожидая запрошенного ввода (например, ввода с диска, клавиатуры или сети). В это время процесс не выполнял полезной работы, но все еще сохранял полный контроль над ЦП. С появлением прерываний и упреждающей многозадачности эти привязанные к вводу/выводу процессы могли быть «заблокированы» или приостановлены в ожидании поступления необходимых данных, позволяя другим процессам использовать ЦП. Поскольку поступление запрошенных данных приводило к прерыванию, заблокированным процессам можно было гарантировать своевременный возврат к выполнению.
Хотя методы многозадачности изначально были разработаны для того, чтобы позволить нескольким пользователям совместно использовать одну машину, стало очевидно, что многозадачность полезна независимо от количества пользователей. Многие операционные системы, от мэйнфреймов до однопользовательских персональных компьютеров и систем управления без пользователя (например, в роботизированных космических аппаратах ), признали полезность поддержки многозадачности по ряду причин. Многозадачность позволяет одному пользователю запускать несколько приложений одновременно или запускать «фоновые» процессы, сохраняя при этом контроль над компьютером.
Период времени, в течение которого процессу разрешено работать в системе с вытесняющей многозадачностью, обычно называется временным срезом или квантом . [1] : 158 Планировщик запускается один раз в каждый временной срез, чтобы выбрать следующий процесс для запуска. Длина каждого временного среза может иметь решающее значение для балансировки производительности системы и скорости реагирования процесса — если временной срез слишком короткий, то планировщик будет потреблять слишком много времени на обработку, но если временной срез слишком длинный, то процессам потребуется больше времени для ответа на ввод.
Прерывание запланировано, чтобы позволить ядру операционной системы переключаться между процессами, когда их временные интервалы истекают, эффективно позволяя процессорному времени быть разделенным между несколькими задачами, создавая иллюзию того, что он имеет дело с этими задачами параллельно (одновременно). Операционная система, которая управляет такой конструкцией, называется многозадачной системой.
Сегодня практически все операционные системы поддерживают вытесняющую многозадачность, включая текущие версии Windows , macOS , Linux (включая Android ), iOS и iPadOS .
Ранней операционной системой для микрокомпьютеров, обеспечивающей вытесняющую многозадачность, была OS-9 от Microware , доступная для компьютеров на базе Motorola 6809 , включая домашние компьютеры, такие как TRS-80 Color Computer 2, в конфигурации с дисководами, [4] с операционной системой, поставляемой Tandy в качестве обновления. [5] Sinclair QDOS [6] : 18 и AmigaOS на Amiga также были операционными системами для микрокомпьютеров, предлагающими вытесняющую многозадачность в качестве основной функции. Они обе работали на микропроцессорах семейства Motorola 68000 без управления памятью. Amiga OS использовала динамическую загрузку перемещаемых блоков кода (« ханков » на жаргоне Amiga) для вытесняющей многозадачности всех процессов в одном и том же плоском адресном пространстве.
Ранние операционные системы для IBM PC-совместимых , такие как MS-DOS и PC DOS , вообще не поддерживали многозадачность, однако альтернативные операционные системы, такие как MP/M-86 (1981) и Concurrent CP/M-86, поддерживали вытесняющую многозадачность. Другие Unix-подобные системы, включая MINIX и Coherent, обеспечивали вытесняющую многозадачность на персональных компьютерах 1980-х годов.
Более поздние совместимые с MS-DOS системы, изначально поддерживающие вытесняющую многозадачность/многопоточность, включают Concurrent DOS , Multiuser DOS , Novell DOS (позже названную Caldera OpenDOS и DR-DOS 7.02 и выше). Начиная с Concurrent DOS 386 , они также могли запускать несколько программ DOS одновременно на виртуальных машинах DOS .
Самая ранняя версия Windows, поддерживающая ограниченную форму вытесняющей многозадачности, была Windows/386 2.0 , которая использовала режим Virtual 8086 Intel 80386 для запуска приложений DOS на виртуальных машинах 8086 , обычно известных как «DOS-боксы», которые могли быть вытеснены. В Windows 95, 98 и Me 32-разрядные приложения были сделаны вытесняющими, запуская каждое из них в отдельном адресном пространстве, но 16-разрядные приложения оставались кооперативными для обратной совместимости. [7] В Windows 3.1x (защищенный режим) ядро и драйверы виртуальных устройств работали вытесняюще, но все 16-разрядные приложения были невытесняющими и использовали одно и то же адресное пространство.
Вытесняющая многозадачность всегда поддерживалась Windows NT (все версии), OS/2 (собственные приложения), Unix и Unix-подобными системами (такими как Linux , BSD и macOS ), VMS , OS/360 и многими другими операционными системами, разработанными для использования в академических и средних и крупных коммерческих рынках.
Хотя существовали планы по обновлению кооперативной многозадачности, присутствующей в классической Mac OS, до вытесняющей модели (и вытесняющий API существовал в Mac OS 9 , хотя и в ограниченном смысле [8] ), от них отказались в пользу Mac OS X (теперь называемой macOS), которая, являясь гибридом старого стиля Mac System и NeXTSTEP , представляет собой операционную систему на основе ядра Mach и частично происходящую от BSD , которая всегда обеспечивала вытесняющую многозадачность в стиле Unix.