驱动Drier-并发和竞争
1.并发&竞争的介绍
- 说要防止并发访问共享资源,换句话说就是要保护共享资源,防止进行并发访问。
- 学习Linux 内核提供的几种并发和竞争的处理方法。
- 保护的是共享数据
1.1并发
- 并发就是多个“用户”同时访问同一个共享资源。
- Linux 系统是个多任务操作系统,会存在多个任务同时访问同一片内存区域,这些任务可能会相互覆盖这段内存中的数据,造成内存数据混乱。针对这个问题必须要做处理,严重的话可能会导致系统崩溃。
1.1.1并发产生的原因
1.2竞争
- 并发访问带来的问题就是竞争
- 如果多个线程同时操作临界区就表示存在竞争,在编写驱动的时候一定要注意避免并发和防止竞争访问。
2.原子操作
原子操作初始化API
原子整形操作-正删改查API
原子位操作API
3.自旋锁
自旋锁结构体定义
自旋锁API
线程与中断并发访问处理 API 函数
下半部竞争处理API函数
读写锁
- 只需要保证在修改此表的时候没人读取,或者在其他人读取此表的时候没有人修改此表就行了。也就是此表的读和写不能同时进行,但是可以多人并发的读取此表。
- 读写自旋锁为读和写操作提供了不同的锁,一次只能允许一个写操作,也就是只能一个线程持有写锁,而且不能进行读操作。但是当没有写操作的时候允许一个或多个线程持有读锁,可以进行并发的读操作。
顺序锁
自旋锁的注意事项
4.信号量
- 计数型信号量不能用于互斥访问,因为它允许多个线程同时访问共享资源。
- 如果要互斥的访问共享资源那么信号量的值就不能大于 1,此时的信号量就是一个二值信号量。
信号量 API 函数
结构体定义
初始化和使用API函数
示例
5.互斥体
- 互斥体—mutex。互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。