Чем отличается вытесняющая многозадачность от кооперативной

Ответ

Оба подхода управляют выполнением нескольких задач на одном процессорном ядре, но различаются тем, кто принимает решение о переключении контекста.

Вытесняющая многозадачность (Preemptive Multitasking)

Планировщик операционной системы (ОС) принудительно прерывает выполнение задачи по истечении выделенного ей кванта времени и передает управление другой задаче. Процесс не контролирует, когда его прервут.

  • Кто управляет: Операционная система.
  • Надежность: Высокая. Одна "зависшая" задача не заблокирует всю систему, так как ОС отберет у нее управление.
  • Пример: Стандартные потоки (threading) в большинстве языков программирования, включая Python. ОС сама решает, когда переключаться между потоками.

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

Задача выполняется до тех пор, пока сама добровольно не передаст управление планировщику. Если задача не отдает управление, другие задачи выполняться не будут.

  • Кто управляет: Сама задача (программный код).
  • Надежность: Низкая. Одна ошибка (например, бесконечный цикл без await) может заблокировать все остальные задачи.
  • Пример: Библиотека asyncio в Python. Корутины должны явно использовать await, чтобы отдать управление циклу событий.
import asyncio

# Пример кооперативной многозадачности
async def task(name, delay):
    print(f"Задача {name} началась")
    # Явная передача управления циклу событий.
    # В этот момент могут выполняться другие задачи.
    await asyncio.sleep(delay)
    print(f"Задача {name} завершилась")

async def main():
    # Задачи выполняются кооперативно
    await asyncio.gather(
        task("A", 1),
        task("B", 0.5)
    )

asyncio.run(main())