stringtranslate.com

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

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

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

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

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

Рекомендации

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