SQLOS 内部 – 调度

SQL*_*ner 2 sql-server-2005 sql-server-2008 sql-server-2012

使用在 Windows Server 2008 R2 SP1 上运行的 SQL Server 2012 Enterprise Edition SP1 对于 SQLOS 上的每个逻辑处理器核心,都有一个分配给它的调度程序。这些调度程序可以被视为状态“VISIBLE ONLINE”sys.dm_os_schedulers

工作线程(任务)可以在调度程序上运行,并且这些线程(任务)可以具有各种状态,例如基于等待队列

a) 暂停在等待队列中等待资源可用
b) 可运行队列(主要是 FIFO,除非受资源调控器控制)或
c) 当前在调度程序上运行。

我的问题是说例如一个任务(SELECT在这种情况下是查询)首先进入调度程序(我们称之为调度程序 A)但发现它必须等到页面被带入内存(IO 操作)它现在被放入等待队列在挂起状态下,一旦 IO 完成,该特定工作线程(任务)就会发出信号并按到达该队列的顺序放入可运行队列。

任务是否总是必须转到调度程序A来完成其时间片,或者它可以切换其上下文,现在可以在没有可运行任务的任何空闲调度程序(我们称之为调度程序B)上运行?如果有上下文切换,它的作用是什么?

Mar*_*ith 6

它必须等待调度程序一个可运行的队列,没有将任务切换到替代调度程序。等待调度器可用的累积时间称为信号等待。

如果一个线程准备好运行,但是分配给它的调度程序当前正在运行另一个会话,那么它将被放置在“可运行”队列中。这意味着它在队列中以获取处理器。这称为信号等待 ( ref )。

这与Suspended在等候名单上累积的时间不同并且是分开的。

信号等待时间由 signal_wait_time_ms 列公开,并且仅是 CPU 等待时间。如果会话正在等待另一个资源变得可用以继续进行,例如锁定页面,或者如果正在运行的会话需要执行 I/O,则将其移至等待列表。这是一个资源等待,等待会话的状态将被记录为“暂停”。(参考)。

从会话到调度程序的关系映射为:

会话 -> 任务 -> 线程 -> 调度器 -> 逻辑 CPU

一旦一个线程被分配给一个调度器,它就会留在那个调度器上直到它完成。它可能会在RunningSuspendedRunnable队列之间重复移动,但仍会分配给一个调度程序。

作为并行执行计划的结果,会话当然可以由分布在多个调度器上的多个任务和线程组成。