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中比较常用 ... 
随机推荐
- MyISAM表杂记实验
			一.本文说明 由于刚学mysql所以动手做了一些实验. 二.实验内容 1.验证MyISAM有AUOT_INCREMENT coloumn功能 ----在这里是对现有表t,增加一个主键----mysql ... 
- 完整学习git三 查看暂存区目录树 git diff
			1显示暂存区中的目录树 git ls-files git ls-tree git diff 魔法 1工作区与暂存区比较 git diff 2工作区与HEAD比较 git diff HEAD 3暂存区与 ... 
- ACM第一站————快速排序
			转载请注明出处,谢谢!http://www.cnblogs.com/Asimple/p/5455125.html 快速排序(Quicksort)是对冒泡排序的一种改进. 快速排序由C. A. ... 
- 杭电1003-Max Sum
			Max Sum Problem Description Given a sequence a[1],a[2],a[3]......a[n], your job is to calculate the ... 
- A Simple Problem with Integers(树状数组HDU4267)
			A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (J ... 
- Pearls
			Pearls Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 7980 Accepted: 3966 Description In ... 
- 花40分钟写一个-CBIR引擎-代码公开
			浏览网页的时候发现一篇不错的文章"用Python和OpenCV创建一个图片搜索引擎的完整指南"http://python.jobbole.com/80860/.作者在浏 ... 
- IOCTL函数用法
			http://blog.163.com/he_junwei/blog/static/19793764620152510533753/ http://blog.csdn.net/styyzxjq2009 ... 
- zend studio 12.0 怎么汉化?
			网上搜索到的答案在:http://zhidao.baidu.com/link?url=OUGXDr0H28ad0UYSCUQ27BziJnymTcfWCmNAmzSRorOe3ZDSRhRXY0QoE ... 
- laravel框架总结(一) -- 请求和响应
			一.laravel请求 1.获取请求 1>获取请求的 URI path 方法会返回请求的 URI.所以,如果接收到的请求目标是 http://domain.com/foo/bar,那么 path ... 
