💬 Что такое кооперативная/вытесняющая многозадачность и какая модель используется в Go?
Go использует особую модель многозадачности, которая сочетает в себе черты обоих подходов:
🔸 Кооперативная многозадачность: в этой модели потоки или задачи сами определяют, когда передать управление. То есть, каждый поток выполняется до тех пор, пока он явно не решит уступить ресурсы, вызвав операцию переключения контекста. Это может привести к проблемам, если один поток занимает процессор слишком долго, так как другим потокам придется ждать.
🔸 Вытесняющая многозадачность: в этом подходе ОС или планировщик задач берет на себя ответственность за переключение между задачами. Делается это на основе таймеров или приоритетов, и задачи могут быть прерваны в любой момент времени.
📌 В контексте Go:
🔸 Go использует горутины, которые работают на базе кооперативной многозадачности, так как переключение контекста происходит только в определенных точках, таких как ввод-вывод, вызовы каналов или операторов
🔸 Однако Go также внедрил элементы вытесняющей многозадачности в свой планировщик. Начиная с версии 1.14, Go позволяет прерывать горутину, если она занимает процессор слишком долго. Это позволяет избежать ситуаций, когда одна горутина блокирует все остальные.
Go использует особую модель многозадачности, которая сочетает в себе черты обоих подходов:
🔸 Кооперативная многозадачность: в этой модели потоки или задачи сами определяют, когда передать управление. То есть, каждый поток выполняется до тех пор, пока он явно не решит уступить ресурсы, вызвав операцию переключения контекста. Это может привести к проблемам, если один поток занимает процессор слишком долго, так как другим потокам придется ждать.
🔸 Вытесняющая многозадачность: в этом подходе ОС или планировщик задач берет на себя ответственность за переключение между задачами. Делается это на основе таймеров или приоритетов, и задачи могут быть прерваны в любой момент времени.
📌 В контексте Go:
🔸 Go использует горутины, которые работают на базе кооперативной многозадачности, так как переключение контекста происходит только в определенных точках, таких как ввод-вывод, вызовы каналов или операторов
select
. Это делает планирование горутин более предсказуемым и эффективным.🔸 Однако Go также внедрил элементы вытесняющей многозадачности в свой планировщик. Начиная с версии 1.14, Go позволяет прерывать горутину, если она занимает процессор слишком долго. Это позволяет избежать ситуаций, когда одна горутина блокирует все остальные.