stringtranslate.com

Кооперативная многозадачность

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

В этой схеме планировщик процессов операционной системы известен как кооперативный планировщик , роль которого ограничивается запуском процессов и предоставлением им возможности добровольно возвращать ему управление. [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.

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

Вероятность зависания системы можно снизить, используя сторожевой таймер , часто реализуемый аппаратно; обычно это вызывает аппаратный сброс .

Ссылки

  1. ^ abc "Определение невытесняющей многозадачности". pcmag.com . Получено 15 августа 2015 г. .
  2. ^ ab Joe Bartel (5 ноября 2011 г.). "Non-Preemptive Multitasking" (PDF) . classiccmp.org . Архивировано из оригинала (PDF) 19 августа 2019 г. . Получено 15 августа 2015 г. .
  3. ^ "Preemptive multitasking". riscos.info . 2 ноября 2009 г. Получено 15 августа 2015 г.
  4. ^ Керкур, Сильвен (25 января 2022 г.). «Асинхронный Rust: кооперативное планирование против вытесняющего» . Получено 30 января 2023 г.
  5. ^ Скворцов, Виктор. "Python за кулисами #12: Как async/await работает в Python" . Получено 30 января 2023 г.