《linux设备驱动详解》学习笔记(三)---并发控制

一、并发,并不是真正地同时执行,而是“宏观并行,微观串行”。由于并发的存在,可能会出现多个执行单元对共享资源的同时访问,从而很容易导致竞态,主要的竞态发生于如下几种情况:

1、在对称多处理器(SMP)中,多个CPU使用共同的系统总线,访问共同的外设于存储器,这是CPU与CPU之间的竞态;

2、Linux内核中,一个进程可能被另一高优先级的进程打断,抢占进程与被抢占进程可能访问共同资源,这是进程与进程之间的竞态;
3、中断打断正在执行的进程,中断处理程序与被中断的进程可能访问共同资源,这是中断与进程之间的竞态。

二、解决竞态问题的方法:

1、中断屏蔽:可以保证正在执行的内核执行路径不被高优先级进程或中断处理进程所抢占,可避免后两种竞态;
2、原子操作:执行过程不会被别的代码路径所中断的操作;
3、自旋锁:持有锁着方可访问临界资源,如果测试结果表明锁仍然被占用,程序将重复着测试操作,直至锁被其他进程释放,在此期间CPU什么也不做,属于非阻塞的,因此该锁机制适应于占用锁的时间极短的情况下。
(1)普通自旋锁:读与读,读与写,写与写——互斥
(2)读写自旋锁: 读与写,写与写——互斥
(3)顺序自旋锁: 写与写——互斥
4、信号量:使用方法与自旋锁类似,不同的是当获取不到信号量时,进程不会原地打转,而是进入休眠状态,等待着即将释放信号的进程唤醒它,属于阻塞的。信号量机制适应于占用锁的时间较长的情况。

三、自旋锁与信号量的重要API或宏

(1)自旋锁

1、定义自旋锁:spinlock_t lock;

2、初始化自旋锁:spin_lock_init(lock);

3、获取自旋锁: spin_lock(lock);

4、释放自旋锁:spin_unlock(lock);

(2)信号量

1、定义信号量:struct semaphore sem;

2、初始化信号量:void sema_init(struct semaphore *sem,int val);

3、获取信号量:void down(struct semaphore *sem);

4、释放信号量:void up(struct semaphore *sem);


你可能感兴趣的:(linux)