近期在读《多处理器编程的艺术》一书,英文版的,最近发现技术类书籍中文翻译版的质量越来越差,译者很多都是单纯为了钱,其实他们在IT领域很多都是大白,因此还是看原汁原味的英文版吧,虽然吃点力,起码准确。我利用地铁上的时间读了自旋锁这一章,感觉很有收获。
自旋锁在单处理器非抢占OS上其实是没有意义的,只有在多处理器上才有意义,最简单的自旋锁就是乱抢的那种,可是所有的处理器上运行的线程都等待同一个变量,会导致所有的争抢锁的处理器的cache被刷新,因此设计者设计出一种新的自旋锁,每个线程自旋在本处理器的变量上,这样不会导致所有的处理器刷新缓存,该版本自旋锁的第一个实现就是array锁,然而array是静态分配大小的,如果争抢锁的线程很少,就会导致空间浪费,于是第二个实现就是队列锁,队列是按需动态扩展的,因此解决了第一个实现中的问题。虽然该种新的自旋锁避免了cache刷新,同时又防止了空间浪费,但是会导致饥饿问题,排在后面的争抢者可能会由于排队时间过长而损失其响应度,因此一种带有超时值的锁油运而生,这样就避免了自旋锁由于排队长期自旋,总之,只要排队自旋锁的队列过长,那么就有可能导致饥饿,那么有没有什么办法限制队列的长度呢?当然是有的,这就是复合锁,就是权衡了超时锁和排队锁的优势,并且加入了一层新的争抢的概念,该一层概念类似于令牌,也就是说只有拿到令牌的线程才可以排队争抢自旋锁,令牌的数量是有限的,因此就限制了队列的长度,如果一个线程拿到了令牌,但是排队超时了,那么它将放弃该令牌,抛出异常,由调用者决定接下来的动作。但是等一下,看看这个锁有什么问题,本来是争抢自旋锁,现在成了争抢令牌,这有何意义,其实争抢令牌是为了让争抢锁更加公平,避免饥饿现象,既然要避免饥饿,那么打破先来先服务是必要的,这个争抢令牌的过程就是打破先来先服务的过程,争抢令牌简单的使用了退避算法,为了不使系统在争抢令牌上开销过大。如果不是为了在已经避免了饥饿的超时锁的基础上兼顾公平性,超时锁已经很不错了,可是复合锁进一步加强了公平性,这种公平就是通过打破先来先服务实现的。
分享到:
相关推荐
自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去,在那里看是否该自旋锁的保持者已经释放了锁,\"自旋\"一词就是因此而得名。由于自旋锁使用...
linux 自旋锁讨论记录,自旋锁与信号量有哪些差别,这里给出答案
信号量与自旋锁
根据《多处理器编程的艺术》一书第七章“自旋锁与争用”编写的C++代码,演示了10种锁的实现。代码为本人学习研究所用,欢迎高手赐教。
本文章是关于信号量、互斥体和自旋锁的区别。
纯英文,专门解析自旋锁起因及解决方法,SQL SERVER DBA必备
linux系统中基于自旋锁的进程调度的实现, 有代码和详细的文档说明,自旋锁(spinlock) 是用C和汇编指令实现的,有助于了解linux系统 内核的加锁机制。 很不错的哦。。。
基于SMP的Linux内核自旋锁分析.pdf
一种Linux内核自旋锁死锁检测机制的设计与实现.pdf
轻量级锁 “轻量级”是相对于使用操作系统互斥量来实现的传统锁而言的。但是,首先需要强调一点的是, 轻量级锁并不是用来代替重量级锁的,它的本意是在没有多线程竞争的前提下,减少传统的重量 级锁使用产生的...
redis实现分布式锁,自旋式加锁,lua原子性解锁
线程同步(Thread Synchronization)是并行编程中非常重要的通讯手段,其中最典型的应用就是用Pthreads提供的锁机制(lock)来对多个线程之间共 享的临界区(Critical Section)进行保护(另一种常用的同步机制是barrier)。
对于互斥锁,如果资源已经被占用,自愿申请者只能进入睡眠状态。但自旋锁不会引起调用者睡眠
在多线程并发编程中Synchronized一直是元老级角色,很多人都会称呼它为重量级锁,但是随着Java SE1.6对Synchronized进行了各种优化之后,有些情况下它并不那么重了,本文详细介绍了Java SE1.6中为了减少获得锁和释放...
golang使用redis的setnx实现了一个自选锁,有key超时,同时也有我们调用redis链接时的超时。 package locker import ( context github.com/go-redis/redis runtime time ) type Lock struct { resource string...
Windows驱动编程视频教程 详尽的讲解 里面还有屏幕录制的录像
自旋锁操作 spin_lock 这里给出了一个示例程序和编译方法,大家可以在运行中体验自旋锁的操作。 后续还有些函数的使用说明。
在多核操作系统环境下,同一时刻多任务同时访问内核,自旋锁可以很好地处理不同处理器之间存在的同步与互斥问题,但自旋锁如果使用不当,极易产生死锁,造成应用层功能无法实现,所以很有必要对自旋锁展开重点测试。...
总结了 linux 设备驱动 自旋锁部分的思维导图
并发控制之自旋锁.pdf