使用在 Windows Server 2008 R2 SP1 上运行的 SQL Server 2012 Enterprise Edition SP1 对于 SQLOS 上的每个逻辑处理器内核,都有一个分配给它的调度程序。这些调度器可以被视为状态“在线可见”sys.dm_os_schedulers
工作线程(任务)可以在调度程序上运行,并且这些线程(任务)可以具有各种状态,例如基于等待队列
a) 挂起在等待资源可用的队列中
b) 可运行队列(主要是 FIFO,除非由 Resource Governor 控制)或
c) 当前在调度程序上运行。
我的问题是,例如一个任务(SELECT
在这种情况下是查询)首先进入调度程序(我们称之为调度程序 A),但发现它必须等到页面被带入内存(IO 操作),它现在被放入等待队列在挂起状态下,一旦 IO 完成,特定工作线程(任务)就会收到信号,并按照到达该队列的顺序放入可运行队列。
任务是否总是必须转到调度程序A以完成其量程,或者它可以切换其上下文并且现在可以在没有可运行任务的任何空闲调度程序(我们称之为调度程序B)上运行?如果有上下文切换,它的作用是什么?
它必须在调度器上等待一个可运行的队列,没有任务切换到替代调度器。等待调度程序可用的累积时间称为信号等待。
Suspended
这与在候补名单上累积的时间不同且分开。从会话到调度程序的关系映射为:
会话 -> 任务 -> 线程 -> 调度程序 -> 逻辑 CPU
一旦一个线程被分配给一个调度器,它就会一直在那个调度器上直到它完成。
Running
它可能会在,Suspended
和队列之间重复移动,Runnable
但仍将分配给一个调度程序。会话当然可以由多个任务和线程组成,这些任务和线程作为并行执行计划的结果分布在多个调度程序中。