参考资料:

  1. 《Windows Internals》

  2. 自旋锁spinlock剖析与改进

  3. Lock指令前缀

  4. Lock指令前缀(二)

  5. Kernel Dispatcher Objects

  6. Windows同步机制原理

  

  知识点:

  ● 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的更多相关文章

  1. Windows Internals学习笔记(八)IO系统

    参考资料: 1. <Windows Internals> 知识点: ● 当一个进

  2. Windows Internals学习笔记(七)Image Loader

    参考资料: 1. <Windows Internals> 2. Fibers 知识点: ● 当一个进程在系统上启动时,内核将创建一个进程对象来代表它,并执行各种内核相关的初始化任务.然而, ...

  3. Windows Internals学习笔记(六)Windows关键系统组件

    参考资料: 1. <Windows Internals> 2. Dependency Walker 3. Ntoskrnl.exe 4. Livekd的使用 5. WinDbg的使用(一) ...

  4. Windows Internals学习笔记(四)Trap Dispatching

    参考资料: 1. <Windows Internals> 知识点: ● 陷阱trap:它是一种处理器机制,用以在某一异常或中断出现时,捕捉该执行线程,并将其控制权转交到操作系统中某一固定位 ...

  5. Windows Internals学习笔记(二)系统架构

    参考资料: 1. <Windows Internals> 2. http://bestcbooks.com 3. Windows Drive Kit 4. Microsoft Window ...

  6. Windows Internals学习笔记(一)概念与工具

    参考资料: 1. <Windows Internals> 2. Windows Drive Kit 3. Microsoft Windows SDK 4. WDK下载地址 知识点: 1. ...

  7. Windows Internals学习笔记(三)Procdump的使用

    参考资料: 1. 下载地址 2. 使用示例

  8. 【opencv学习笔记五】一个简单程序:图像读取与显示

    今天我们来学习一个最简单的程序,即从文件读取图像并且创建窗口显示该图像. 目录 [imread]图像读取 [namedWindow]创建window窗口 [imshow]图像显示 [imwrite]图 ...

  9. C#可扩展编程之MEF学习笔记(五):MEF高级进阶

    好久没有写博客了,今天抽空继续写MEF系列的文章.有园友提出这种系列的文章要做个目录,看起来方便,所以就抽空做了一个,放到每篇文章的最后. 前面四篇讲了MEF的基础知识,学完了前四篇,MEF中比较常用 ...

随机推荐

  1. 161108、Java IO流读写文件的几个注意点

    平时写IO相关代码机会挺少的,但却都知道使用BufferedXXXX来读写效率高,没想到里面还有这么多陷阱,这两天突然被其中一个陷阱折腾一下:读一个文件,然后写到另外一个文件,前后两个文件居然不一样? ...

  2. React笔记_(2)_react语法1

    这一节内容主要以了解为主. 渐渐的体会react的语法和其特性. ① htmlAndJs 混合编写 react和以往的前后台书写方式不一样. 在之前的多个语言中,讲求的是将页面代码和js代码逻辑分开, ...

  3. Java中如何在另一个类里面使用运行类中的对象,举例说明了一下。

    package 计时器; import java.util.Timer; import java.util.TimerTask; /* * 主要是想在另一个类里面,使用该类的对象,如何使用呢?如何传递 ...

  4. json-encode()怎么进行解码呢?

    解决中文的一种方法就是先将中文转换为另一种编码格式,然后再使用json_encode(),最后再用解码把json串进行解码.还有一种方式就在php新版本中得到了解决,在下面的代码为展示. 以下为代码示 ...

  5. 【转】MySQL5安装的图解(mysql-5.0.27-win32.zip)

    转载地址:http://blog.csdn.net/xssh913913/article/details/1713182 MySQL5安装的图解(最新版) http://hi.baidu.com/yu ...

  6. PHP中cookie和Session

    Cookie与Session cookie 列子 if(!isset($_COOKIE['cookie'])){ setcookie("cookie",date('Y-m-d H: ...

  7. handler以及AnyscTask处理机制

    1.Handler 主文件:MainActivity.java package com.example.asynctaskdownload; import java.io.IOException; i ...

  8. 20160113006 asp.net实现ftp上传代码(解决大文件上传问题)

    using System;using System.Configuration;using System.Data;using System.Linq;using System.Web;using S ...

  9. A Simple Problem with Integers(树状数组HDU4267)

    A Simple Problem with Integers Time Limit: 5000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (J ...

  10. opencv的实用研究--分析轮廓并寻找边界点

    opencv的实用研究--分析轮廓并寻找边界点 ​      轮廓是图像处理中非常常见的.对现实中的图像进行采样.色彩变化.灰度变化之后,能够处理得到的是“轮廓”.它直接地反应你了需要分析对象的边界特 ...