我试图在围棋的背景下更好地理解preemptivecooperative的定义.维基百科全书

在计算中,抢占是暂时中断正在执行的任务的行为,目的是在以后恢复它.此中断由external调度器完成,不需要任务的协助或合作.

维基声明"外部调度器".我猜它的意思是调度程序更具体,因为AFAIK调度程序只负责 Select 队列中的下一个进程.

GO通常被称为partially抢占,因为同步点/抢占点仅在函数调用处,而不在任何给定指令处.这事儿可以理解.但正如维基定义所述,抢占是由外部调度器完成的.

但是,由于CPU可以在执行过程中停止执行任何进程以切换到另一个进程,难道不是每个进程或任务都是抢占式的吗?如有任何澄清,我们不胜感激!

增编

我能想到的唯一解释是,我们谈论的是不同的抢占水平.一个用于进程,另一个用于内核/用户线程.在这种情况下,CPU调度器 Select 下一个进程,但go调度器负责Goroutines/线程.

推荐答案

你的附录是正确的.这里有不同的调度程序在工作.一个是操作系统调度程序,另一个是应用程序级的.看看this article个吧.这正是你要找的:

正如我们在第一篇文章中所讨论的,操作系统调度程序是抢占式调度程序.[.]核心是做决定,一切都是不确定的.

还有这个:

Go调度器是Go运行时的一部分,Go运行时内置于您的应用程序中.这意味着GO调度程序在用户空间中运行,在内核之上.GO调度器的当前实现不是抢占式调度器,而是协作式调度器.作为协作调度器意味着调度器需要在代码中的安全点发生定义良好的用户空间事件来做出调度决策.

结论:存在两种不同的调度器.一个是过程中的,一个是Goroutines的.

Go相关问答推荐

Go协议缓冲区导入问题

macOS上GoLand 2023.3.4中的代码导航

理解Golang并发:缓冲通道的意外行为

GORM Find方法中缺少字段

编辑时保留YAML文件中的单引号

困扰围棋官方巡回赛的S建议所有方法都使用同一类型的接收器

使用Go使用Gorm使用外键对数据进行排序

埃拉托塞尼筛:加快交叉关闭倍数步骤

git ls-remote 成功而 go get 失败

Golang - POST 失败(NoSurf CSRF)

Golang代码判断第一个词是否可以从第二个词形成

如何使用 Docker 引擎 SDK 和 Golang 运行 docker 挂载卷

如何仅提取时间作为持续时间

通过 golang 中的 gremlin-go 库嵌入 gremlin 服务器

GqlGen - 在字段解析器中访问查询输入参数

github.com/rs/zerolog 字段的延迟判断

Golang grpc go.mod 问题

Golang SSH客户端错误无法验证,try 的方法[无公钥],没有支持的方法

Go 错误:cannot use generic type without instantiation

更改单个像素的 colored颜色 - Golang 图像