В чем разница между кооперативной и вытесняющей многозадачностью

«В чем разница между кооперативной и вытесняющей многозадачностью» — вопрос из категории Golang, который задают на 24% собеседований Golang Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Кооперативная многозадачность требует, чтобы процессы добровольно отдавали управление (например, через yield). Если процесс завис, вся система блокируется. Пример в Go — горутины до Go 1.14 (кооперативные через вызовы функций).

Вытесняющая многозадачность позволяет ОС/рантайму принудительно переключать контекст, даже если процесс не готов. Современные горутины в Go (с версии 1.14) используют вытеснение на уровне сигналов ОС или отметок времени.

Пример кооперативности (псевдокод):

func task1() {
    for {
        // работа
        yield() // явная передача управления
    }
}

Вытеснение избавляет от необходимости ручного управления, но сложнее в реализации.