锁存器和自旋锁(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。

wKiom1dqahvxOGsNAADRkRA9Wf0888.jpg


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兼容性


wKiom1dqai6TLL4xAAAxyhVy9is223.jpg


授予顺序

在任何系统中,随着处理器线程数量的增长,大量的请求会排队等待一个特定的页。对于一个没有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对于几乎总是只读的页是有利的。
wKiom1dqaknhqJ0LAACVbR_in7E553.jpg













本文转自UltraSQL51CTO博客,原文链接:http://blog.51cto.com/ultrasql/1791860 ,如需转载请自行联系原作者


相关文章
|
3月前
|
存储 安全 算法
Wound/Wait死锁安全的互斥锁设计 【ChatgGPT】
Wound/Wait死锁安全的互斥锁设计 【ChatgGPT】
|
6月前
|
Java 调度
阻塞锁和自旋锁的理解
总体来说,自旋锁适用于锁定时间短、锁竞争不频繁的场景,而阻塞锁更适合锁定时间较长或锁竞争较频繁的场景。根据具体的应用需求选择合适的锁类型,可以优化系统性能。
97 0
|
Java 程序员 API
【Lock锁的使用与原理】
【Lock锁的使用与原理】
208 0
|
7月前
|
Linux
【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu
【Linux C 几种锁的性能对比】 1.读写锁 2.互斥锁 3.自旋锁 4.信号量 5.rcu
|
7月前
|
Linux
Linux线程同步(try锁和读写锁)
Linux线程同步(try锁和读写锁)
92 0
|
安全 Java 数据库
多线程之Lock显示锁
多线程之Lock显示锁
|
安全 Java
多线程详解p18、Lock锁
多线程详解p18、Lock锁
|
安全 Java
Lock 解析,如何避免死锁?
Lock 解析,如何避免死锁?
Lock 解析,如何避免死锁?
|
安全 Java 调度
多线程同步问题,锁Lock,synchronized
线程同步机制 并发:同一个对象被多个线程同时操作 处理多线程问题时,多个线程访问同一个对象,并且某些线程还想修改这个对象。这时候我们就需要线程同步。线程同步其实就是一种等待机制,多个需要同时访问此对象的线程进入这个对象的等待池形成队列,等待前面线程使用完毕,下一个县城再使用 线程同步形成条件:队列+
|
Java
自旋锁与阻塞锁
自旋锁与阻塞锁
494 0
自旋锁与阻塞锁