锁存器和自旋锁(Latch&Spinlock)----Latch类型及模式

转载自:http://blog.csdn.net/burgess_liu/article/details/19607151


Latch类型

Latch的存在是为了保护内存里的数据。有数百种被不同类型的Latch,其中大部分你不大可能会遇到,然而Latch等待偶尔会显示在sys.dm_os_wait_stats中。SQL Server中,Latch可分为两大类,一类是服务缓冲池的被称为BUF Latch(如sys.dm_os_wait_stats里面的PAGELATCH或PAGEIOLATCH,sys.dm_os_latch_stats中的Buffer Latch类);另一类是Non-BUF。通过SELECT * FROM sys.dm_os_latch_stats你可以看到超过150种Latch类型,其中BUFFER类型的最多。如果你查看sys.dm_os_wait_stats的内容,你会看到LATCH_, PAGELATCH_ 和PAGEIOLATCH_打头的Latch,其中LATCH_打头的等待都是用于Non-BUF类型,PAGELATCH_打头的Latch应用于各种页,PAGEIOLATCH_打头的Latch用于数据从磁盘移到RAM。

Latch模式

Latch模式锁模式简单,前者更少,并且兼容性也直接得多。从下面的查询结果中可以看到,有6中Latch模式:NL, KP, SH, UP, EX, DT。

锁存器和自旋锁(Latch&Spinlock)----Latch类型及模式_第1张图片


NL:内置的Null Latch,不需要考虑它。它基本上表示没有Latch在使用,所以它甚至没有记录在正常条件下。

KP:Keep Latch,用于表明需要一个特定的页来完成某事,不应该被破坏掉。

SH:Shared Latch,从页读取数据时需要它。

UP:Update Latch,表明一个页正在被更新,但不是页里面的表数据。与T-SQL中的UPDATE(需要EX Latch)没有关系。

EX:Exclusive Latch,表明数据正在被改变或添加。两个EX Latch不能同时保留在用一个页上。

DT:Destroy Latch,表明页正在从内存中移除。当页的记录被移除时,被删除的页会从Lazy Writer进程中获得一个DT Latch。记住,这未必意味着数据被删除,它可以简单地从Buffer Cache中移除,数据副本仍然驻留在磁盘。然而,从Buffer Cache中移除一个页要走多个步骤,因为SQL Server引擎维护一个哈希表,哈希表罗列当前哪些页在内存里,否则,它就不知道页的内存地址。如果页上有其他Latch,那么就不能有DT Latch,这使得KP Latch更加重要,当需要一个页,但尚未读写时,就要用KP Latch来阻止获得DT Latch。

Latch兼容性



授予顺序

在任何系统中,随着处理器线程数量的增长,大量的请求会排队等待一个特定的页。对于一个没有Latch的页,第一个想要获得Latch的进程会被授予一个Latch,这个不难理解,但当更多的进程开始出现时,行为就有点不同了。KP Latch会完全跳过队列,除非页上有一个DT Latch,KP Latch会往前跳并保持活动的状态。其他的Latch会等待,加入到队列中。当当前的Latch释放了,队列中的第一个Latch会被授予,但这里会有特殊情况发生,队列中和第一个Latch兼容的任何其他Latch会被允许,即使在它前面有不兼容的锁。通过这种方式,队列中的下一个Latch类型总会被授予,但对于其他Latch,在关门的同时也有机会跳进来。

Latch等待

Latch等待是指Latch请求不能被立即授予,其原因有两个,一个是该Latch已经被访问,另一个是与下一个有冲突。仅仅写入Latch模式(UP、EX、DT)提供阻塞任务信息。单任务等待期间,阻塞信息有可能改变。一个任务也可能阻塞它自身,这是由于数据访问的异步性质。

SUPERLATCHES/SUBLATCHES

 经常使用索引的根页常被Latch,每次在索引上执行寻找(seek)时,都必须读取根页以便为找到包含剩余数据的页的路径。SuperLatch通过把单Latch放进一个Sublatch阵列中,一个SubLatch对应一个CPU内核的方式,来提升有32个或更多个逻辑处理器的系统性能。http://blogs.msdn.com/b/psssql/archive/2009/01/28/hot-it-works-sql-server-superlatch-ing-sub-latches.aspx上面有一些有用的关系图来显示这种状况。图7-17显示的正常的Latch情况,而图7-18显示的是SuperLatch和SubLatch的情况。当一个处理器需要EX Latch的时候就会出问题,因为要做到这一点,SuperLatch必须协调所有的SubLatch,来确保它们都能在合适的时间转换成EX Latch。这比获取一个正常的EX Latch更耗资源,所以,如果经常发生并到一定程度,那么SuperLatch就会降级为一个普通的Latch。SuperLatch对于几乎总是只读的页是有利的。