驱动互斥中断
来源:互联网 发布:开源软件许可证类型 编辑:程序博客网 时间:2024/05/21 08:46
互斥机制:
1、屏蔽中断
2、原子操作
定义原子变量 atomic_t v;
初始化 atomic_t v = ATOMIC_INIT(0);
操作
atomic_t v = ATOMIC_INIT(1);
open
{
if(atomic_dec_and_test(&v)) {
return 0
} else {
atomic_inc(&v);
return -EBUSY;
}
}
release
{
atomic_inc(&v);
}
自旋锁使用:
自旋锁是忙锁:系统开销较大,为了减小系统开销,需要减少等待时间而减少等到时间的唯一方法就是让持有锁的进程尽快释放锁,
而想要尽快释放锁,临界区代码要短小(执行时间短)
可以用在中断上下文中
通过关抢占实现:临界区代码中不能有可能引起睡眠的操作
定义 spinlock_t lock;
初始化 spin_lock_init(spinlock_t *);
spin_lock_init(&lock);
加锁 spin_lock(spinlock_t *);
spin_lock(&lock);
解锁 spin_unlock(spinlock_t *);
spin_unlock(&lock);
自旋锁实现访问控制:
spinlock_t lock;
spin_lock_init(&lock);---->加载函数
int flag = 1;
open
{
spin_lock(&lock);
if (flag == 1) {
flag--;
spin_unlock(&lock);
return 0;
} else {
spin_unlock(&lock);
return -EBUSY;
}
}
release
{
spin_lock(&lock);
flags++;
spin_unlock(&lock);
return 0;
}
对比
信号量 自旋锁
睡眠 忙
临界区可以很大 临界区要小
临界区可以有可能引起睡眠的操作 不能有可能引起睡眠的操作
(但尽量避免睡眠引起的死锁)
不能用在中断上下文中 可以用在中断上下文中
信号量的使用:
1、定义信号量
struct semaphore sema;
2、初始化
sema_init(struct semaphore *sema, int val);
sema_init(&sema, 1);
3、P操作
down(struct semaphore *sema);
down_interruptible(struct semaphore *sema);
down_trylock(struct semaphore *sema);
4、V操作
up(struct semaphre *sema);
struct semaphore sema;
sema_init(&sema, 1); ----> 加载函数
open
{
if(down_trylock(&sema))
return -EBUSY;
return 0;
}
release
{
up(&sema);
}
原子操作
down_interruptible(struct semaphore *sema) ;
当被其他信号唤醒的时候返回
1、屏蔽中断
2、原子操作
定义原子变量 atomic_t v;
初始化 atomic_t v = ATOMIC_INIT(0);
操作
atomic_t v = ATOMIC_INIT(1);
open
{
if(atomic_dec_and_test(&v)) {
return 0
} else {
atomic_inc(&v);
return -EBUSY;
}
}
release
{
atomic_inc(&v);
}
自旋锁使用:
自旋锁是忙锁:系统开销较大,为了减小系统开销,需要减少等待时间而减少等到时间的唯一方法就是让持有锁的进程尽快释放锁,
而想要尽快释放锁,临界区代码要短小(执行时间短)
可以用在中断上下文中
通过关抢占实现:临界区代码中不能有可能引起睡眠的操作
定义 spinlock_t lock;
初始化 spin_lock_init(spinlock_t *);
spin_lock_init(&lock);
加锁 spin_lock(spinlock_t *);
spin_lock(&lock);
解锁 spin_unlock(spinlock_t *);
spin_unlock(&lock);
自旋锁实现访问控制:
spinlock_t lock;
spin_lock_init(&lock);---->加载函数
int flag = 1;
open
{
spin_lock(&lock);
if (flag == 1) {
flag--;
spin_unlock(&lock);
return 0;
} else {
spin_unlock(&lock);
return -EBUSY;
}
}
release
{
spin_lock(&lock);
flags++;
spin_unlock(&lock);
return 0;
}
对比
信号量 自旋锁
睡眠 忙
临界区可以很大 临界区要小
临界区可以有可能引起睡眠的操作 不能有可能引起睡眠的操作
(但尽量避免睡眠引起的死锁)
不能用在中断上下文中 可以用在中断上下文中
信号量的使用:
1、定义信号量
struct semaphore sema;
2、初始化
sema_init(struct semaphore *sema, int val);
sema_init(&sema, 1);
3、P操作
down(struct semaphore *sema);
down_interruptible(struct semaphore *sema);
down_trylock(struct semaphore *sema);
4、V操作
up(struct semaphre *sema);
struct semaphore sema;
sema_init(&sema, 1); ----> 加载函数
open
{
if(down_trylock(&sema))
return -EBUSY;
return 0;
}
release
{
up(&sema);
}
原子操作
原子操作(cont)
自旋锁
自旋锁(cont)(防止中断的影响)
读写锁
读写锁(cont.)
顺序锁顺序锁(cont)
信号量的使用:down_interruptible(struct semaphore *sema) ;
当被其他信号唤醒的时候返回
retrun -ERESTARTSYS;
互斥体
0 0
- 驱动互斥中断
- linux驱动中的互斥途径一二:中断屏蔽和原子操作
- 深入浅出Linux设备驱动同步、互斥
- 字符设备驱动-同步互斥阻塞
- linux字符驱动之同步互斥按键驱动
- linux字符驱动之同步互斥阻塞按键驱动
- linux字符驱动之同步互斥按键驱动
- 4412驱动-sixth_drv 同步互斥按键驱动
- 按键驱动的恩恩怨怨之同步互斥阻塞
- tiny6410按键驱动(五)---同步互斥阻塞
- 字符设备驱动同步之互斥阻塞
- linux驱动中的互斥途径三:自旋锁
- linux驱动中的互斥途径四:信号量、完成量
- linux驱动中的互斥途径五:互斥锁
- 驱动中的同步互斥阻塞之原子量
- linux字符设备驱动-同步互斥阻塞笔记
- 字符设备驱动--异步通知、同步互斥阻塞
- Linux字符设备驱动之同步互斥阻塞
- iOS 自定义相机AVCapture
- UVa 11003 Boxes [DP]
- 表格列表也是叼啊
- maven 父子项目
- Linux查看文件内容
- 驱动互斥中断
- Menu
- Socket编程原理概述
- Linux 系统中编译OpenCV-2.4.9
- jquery on()事件
- Pop
- 协作安装程序应用一例co-installer
- 怎样评估一个程序员?
- <易优美>接触的第一个项目