驱动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。互斥访问表示一次只有一个线程可以访问共享资源,不能递归申请互斥体。

结构体

注意事项

互斥体 API 函数

示例

posted @ 2024-03-12 09:50  starc再起航  阅读(1)  评论(0编辑  收藏  举报