我正在阅读有关 SOS_SCHEDULER_YIELD 的内容,并且在阅读了大量有关内部结构(如时钟间隔、线程和量子)的内容后,我对它的工作原理有了很好的理解。
但是还有一个基本问题困扰着我——为什么工作线程会在 4ms 量子之后自愿让出处理器?根据我的理解,因为它是非抢先的:
如果它正在运行,它应该完成任务
如果它需要资源,它将返回等待队列。
这不像线程每 4 毫秒在 RUNNING 和 RUNNABLE 状态之间跳转,对吧?但正如我们所知,在某些情况下它会产生效果,我不确定为什么会发生这种情况。在决定将其从 RUNNING 状态中删除时,线程发生了什么。
编辑:我意识到有很多关于这种等待类型的问题,但我现在不考虑故障排除,而是我想了解什么可以使假设的运行线程产生 CPU。
您可能知道,每个核心有一个调度程序。调度程序决定“谁下一个”。
调度程序上的所有工作人员都被定义为操作系统不被执行,除了一个。可行的是“拥有”核心的人。我们仍然在操作系统中进行抢先式多任务处理,但是操作系统只允许调度一个线程(每个内核)。即,SQL Server 希望控制可以使用 CPU 的线程。
那么,我们如何从拥有(活动)线程切换到任何非活动线程?它是否应该在这 5 分钟 CPU 密集型的东西运行时完成它的查询/任务并且让所有其他人不做任何事情?我们不希望这样,这就是它在 4 毫秒后产生的原因,因此调度程序可以决定下一步该做什么。