`
icheng
  • 浏览: 833178 次
  • 性别: Icon_minigender_1
  • 来自: 珠海
文章分类
社区版块
存档分类
最新评论

Linux: spinlock and mutex

 
阅读更多

访问共享资源的代码区域称为临界区。自旋锁(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);

分享到:
评论

相关推荐

    spinlock_test.c

    2.3.5.1 自旋锁不会导致睡眠 自旋锁是一种忙等锁,不会导致睡眠,所以可以用在中断上下文中 2.3.5.2 持有自旋锁不能睡眠 ① 如果是在中断上下文中持有自旋锁,不能睡眠是应有之义 ② 如果是在进程上下文中持有自旋...

    嵌入式系统/ARM技术中的分析Linux中Spinlock在ARM及X86平台上的实现

    本文主要以2.6.22.6内核分析Linux中spinlock在ARM及X86平台上的实现(不同版本的内核实现形式会有一些差异,但原理大致相同)。此处默认大家已经熟悉了spinlock的使用,重点解释容易引起迷惑的体系结构相关的实现...

    MCS spinlock的Linux内核模块实现.pdf

    MCS spinlock的Linux内核模块实现.pdf

    spinlock.rs:Rust 中的自旋锁实现

    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)簡介

    linux内核调度与spinlock的相互关系.docx

    linux内核调度与spinlock的相互关系.docx

    spinlock:Go和内联汇编器中的Spinlock实现

    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

    Linux内核源码深度解析与开发实战视频.zip

    16:不可睡眠锁:自旋锁spinlock编码示例_rec 17:不可睡眠锁:RCUread-copy-update_rec 18:可睡眠锁-互斥量mutex_rec 19:可睡眠锁:信号量semaphore_rec 20:可睡眠锁:读写信号量rwsem_rec 21:可睡眠锁:完成...

    C#多线程编程中的锁系统(四):自旋锁

    三:SpinLock 四:继续SpinLock 五:总结 一:基础 内核锁:基于内核对象构造的锁机制,就是通常说的内核构造模式。用户模式构造和内核模式构造  优点:cpu利用最大化。它发现资源被锁住,请求就排队等候。线程切换...

    嵌入式系统/ARM技术中的spinlock与linux内核调度的关系

     一、自旋锁(spinlock)简介  自旋锁在同一时刻只能被最多一个内核任务持有,所以一个时刻只有一个线程允许存在于临界区中。这点可以应用在多处理机器、或运行在单处理器上的抢占式内核中需要的锁定服务。  二...

    ep-engine:最终持久的Couchbase数据层

    SpinLock 1字节独占锁 也可以使用称为SyncObject 条件变量。 SyncObject将std::mutex和std::condition_variable粘合到一个对象中。 这些原语是通过RAII wrappers- 。 LockHolder -std :: lock_guard的已弃用别名...

    Latch和Lock的区别

    有关oracle当中锁的描述,Latch和Lock的区别,挺不错的。

    cas实现spinlock

    cas实现spinlock

    SpinLock.cpp

    为了效率,不使用C++语言提供的Mutex互斥量,而使用不使用线程被阻塞的方式,即所谓的自旋锁,这是自旋锁的一种实现方式,使用C++11的原子变量,不用锁机制,实现的一种无锁的自旋锁

    Linux系统内核抢占补丁的原理

    Linux 2.4内核正好细化了多CPU下的内核线程同步机构,对不可并行的指令块用spinlock和rwlock作了细致的表示,该补丁的实现可谓水到渠成。具 体的方法就是在进程的任务结构上增加一个preempt_count变量作为内核抢占锁...

    spinlock:自旋锁的不同实现

    来自Lockless Inc 的这篇文章的各种自旋锁实现。 我做了一些修改以使每个实现自包含并提供一个基准脚本。 代码依赖 GCC 的内置函数进行原子内存访问。 注意:可伸缩性是通过避免共享和争用来实现的,而不是通过可...

    acpi控制笔记本风扇转速

    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系统中基于自旋锁的进程调度的实现

    linux系统中基于自旋锁的进程调度的实现, 有代码和详细的文档说明,自旋锁(spinlock) 是用C和汇编指令实现的,有助于了解linux系统 内核的加锁机制。 很不错的哦。。。

    spinlock:Go的自旋锁实现

    自旋锁 Go的实现。 它与共享相同的接口,旨在用于同步异常短暂的操作。安装 go get -u github.com/tidwall/spinlock接触乔希·贝克执照spinlock源代码在MIT下可用。

    LINUX的调度和时钟中断处理代码的分析

    根据操作系统课程设计指导书所提供的基础知识,分析文件kernel/sched.c 和include/asm-i386/spinlock.h 中关于Linux的调度和时钟中断的代码,了解一个LINUX操作系统的进程调度以及时钟中断的处理方式,得到相关的...

Global site tag (gtag.js) - Google Analytics