Windows Internals学习笔记(五)Synchronization
参考资料:
1. 《Windows Internals》
3. Lock指令前缀
4. Lock指令前缀(二)
知识点:
● Interlocked Operations:最简单的同步机制,基于硬件对安全多处理器整数操作的支持,包括:InterlockedIncrement、interlockedDecrement、InterlockedExchange和InterlockedCompareExchange。比如interlockedDecrement函数,会通过x86指令前缀来锁住多处理的总线(如,地址总线),防止修改某一内存空间。
● Spinlocks:与mutex比较类似,不同之处在于它的使用者往往保持时间比较短,且不会进入休眠状态。在使用的时候,可以设置尝试次数;如果超时,就放弃本次时间片。
两个限制:① 被保护的资源必须被快速访问且不会被其它代码复杂的访问。
② 临界区代码不能被分页在内存外,不能引用可分页的数据,不能调用外部例程(包括系统服务)和不能产生中断和异常。

图1 Spinlock使用实例
● Queued Spinlocks:为增减扩展性的特殊类型spinlock。工作原理:当某一个处理器想获取一个当前已被拥有的QS,它把它的标识符放到与该Spinlock相关的队列中去。让Spinlock被释放的时候,其拥有进程会将lock传递到队列中的第一个进程。 同时,一个进程会检查它前面进程的per-processosr标志位,以判断是否轮到自己了。Wndows定义了很多全局的QS。

图2 全局Queued Spinlocks
● 多处理器环境中,内核外的可执行程序同样需要同步对全局数据结构的访问。比如,内存管理器唯一的页帧数据库。
● 当spinlock不适用时的几种同步机制:①Kernel dispatcher objects、②Fast mutexes and guarded mutexes、③Pushlocks和④Executive resources。
● Windows支持的几种用户模式下的锁原子操作:①Condition variables、②Slim Reader-Writer Locks、③Run-once intialization和④Critical sections。
● Kernel Dispatcher Object:内核会以内核对象的形式提供额外的同步机制给执行程序,这些内核对象的集合即是Dispatcher Objects。线程通过对待内核调度对象的句柄来实现同步。内核会将该线程置于等待状态。任何时刻,内核调度对象都有两种状态:signaled状态和nonsignaled状态(具体对象的signaled状态定义是不同的)。
表1 5种内核调度对象
| Object | Data Type | Description |
|---|---|---|
| Event | KEVENT | Blocks a thread until some other thread detects that an event has occurred |
| Semaphore | KSEMAPHORE | Used instead of an event when an arbitrary number of wait calls can be satisfied |
| Mutex | KMUTEX | Excludes other threads from executing a particular section of code |
| Timer | KTIMER | Delays execution of a thread for some period of time |
| Thread | KTHREAD | Blocks one thread until another thread terminates |
● Fast mutexes又被称为executive mutexes,被广泛使用在设备驱动中,通常提供比mutex对象更好的性能,尽管它也是建立在Dispatcher Event Object上的。它只有在该fast mutex被竞争的情况下才执行wait操作,而标准mutex总是会尝试得到该互斥量。
● Guarded mutexes同fast mutex很相似,只不过是它使用了另一种同步对象(KGATE)而已。
● Executive resource是一种支持共享和互斥访问的同步机制。它常用文件系统驱动程序。
● Pushlock是另一种基于Gate对象的优化同步机制。Pushlock可以以共享或互斥的模式被获得。
Windows Internals学习笔记(五)Synchronization的更多相关文章
- Windows Internals学习笔记(八)IO系统
参考资料: 1. <Windows Internals> 知识点: ● 当一个进
- Windows Internals学习笔记(七)Image Loader
参考资料: 1. <Windows Internals> 2. Fibers 知识点: ● 当一个进程在系统上启动时,内核将创建一个进程对象来代表它,并执行各种内核相关的初始化任务.然而, ...
- Windows Internals学习笔记(六)Windows关键系统组件
参考资料: 1. <Windows Internals> 2. Dependency Walker 3. Ntoskrnl.exe 4. Livekd的使用 5. WinDbg的使用(一) ...
- Windows Internals学习笔记(四)Trap Dispatching
参考资料: 1. <Windows Internals> 知识点: ● 陷阱trap:它是一种处理器机制,用以在某一异常或中断出现时,捕捉该执行线程,并将其控制权转交到操作系统中某一固定位 ...
- Windows Internals学习笔记(二)系统架构
参考资料: 1. <Windows Internals> 2. http://bestcbooks.com 3. Windows Drive Kit 4. Microsoft Window ...
- Windows Internals学习笔记(一)概念与工具
参考资料: 1. <Windows Internals> 2. Windows Drive Kit 3. Microsoft Windows SDK 4. WDK下载地址 知识点: 1. ...
- Windows Internals学习笔记(三)Procdump的使用
参考资料: 1. 下载地址 2. 使用示例
- 【opencv学习笔记五】一个简单程序:图像读取与显示
今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...
- C#可扩展编程之MEF学习笔记(五):MEF高级进阶
好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...
随机推荐
- 161018、springMVC中普通类获取注解service方法
1.新建一个类SpringBeanFactoryUtils 实现 ApplicationContextAware package com.loiot.baqi.utils; import org.sp ...
- HTML5之WebSocket
在HTML5规范中,我最喜欢的Web技术就是正迅速变得流行的WebSocket API.WebSocket提供了一个受欢迎的技术,以替代我们过去几年一直在用的Ajax技术.这个新的API提供了一个方法 ...
- redis监控状态
Redis介绍 Redis是一种高级key-value数据库.它跟memcached类似,不过数据可以持久化,而且支持的数据类型很丰富.有字符串,链表.哈希.集合和有序集合5种.支持在服务器端计算集合 ...
- freemarker为null处理
http://599073210-qq-com.iteye.com/blog/1401731
- ImageLoader 图片加裁
// String picurl = article.cateLogo;// ImageLoader.getInstance().displayImage(picurl, holder.cate_Lo ...
- HDU 2222:Keywords Search(AC自动机模板)
http://acm.hdu.edu.cn/showproblem.php?pid=2222 KMP是单模式串匹配的算法,而AC自动机是用于多模式串匹配的算法.主要由Trie和KMP的思想构成. 题意 ...
- shell十三问:关于${0##*/} 和${0%/*}
转自shell十三问: http://bbs.chinaunix.net/thread-218853-1-1.html …… 假設我們定義了一個變量為:file=/dir1/dir2/dir3/my ...
- 【转】去掉eclipse的validate
转载地址:http://www.blogjava.net/leisure/archive/2013/01/11/394087.html 困扰了好几天,与大家共享 1,在project名称上右键选择pr ...
- django 自定义标签和过滤器
django 自定义标签和过滤器 Django支持自定义标签和过滤器.起初还不太重视它这项功能,但最近试了试自定义标签.发现django这个功能实在是太爽了. 首先在你项目的一个app中建立一个pyt ...
- 关于Java中的GUI事件处理
关于事件监听的实现过程通过下面的代码来具体说明: package com.sxt; import java.awt.BorderLayout; import java.awt.event.Action ...