Кооперативная многозадачность , также известная как невытесняющая многозадачность , — это стиль компьютерной многозадачности , при котором операционная система никогда не инициирует переключение контекста с запущенного процесса на другой процесс. Вместо этого, чтобы запустить несколько приложений одновременно, процессы добровольно уступают управление периодически или при бездействии или логической блокировке . Этот тип многозадачности называется кооперативной , потому что все программы должны сотрудничать для работы схемы планирования.
В этой схеме планировщик процессов операционной системы известен как кооперативный планировщик , роль которого ограничивается запуском процессов и предоставлением им возможности добровольно возвращать ему управление. [1] [2]
Это связано с подходом асинхронного программирования .
Хотя он редко используется в качестве основного механизма планирования в современных операционных системах, он широко используется во встроенных системах с ограниченной памятью , а также в определенных приложениях, таких как CICS или подсистема JES2 . Кооперативная многозадачность была основной схемой планирования для 16-разрядных приложений, используемых Microsoft Windows до Windows 95 и Windows NT , а также классической Mac OS . Windows 9x использовала невытесняющую многозадачность для 16-разрядных устаревших приложений, а версии PowerPC Mac OS X до Leopard использовали ее для классических приложений. [1] NetWare , которая является сетевой операционной системой, использовала кооперативную многозадачность вплоть до NetWare 6.5. Кооперативная многозадачность все еще используется в системах RISC OS . [3]
Кооперативная многозадачность похожа на async/await в таких языках, как JavaScript или Python , которые имеют однопоточный цикл событий в своей среде выполнения. Это контрастирует с кооперативной многозадачностью в том, что await не может быть вызван из неасинхронной функции, а только из асинхронной функции, которая является своего рода сопрограммой . [4] [5]
Кооперативная многозадачность позволяет значительно упростить реализацию приложений, поскольку их выполнение никогда не прерывается неожиданно планировщиком процессов; например, различные функции внутри приложения не нуждаются в повторном входе . [2]
Поскольку кооперативно многозадачная система полагается на то, что каждый процесс регулярно отдает время другим процессам в системе, одна плохо спроектированная программа может потреблять все процессорное время для себя, либо выполняя обширные вычисления, либо занимаясь ожиданием ; и то, и другое приведет к зависанию всей системы . В серверной среде это опасность, которая часто считается делающей всю среду неприемлемо хрупкой, [1] хотя, как отмечалось выше, кооперативная многозадачность часто использовалась в серверных средах, включая NetWare и CICS.
Напротив, вытесняющая многозадачность прерывает работу приложений и передает управление другим процессам, находящимся вне контроля приложения.
Вероятность зависания системы можно снизить, используя сторожевой таймер , часто реализуемый аппаратно; обычно это вызывает аппаратный сброс .