前言
本文章主要简介Linux内核中涉及的锁机制。
内核锁机制
锁 | 特点 | 使用规则 |
---|---|---|
原子操作 | 使用处理器的原子指令,开销小 | 临界区数据是变量、比特位等简单的数据结构 |
内存屏障 | 使用处理器内存屏障指令或GCC的屏障指令 | 读写指令时序的调整 |
spinlock | 自旋等待 | 中断上下文,短期持有锁,不可递归,临界区不可睡眠 |
信号量 | 可睡眠的锁 | 可长时间持有锁 |
读写信号量 | 可睡眠的锁,可以多个读者同时持有锁,同一时刻只能有一个写者,读者和写者不能同时存在 | 程序员必须界定出临界区时读/写属性才有用 |
mutex | 可睡眠你的互斥锁,比信号量快速和简洁,实现自旋等待机制 | 同一时刻只有一个线程可以持有mutex,由持有锁者负责解锁,即同一个上下文中解锁,不能递归持有锁,不适合内核和用户空间复杂的同步场景 |
RCU | 读者持有锁没有开销,多个读者和写者可以同时共存,写者必须等待所有读者离开临界区才能销毁相关数据 | 受保护资源必须通过指针访问,例如链表 |