linux中的并发情况:
- 进程;
- 中断;
- CPU;(多核cpu)
并发互斥控制机制:
1. 中断屏蔽;(有中断处理程序访问共享资源时)
说白了, 就是操作硬件的时候,关闭该硬件的中断,使之独占.
中断屏蔽的使用方法:
local_irq_disable(); //关闭local所有中断
....
....
local_irq_enable();
这样可以实现中断的屏蔽,但是同时也会关闭其他的中断,如系统重要的时钟中断,则会影响系统时间系统.
因此, 可以只关闭会与当前操作共享资源的中断源:
disable_irq(int irq_no); //关闭指定的irq
....
enable_irq(int irq_no);
Note: 中断时间尽量短.
2. 原子操作;
并发中不被打断的最小单位.
#include <asm/atomic.h>
3. 自旋锁;(多核cpu)
- CPU忙等待: cpu死循环空转, 等待 释放锁.
- 进程递归获得锁时, 会导致死锁.
- 适合于 占用锁时间<睡眠唤醒时间的场合
spin_lock(&v);
spin_unlock(&v)
4. 信号量;(进程间并发,如果有中断,需要与中断屏蔽混合使用)
- 用于并发互斥的资源计数
相对于自旋锁, 信号量会睡眠;
睡眠: 类似于
sleep
, 在资源无法访问时,进程暂停,暂时让出cpu资源,而不想自旋锁那样死循环占用cpu.
#include <linux/semaphore.h>
static DEFINE_SEMAPHORE(semlock); //定义一个初始值为1的信号量varName;
down(&semlock); //获得打开锁
up(&semlock); //解锁
Note: 中断中不能使用信号量, 因为中断不能睡眠;
5. 互斥体;
- 二元信号量, 0/1;
- 主要用于互斥;
- 使用最多;