`
webcenterol
  • 浏览: 926330 次
文章分类
社区版块
存档分类
最新评论

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);

分享到:
评论

相关推荐

    我们使std :: shared_mutex快10倍

    例如,自旋锁(spinlock)或自适应自旋锁(adaptive spinlock)可能被用作std::shared_mutex的替代,减少线程阻塞和上下文切换。 4. **无锁编程(Lock-Free Programming)**:尽管std::shared_mutex已经是线程安全...

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

    "MCS Spinlock 在 Linux 内核模块实现" MCS Spinlock 是一种高效的自旋锁机制,广泛应用于多处理器系统。自旋锁是一种轻量级的互斥手段,能有效地解决多处理器系统中的互斥问题。Linux 内核作为一种工业用途极广的...

    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的使用,重点解释容易引起迷惑的体系结构相关的实现...

    LINUX内核经典面试题

    Linux中主要有两种内核锁:spinlock和mutex。spinlock是一种忙等锁,用于保护短期的临界资源,而mutex是一种睡眠锁,用于保护长期的临界资源。spinlock通常用于保护中断处理程序和软中断处理程序,而mutex用于保护...

    嵌入式系统Linux内核开发工程师必须掌握的三十道题

    Linux 中主要有三种内核锁:spinlock、mutex 和rwlock。spinlock 是一种低级别的锁机制,适用于短期的锁定操作;mutex 是一种互斥锁机制,适用于长期的锁定操作;rwlock 是一种读写锁机制,适用于读写操作。 二、...

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

    c++封装的常用类,比较牛逼

    C++提供了多种锁类型,如互斥量(std::mutex)、读写锁(std::shared_mutex)、自旋锁(std::spinlock)等。封装的线程锁类可能包含锁的获取与释放,以及更高级的同步策略。 3. **字符串(String)**:C++标准库中...

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

    Linux 内核调度与 Spinlock 的相互关系 本文主要介绍 Linux 内核调度与 Spinlock 之间的相互关系,涵盖了 Spinlock 的基本概念、信号量的概念、 Spinlock 和信号量的对比、自旋锁与 Linux 内核进程调度的关系,以及...

    Linux内核模块编程指南 The Linux Kernel Module Programming Guide

    5. **内核同步与并发控制**:学习spinlock、mutex、semaphore等同步原语,确保内核代码的正确性和稳定性。 6. **内存管理**:理解物理内存和虚拟内存的区别,以及如何使用vm_area_struct和page结构体进行内存管理。...

    Linux应用程序之线程通信

    在Linux中,可以使用`pthread_spinlock_t`类型和`pthread_spin_lock()`、`pthread_spin_unlock()`等函数来实现自旋锁。自旋锁适用于锁的持有时间短,但争用频繁的情况,因为它避免了上下文切换的开销。 总结起来,...

    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设备驱动 ldd3中文第三版

    理解spinlock、mutex、semaphore等同步原语的使用是必要的。 8. **设备树**:在嵌入式系统中,设备树用于描述硬件配置,驱动程序需要能够解析设备树来初始化硬件。 9. **调试技巧**:学会使用kdb、kgdb、dmesg等...

    ldd3源代码 (linux设备驱动程序的源代码)

    这可能涉及到锁(如spinlock、mutex)、信号量等同步原语的使用。 通过这些源代码,你不仅可以学习到如何编写Linux设备驱动,还能理解内核的底层工作原理,这对于提升你的系统级编程技能非常有帮助。在实践中,你...

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

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

    linux 驱动设计

    4. 编程模型:Linux驱动编程通常涉及中断处理、底半部处理(如软irq、tasklet、workqueue)和同步机制(如spinlock、mutex、semaphore)。理解这些机制是编写高效、稳定驱动的关键。 5. 总线驱动和设备驱动:根据...

    Linux驱动头文件

    18. `&lt;linux/spinlock.h&gt;`:自旋锁,用于保护短时间的临界区,防止多线程环境中的数据竞争。 19. `&lt;linux/sched.h&gt;`:调度器头文件,定义了任务状态(如`TASK_NORMAL`、`TASK_INTERRUPTIBLE`)。 20. `&lt;linux/...

    嵌入式linux android驱动工程师 面试题总汇.pdf

    * 并发控制:使用spinlock 自旋锁或mutex 互斥锁来控制多个线程或进程之间的并发访问。 * 互斥控制:使用锁机制来防止多个线程或进程之间的数据竞争和资源竞争。 六、任务调度机制 * 任务调度机制:使用进程调度...

    Linux驱动开发庖丁解牛

    - 内核调用接口:学习如何使用内核提供的API,如`printk`用于打印日志,`mutex`和`spinlock`用于同步,`request_irq`处理中断等。 - 设备模型:理解sysfs、udev、device tree等设备模型,它们在内核中表示和管理...

Global site tag (gtag.js) - Google Analytics