SQL Server OS的任务调度机制

发表于:2013-2-17 09:49

字体: | 上一篇 | 下一篇 | 我要投稿

 作者:CareySon    来源:51Testing软件测试网采编

分享:

  ● 读取数据页时

  ● batch中每一句话做完,就会做一次yield。

  ● 如果客户端不能及时取走数据,worker也会做yield。

  SQL Server OS中的抢占式任务调度

  对于一些代码来说,SQL Server会存在一些抢占式代码。如果您在等待类型中看到“PREEMPTIVE_*”类型的等待,说明这里面的代码正在运行在抢占式任务调度模式。这类任务包括扩展存储过程、调用Windows API、日志增长(日志填0)。我们知道,合作式的任务调度需要任务本身Yield,但这类代码在SQL Server 之外,如果让他们运行在合作式任务调度这个SandBox之内,这类代码如果不yield,则会永远占用Scheduler。这是非常危险的。

  因此,在进入抢占式模式之前,首先需要将Scheduler的控制权交给在Runable队列中的下一个Worker。此时,抢占式模式运行的代码不再由SQL OS控制,转而由Windows任务调度系统控制。因此一个Task的生命周期如果再加上转到抢占式任务调度模式,则会如图6所示。

图6.一个Task完整的生命周期

  每一个Scheduler的任务调度

  对于每一个Scheduler的调度,一个简单的模型如图7所示。

图7.一个Scheduler的调度周期模型

  小结

  SQL Server OS在Windows之上抽象出一套非抢占式的任务调度机制,从而减少了Context Switch。同时,又有一套线程自己的yield机制,相比Windows随机抢占数据库之内的线程而言,让线程自己来yield则会大量减少Context Switch,从而提升了并发性。

44/4<1234
精选软件测试好文,快来阅读吧~

关注51Testing

联系我们

快捷面板 站点地图 联系我们 广告服务 关于我们 站长统计 发展历程

法律顾问:上海兰迪律师事务所 项棋律师
版权所有 上海博为峰软件技术股份有限公司 Copyright©51testing.com 2003-2024
投诉及意见反馈:webmaster@51testing.com; 业务联系:service@51testing.com 021-64471599-8017

沪ICP备05003035号

沪公网安备 31010102002173号