Linux驱动开发笔记:设备驱动中的并发控制

本文详细介绍了Linux驱动开发中的并发控制技术,包括原子变量操作(原子整型和位操作)、自旋锁、信号量和完成量的使用。重点讨论了各种机制的工作原理和应用场景,如自旋锁的忙等待特性、信号量的进程睡眠与唤醒以及完成量的线程通知机制。
摘要由CSDN通过智能技术生成

目录

1 并发与竞争

2 原子变量操作

2.1 原子整型操作

2.1 原子位操作

3 自旋锁

4 信号量

4.1 信号量的实现

4.2 信号量的使用

5 完成量

5.1 完成量的实现

5.2 完成量的使用


1 并发与竞争

并发:在操作系统中,一个时间段中有几个程序同时处于就绪状态,等待调度到CPU中运行

竞争:两个或两个以上的进程同时访问一个资源

并发机制:原子变量操作、自旋锁、信号量、完成量

2 原子变量操作

绝对不会在执行结束前被任何其他任务或事件打断(不可被打断操作)

优点:编写简单;

缺点:功能太简单,只能做计数操作,保护的东西太少。

typedef struct {
    volatile int counter;
} atomic_t;

linux中定义了两种操作方法:(1)原子整型操作;(2)原子位操作

2.1 原子整型操作

atomic_t count;

定义了一个atomic_t类型的变量

atomic_t类型变量只能通过Linux内核中定义的专用函数来操作

(1)定义atomic_t变量

ATOMIC_INIT的功能:定义一个atomic_t类型的变量。宏定义如下:

#define ATOMIC_INIT(i) { (i) }

定义一个名为count的atomic_t类型变量的方法:

atomic_t count = ATOMIC_INIT(0);

(2)设置atomic_t变量的值

//设置变量v的值为i
#define atomic_set(v, i) (((v)->counter) = i)  

(3)读atomic_t变量的值

//返回原子类型变量v的值
#define atomic_read(v) ((v)->counter)   

(4)原子变量的加减法

atomic_add()函数用来将第一个参数i的值加到第二个参数v中:

static inline void atomic_add(int i, volatile atomic_t *v)

atomic_sub()函数从原子变量v中减去i的值:

static inline void atomic_sub(int i, volatile atomic_t *v)

(5)原子变量的加减法

atomic_inc()函数用来将v指向的变量加1:


                
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值