LINUX驱动中的并发控制
2012-12-08 16:16
204 查看
如果多个应用进程同时访问一个外设,就会产生并发竞态
竞态的原因:
(1)SMP多处理器
(2)进程间的任务抢占
(3)中断
解决的方法:
方法一、中断禁止
local_irq_disable
local_irq_enable
中断禁止,只能解决因中断引起的竞态:任务抢占(它是基于中断的)、中断(硬中断,软中断,TASKLET,)
方法二、原子操作:
特点:使用原子变量的设备只能被一个设备打开,因为在打开前先通过原子变量测试看有没有已经被打开
定义原子变量 atomic_t v;
设置原子变量:void atomic_set(&v,int i);
定义并初始化:atomic_t v = ATOMIC_INIT(0);
atomic_inc(&v)
atomic_dec(&v)
操作并测试:atomic_inc_and_test(&v)
atomic_dec_and_test(&v)
方法三:自旋锁
特点:持有锁时间尽可能短,因为当其他任务申请不到锁时,是忙等待,而不会是睡眠等待,所以要求在持有锁期间不能睡眠,或者执行可能引起睡眠的操作
spinlock_t lock;
spinlock_init(&lock);
spin_lock(&lock);
spin_unlock(&lock);
方法四:信号量
特点:和自旋锁差不多,不过申请不到信号,进程处于等待态,持有信号时间可以长,不能用于中断中(可能让任务睡眠)
struct semaphore sem;
sema_init(&sem,0/1);
init_MUTEX(&sem,);
down(&sem):若sleep,则不可被中断打断,一直sleep
up(&sem)
竞态的原因:
(1)SMP多处理器
(2)进程间的任务抢占
(3)中断
解决的方法:
方法一、中断禁止
local_irq_disable
local_irq_enable
中断禁止,只能解决因中断引起的竞态:任务抢占(它是基于中断的)、中断(硬中断,软中断,TASKLET,)
方法二、原子操作:
特点:使用原子变量的设备只能被一个设备打开,因为在打开前先通过原子变量测试看有没有已经被打开
定义原子变量 atomic_t v;
设置原子变量:void atomic_set(&v,int i);
定义并初始化:atomic_t v = ATOMIC_INIT(0);
atomic_inc(&v)
atomic_dec(&v)
操作并测试:atomic_inc_and_test(&v)
atomic_dec_and_test(&v)
方法三:自旋锁
特点:持有锁时间尽可能短,因为当其他任务申请不到锁时,是忙等待,而不会是睡眠等待,所以要求在持有锁期间不能睡眠,或者执行可能引起睡眠的操作
spinlock_t lock;
spinlock_init(&lock);
spin_lock(&lock);
spin_unlock(&lock);
方法四:信号量
特点:和自旋锁差不多,不过申请不到信号,进程处于等待态,持有信号时间可以长,不能用于中断中(可能让任务睡眠)
struct semaphore sem;
sema_init(&sem,0/1);
init_MUTEX(&sem,);
down(&sem):若sleep,则不可被中断打断,一直sleep
up(&sem)
相关文章推荐
- Linux 设备驱动中的并发控制
- linux驱动开发---并发控制
- Linux驱动技术(八) _并发控制技术
- linux驱动学习之并发和竞争控制
- Linux设备驱动开发详解-Note(15)--- Linux 设备驱动中的并发控制(2)
- Linux 设备驱动的并发控制
- Linux 设备驱动 ====> 并发控制 --- 信号量与互斥体
- Linux驱动(五)linux设备驱动中的并发控制
- Linux驱动中的并发控制
- Linux 设备驱动 ====> 并发控制 --- 原子操作
- Linux设备驱动之并发控制
- linux驱动学习--第十三天:第七章 Linux 设备驱动中的并发控制
- Linux 设备驱动 ====> 并发控制 --- 自旋锁
- Linux 驱动之并发控制 (信号量、原子锁和自旋锁)
- linux驱动学习之并发和竞争控制
- Linux设备驱动开发详解-Note(14)--- Linux 设备驱动中的并发控制(1)
- linux驱动的并发控制和阻塞和非阻塞
- linux驱动编程核心理论之并发控制
- Linux 设备驱动中的并发控制
- Linux驱动设备中的并发控制