Кооперативная многозадачность
Кооперативная многозадачность , также известная как невытесняющая многозадачность , — это стиль многозадачности компьютера , при котором операционная система никогда не инициирует переключение контекста с запущенного процесса на другой процесс. Вместо этого, чтобы одновременно запускать несколько приложений, процессы добровольно передают управление периодически, а также в случае простоя или логической блокировки . Этот тип многозадачности называется кооперативным , поскольку для работы схемы планирования все программы должны сотрудничать.
В этой схеме планировщик процессов операционной системы известен как кооперативный планировщик , роль которого ограничивается запуском процессов и предоставлением им возможности добровольно вернуть ему управление. [1] [2]
Это связано с подходом асинхронного программирования .
Использование
[ редактировать ]Хотя он редко используется в качестве основного механизма планирования в современных операционных системах, он широко используется во встроенных системах с ограниченной памятью , а также в конкретных приложениях, таких как CICS или подсистема JES2 . Кооперативная многозадачность была основной схемой планирования для 16-битных приложений, использовавшихся в Microsoft Windows до Windows 95 и Windows NT , а также в классической Mac OS . В Windows 9x использовалась невытесняющая многозадачность для 16-разрядных устаревших приложений, а версии Mac OS X для PowerPC до Leopard использовали ее для классических приложений. [1] NetWare , сетевая операционная система, использовала совместную многозадачность вплоть до NetWare 6.5. Кооперативная многозадачность до сих пор используется в системах RISC OS . [3]
Кооперативная многозадачность аналогична async/await в таких языках, как JavaScript или Python , которые имеют однопоточный цикл событий во время выполнения. Это контрастирует с кооперативной многозадачностью, поскольку await нельзя вызвать из неасинхронной функции, а только из асинхронной функции, которая является своего рода сопрограммой . [4] [5]
Совместная многозадачность позволяет значительно упростить реализацию приложений, поскольку их выполнение никогда не прерывается планировщиком процессов неожиданно; например, различные функции внутри приложения не нуждаются в реентерабельности . [2]
Проблемы
[ редактировать ]Поскольку совместно многозадачная система полагается на то, что каждый процесс регулярно отдает время другим процессам в системе, одна плохо спроектированная программа может потреблять все время ЦП для себя либо путем выполнения обширных вычислений, либо в режиме ожидания ; всей системы оба могут привести к зависанию . В серверной среде это опасность, которая, как часто считается, делает всю среду неприемлемо хрупкой. [1] хотя, как отмечалось выше, совместная многозадачность была часто используется в серверных средах, включая NetWare и CICS.
Напротив, вытесняющая многозадачность прерывает работу приложений и передает управление другим процессам, находящимся вне контроля приложения.
Вероятность зависания системы можно снизить с помощью сторожевого таймера , часто реализуемого аппаратно; обычно это вызывает аппаратный сброс .
Ссылки
[ редактировать ]- ^ Jump up to: а б с «Определение невытесняющей многозадачности» . pcmag.com . Проверено 15 августа 2015 г.
- ^ Jump up to: а б Джо Бартель (5 ноября 2011 г.). «Невытесняющая многозадачность» (PDF) . classiccmp.org . Архивировано из оригинала (PDF) 19 августа 2019 года . Проверено 15 августа 2015 г.
- ^ «Вытесняющая многозадачность» . riscos.info . 2 ноября 2009 года . Проверено 15 августа 2015 г.
- ^ Керкур, Сильвен (25 января 2022 г.). «Асинхронная ржавчина: кооперативное или упреждающее планирование» . Проверено 30 января 2023 г.
- ^ Скворцов, Виктор. «За кулисами Python № 12: Как работает async/await в Python» . Проверено 30 января 2023 г.