访问共享资源的代码区域称为临界区。自旋锁(spinlock)和互斥体(mutex)是保护内核临界区的两种基本机制。
自旋锁可以确保在同时只有一个线程进入临界区,其它想进入临界区的线程必须不停地原地打转,直到第一个线程释放自旋锁。
下面的例子演示了自旋锁的基本用法:
#include <linux/spinlock.h>
spinlock_t my_lock = SPIN_LOCK_UNLOCKED;
spin_lock(&my_lock);
/* Critical Section code ... */
spin_unlock(&my_lock);
对于抢占内核及SMP机器,使用自旋锁的irq变体 spin_lock_irqsave()/spin_lock_irqrestore()。
互斥体在进入一个被占用的临界区之前不会原地打转,而是使当前线程进入睡眠状态。如果要等待的时间较长,互斥体比自旋锁
更合适。
因此在很多情况下,决定使用自旋锁还是互斥体相对来说很容易:
1) 如果临界区需要睡眠,只能使用互斥体,因为在获得自旋锁后进行调度、抢占以及在等待队列上睡眠都是非法的。
2) 由于互斥体会在面临竞争的情况下将当前线程置于睡眠状态,因此,在中断处理函数中,只能使用自旋锁。
互斥体使用的基本方法:
#include <linux/mutex.h>
static DEFINE_MUTEX(my_mutex);
mutex_lock(&my_mutex);
/* Critical Section code ... */
mutex_unlock(&my_mutex);
分享到:
相关推荐
2.3.5.1 自旋锁不会导致睡眠 自旋锁是一种忙等锁,不会导致睡眠,所以可以用在中断上下文中 2.3.5.2 持有自旋锁不能睡眠 ① 如果是在中断上下文中持有自旋锁,不能睡眠是应有之义 ② 如果是在进程上下文中持有自旋...
本文主要以2.6.22.6内核分析Linux中spinlock在ARM及X86平台上的实现(不同版本的内核实现形式会有一些差异,但原理大致相同)。此处默认大家已经熟悉了spinlock的使用,重点解释容易引起迷惑的体系结构相关的实现...
MCS spinlock的Linux内核模块实现.pdf
use spinlock :: SpinLock; fn main () { let spin = SpinLock :: new ( 0 ); // Write access { let mut data = spin. write (). unwrap (); * data += 1 ; } // Read access { let data = spin. read ...
關於自旋鎖用法介紹的文章,已經有很多,但有些細節的地方點的還不夠透。我這裏就把我個人認為大家容易有疑問的地方拿出來討論一下。 一、自旋鎖(spinlock)簡介
linux内核调度与spinlock的相互关系.docx
goos: linux goarch: amd64 pkg: github.com/daskol/spinlock BenchmarkMutex/1-4 50000000 37.7 ns/op BenchmarkMutex/2-4 30000000 52.4 ns/op BenchmarkMutex/4-4 20000000 64.4 ns/o
16:不可睡眠锁:自旋锁spinlock编码示例_rec 17:不可睡眠锁:RCUread-copy-update_rec 18:可睡眠锁-互斥量mutex_rec 19:可睡眠锁:信号量semaphore_rec 20:可睡眠锁:读写信号量rwsem_rec 21:可睡眠锁:完成...
三:SpinLock 四:继续SpinLock 五:总结 一:基础 内核锁:基于内核对象构造的锁机制,就是通常说的内核构造模式。用户模式构造和内核模式构造 优点:cpu利用最大化。它发现资源被锁住,请求就排队等候。线程切换...
一、自旋锁(spinlock)简介 自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。 二...
SpinLock 1字节独占锁 也可以使用称为SyncObject 条件变量。 SyncObject将std::mutex和std::condition_variable粘合到一个对象中。 这些原语是通过RAII wrappers- 。 LockHolder -std :: lock_guard的已弃用别名...
有关oracle当中锁的描述,Latch和Lock的区别,挺不错的。
cas实现spinlock
为了效率,不使用C++语言提供的Mutex互斥量,而使用不使用线程被阻塞的方式,即所谓的自旋锁,这是自旋锁的一种实现方式,使用C++11的原子变量,不用锁机制,实现的一种无锁的自旋锁
Linux 2.4内核正好细化了多CPU下的内核线程同步机构,对不可并行的指令块用spinlock和rwlock作了细致的表示,该补丁的实现可谓水到渠成。具 体的方法就是在进程的任务结构上增加一个preempt_count变量作为内核抢占锁...
来自Lockless Inc 的这篇文章的各种自旋锁实现。 我做了一些修改以使每个实现自包含并提供一个基准脚本。 代码依赖 GCC 的内置函数进行原子内存访问。 注意:可伸缩性是通过避免共享和争用来实现的,而不是通过可...
These functions now use a spinlock for mutual exclusion and the interrupt level indication flag is not needed. Fixed a problem with the Global Lock where the lock could appear to be obtained before ...
linux系统中基于自旋锁的进程调度的实现, 有代码和详细的文档说明,自旋锁(spinlock) 是用C和汇编指令实现的,有助于了解linux系统 内核的加锁机制。 很不错的哦。。。
自旋锁 Go的实现。 它与共享相同的接口,旨在用于同步异常短暂的操作。安装 go get -u github.com/tidwall/spinlock接触乔希·贝克执照spinlock源代码在MIT下可用。
根据操作系统课程设计指导书所提供的基础知识,分析文件kernel/sched.c 和include/asm-i386/spinlock.h 中关于Linux的调度和时钟中断的代码,了解一个LINUX操作系统的进程调度以及时钟中断的处理方式,得到相关的...