Введение

Компьютерная многозадачность, которая не упреждает процессы Кооперативная многозадачность, также известная как не упреждающая многозадачность, является стилем компьютерной многозадачности, в котором операционная система никогда не инициирует переключение контекста от работающего процесса к другому процессу. Вместо этого, для того, чтобы одновременно запускать несколько приложений, процессы добровольно сдают контроль периодически или когда они находятся в состоянии холостого хода или логически заблокированы. Этот тип многозадачности называется кооперативным, потому что все программы должны сотрудничать, чтобы схема планирования работала. В этой схеме планировщик процессов операционной системы известен как кооперативный планировщик, роль которого ограничивается запуском процессов и предоставлением им возможности добровольно вернуть контроль. Это связано с асинхронным подходом к программированию.

Использование

Хотя он редко используется в качестве основного механизма планирования в современных операционных системах, он широко используется в встроенных системах с ограниченной памятью, а также в конкретных приложениях, таких как CICS или подсистема JES2. Кооперативная многозадачность была основной схемой планирования для 16-битных приложений, используемых Microsoft Windows до Windows 95 и Windows NT, а также классической Mac OS. Windows 9x использовала непревентивную многозадачность для 16-битовых устаревших приложений, а версии PowerPC Mac OS X до Leopard использовали ее для классических приложений. Кооперативная многозадачность похожа на асинхронное ожидание в языках, таких как JavaScript или Python, которые имеют одну поточную петлю событий в своем времени выполнения. Это контрастирует с кооперативной многозадачностью в том, что await не может быть вызвана из не асинхронной функции, а только асинхронной функции, которая является своего рода coroutine. Кооперативная многозадачность позволяет намного упростить реализацию приложений, потому что их выполнение никогда не прерывается планировщиком процессов; например, различные функции внутри приложения не должны быть повторно включенными.