Windows 自旋锁分析(四)
来源:互联网 发布:玄彬韩国地位知乎 编辑:程序博客网 时间:2024/06/05 03:49
5,KeAcquireInStackQueuedSp
在单核处理器(WindowsXP)下
观察KeAcquireInStackQueuedSp
hal!KeAcquireInStackQueuedSp
和KeReleaseSpinLock的实现基本上一样的,只不过将原来的IRQL保存在了LockHandle里。
而KeAcquireInStackQueuedSp
在多核处理器(Windows2003)下
仔细比对WRK上的代码和Windbg上的汇编代码,除了一个标志位上有不同外其他实现是一样的。
本来希望对这些汇编代码做一些解释,但是解释来解释去,发现远不如直接用WRK的代码简洁明了。
以下将直接分析WRK上的实现。
下面代码直接复制于WRK
typedef struct _KSPIN_LOCK_QUEUE {
}
typedef struct _KLOCK_QUEUE_HANDLE {
}
KeAcquireInStackQueuedSp
{
}
KxAcquireQueuedSpinLock (PKSPIN_LOCK_QUEUE LockQueue,PKSPIN_LOCK SpinLock )
{
}
ULONG64 KxWaitForLockOwnerShip(PKSPIN_LOCK_QUEUE LockQueue,PKSPIN_LOCK_QUEUE TailQueue)
{
}
下面将分析KeAcquireInStackQueuedSp
如图所示,LockHandle是在栈上建立的的数据。当线程1首次进入InStackQueuedSpinLock时,初始时*SpinLock的值为NULL,因此TailQueue的值也为NULL。SpinLock通过InterlockedExchangePoint
当线程1还在占用状态,线程2准备获得InStackQueuedSpinLock时,由于线程1已经将SpinLock的值置成为线程1上的LockHandle,线程2获得线程1的LockHandle,这时线程2的TailQueue指向线程1的LockHandle,不为空,线程2进入等待状态。
线程2进入等待状态后,先将自己的lock置成等待状态,然后将线程1的LockHandle的next指针置成为指向自己的LockHandle,完成将自己栈上的节点插入链表。
同样,当其他线程准备获得InStackQueuedSpinLock时,将会在自己的栈上建立节点,并插入到线程2的节点之后。
这就是KeAcquireInStackQueuedSp
算法KeAcquireInStackQueuedSp
1,
2,
3,
4,
下面分析释放InStackQueuedSpinLock
KeReleaseInStackQueuedSp
{
}
KxReleaseQueuedSpinLock (PKSPIN_LOCK_QUEUE LockQueue)
{
}
KxWaitForLockChainValid (
{
}
线程准备退出时,首先检查链表上有没有其他节点在等待,如果有节点在等待,直接将下一个节点的Lock的LOCK_QUEUE_WAIT标志位去掉,并将本节点的从链表中脱离出来。
如果没有节点在等待,这时候的操作复杂一些,因为在任何时刻都有可能有节点进入。本节点的Lock指向的是SpinLock,而SpinLock指向的是表尾节点。下面的操作作为一个原子操作完成:
1,
2,
如果是1,已经完成退出操作,直接退出。
如果是2,则等到则点插入完成即当前节点的next指向下一个节点,然后回到刚开始,将下一个节点的Lock的LOCK_QUEUE_WAIT标志位去掉,并将本节点的从链表中脱离出来。
算法KeReleaseInStackQueuedSp
1,
2,
3,
4,
5,
分析:
在单核下,KeAcquireInStackQueuedSp
并没有性能上的提高。
在多核下。KeAcquireInStackQueuedSp
1,
2,
关于更深层次的性能比较,期待其他人的分析了。
- Windows 自旋锁分析(四)
- Windows 自旋锁分析(四)
- Windows 自旋锁分析
- Windows 自旋锁分析
- Windows 自旋锁分析(一)
- Windows 自旋锁分析(二)
- Windows 自旋锁分析(三)
- Windows 自旋锁分析(一)
- Windows 自旋锁分析(二)
- Windows 自旋锁分析(三)
- Windows 自旋锁分析(五)
- Windows 自旋锁分析(完结)
- Windows 自旋锁分析(一)
- Juce源码分析(四)自旋锁
- spinlock自旋锁分析
- 自旋锁透彻分析
- 自旋锁 spin_lock 分析
- 深入分析Linux自旋锁
- Windows 自旋锁分析(三)
- 个人主页实验(APache)
- 三大WEB服务器对比分析(apache ,lighttpd,nginx)
- 报错1
- 外键中引用列的数目与被引用列的数目不等~
- Windows 自旋锁分析(四)
- JAVA反射机制
- 在CentOS 6 中安装 Apache,Mysql, PHP
- POJ 1184 聪明的打字员
- 快速排序2 随机化
- 一些优秀的Java开源库、框架、拓展
- 解决使用Eclipse中调用javadoc的问题
- 对象序列化为何要定义serialVersionUID的来龙去脉
- Windows 自旋锁分析(五)