读写自旋锁

1:什么是自旋锁?
自旋锁就是互斥的同步原语,试图进入临界区的线程只用忙等的方式检测锁的状态。如果检测到锁未被持有,则进入临界区。因为采用忙等的方式,所以自旋锁必须是锁住很小的一块儿代码,并且很短的时间片。

2:读写自旋锁?
有些线程在临界区内只是简单的读取一些信息,不会涉及到信息的修改,允许读取信息的线程进入临界区不会有危险,同时还可以提高性能。所以将这些线程区分为读线程和写线程,从而就有了读写自旋锁。

3:如何使用?
临界区里面保护的共享资源有可能是一个单一变量,也可能是多个变量或者一个复杂结构的文件。所以每个共享的资源对应一把读写自旋锁。线程只允许采用如下方式来访问自旋锁。
1> 申请锁
2> 获得锁之后,读写共享资源
3> 释放锁

4:自旋锁满足四个属性
1> 互斥:任何时刻读者写者不能同时进入临界区。任意时刻只能至多一个写者进入临界区
2> 读者并发:满足互斥的前提下,多个读者可以同时进入临界区
3> 无死锁
4> 忙等:读写锁只用于很小的代码片段,线程等待期间不可以进入睡眠状态,因为睡眠/ 唤醒非常的耗时,大大延迟了获得锁的时间。

5:读者与写着竞争获得锁的时候,有一定的偏好策略
(1)读者优先:
如果锁被读者拥有,则优先偏好读者进入临界区
(2)写者优先:
写者在后到的读者/写者之前抢到锁

时间: 2024-10-09 21:29:04

读写自旋锁的相关文章

大话Linux内核中锁机制之内存屏障、读写自旋锁及顺序锁

大话Linux内核中锁机制之内存屏障.读写自旋锁及顺序锁 在上一篇博文中笔者讨论了关于原子操作和自旋锁的相关内容,本篇博文将继续锁机制的讨论,包括内存屏障.读写自旋锁以及顺序锁的相关内容.下面首先讨论内存屏障的相关内容. 三.内存屏障 不知读者是是否记得在笔者讨论自旋锁的禁止或使能的时候,提到过一个内存屏障函数.OK,接下来,笔者将讨论内存屏障的具体细节内容.我们首先来看下它的概念,Memory Barrier是指编译器和处理器对代码进行优化(对读写指令进行重新排序)后,导致对内存的写入操作不能

内核同步之自旋锁与读写自旋锁

用在多个CPU系统中的锁机制,当一个CPU正访问自旋锁保护的临界区时,临界区将被锁上,其他需要访问此临界区的CPU只能忙等待,直到前面的CPU已访问完临界区,将临界区开锁.自旋锁上锁后让等待线程进行忙等待而不是睡眠阻塞,而信号量是让等待线程睡眠阻塞.自旋锁的忙等待浪费了处理器的时间,但时间通常很短,在1毫秒以下. 自旋锁用于多个CPU系统中,在单处理器系统中,自旋锁不起锁的作用,只是禁止或启用内核抢占.在自旋锁忙等待期间,内核抢占机制还是有效的,等待自旋锁释放的线程可能被更高优先级的线程抢占CP

大话Linux内核中锁机制之原子操作、自旋锁

转至:http://blog.sina.com.cn/s/blog_6d7fa49b01014q7p.html 很多人会问这样的问题,Linux内核中提供了各式各样的同步锁机制到底有何作用?追根到底其实是由于操作系统中存在多进程对共享资源的并发访问,从而引起了进程间的竞态.这其中包括了我们所熟知的SMP系统,多核间的相互竞争资源,单CPU之间的相互竞争,中断和进程间的相互抢占等诸多问题. 通常情况下,如图1所示,对于一段程序,我们的理想是总是美好的,希望它能够这样执行:进程1先对临界区完成操作,

自旋锁&读/写锁

自旋锁 自旋锁(spin lock)是用来在多处理器环境中工作的一种特殊的锁.如果内核控制路径发现自旋锁"开着",就获取锁并继续自己的执行.相反,如果内核控制路径发现由运行在另一个CPU上的内核控制路径"锁着",就在一直循环等待,反复执行一条紧凑的循环指令,直到锁被释放. 一般来说,由自旋锁所保护的每个临界区都是禁止内核抢占的.在单处理器系统上,这种锁本身并不起锁的作用,自旋锁原语仅仅是禁止或启用内核抢占.请注意,在自旋锁忙等期间,内核抢占还是有效的,因此,等待自旋

linux内核同步之每CPU变量、原子操作、内存屏障、自旋锁【转】

转自:http://blog.csdn.net/goodluckwhh/article/details/9005585 版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[-] 一每CPU变量 二原子操作 三优化和内存屏障 四自旋锁 自旋锁 自旋锁的数据结构和宏函数 读写自旋锁 读写自旋锁的相关函数 linux内核中的各种“任务”都能看到内核地址空间,因而它们之间也需要同步和互斥.linux内核支持的同步/互斥手段包括: 技术 功能 作用范围 每CPU变量 为每个CPU复制一份数据

linux 自旋锁和信号量【转】

转自:http://blog.csdn.net/xu_guo/article/details/6072823 版权声明:本文为博主原创文章,未经博主允许不得转载. 自旋锁最多只能被一个可执行线程持有(读写自旋锁除外).自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去(一直占用 CPU ),在那里看是否该自旋锁的保持者已经释放了锁, " 自旋 " 一词就是因此而得名. 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不

linux 自旋锁和信号量

自旋锁最多只能被一个可执行线程持有(读写自旋锁除外).自旋锁不会引起调用者睡眠,如果一个执行线程试图获得一个已经被持有的自旋锁,那么线程就会一直进行忙循环,一直等待下去(一直占用 CPU ),在那里看是否该自旋锁的保持者已经释放了锁, " 自旋 " 一词就是因此而得名. 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁. 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进程上下文使用(因为中断的上下文不允许休

Linux设备驱动程序 之 自旋锁

概念 自旋锁可以再不能休眠的代码中使用,比如中断处理例程:在正确使用的情况下,自旋锁通常可以提供比信号量更高的性能: 一个自旋锁是一个互斥设备,它只能由两个值,锁定和解锁:通常实现为某个整数值中的单个位:希望获得特定锁的代码测试相关位,如果锁可用,则锁定位被设置,而嗲吗继续进入临界区:相反,如果锁被其他人获得,则代码进入忙循环并重复检查这个锁,直到该锁可用为止:这循环就是自旋锁自旋的部分: 自旋锁在不同的架构上实现有所不同,但是核心概念低于所有系统都都是一样的,当存在某个自旋锁时,等待执行忙循环

Linux内核同步机制--自旋锁【转】

本文转载自:http://www.cppblog.com/aaxron/archive/2013/04/12/199386.html 自旋锁与互斥锁有点类似,只是自旋锁不会引起调用者睡眠,如果自旋锁已经被别的执行单元保持,调用者就一直循环在那里看是否该自旋锁的保持者已经释放了锁,"自旋"一词就是因此而得名. 由于自旋锁使用者一般保持锁时间非常短,因此选择自旋而不是睡眠是非常必要的,自旋锁的效率远高于互斥锁. 信号量和读写信号量适合于保持时间较长的情况,它们会导致调用者睡眠,因此只能在进