Linux驱动开发学习-05.并发和竞争

05.并发和竞争

  • 并发和竞争对于驱动来说就是对临界区资源的保护,很多进程同时运行,同时访问公共设备和数据,要保证这么多进程有序进行访问
  • 加锁和互斥的目的是为了保护共享资源(数据或外设地址)不被多个线程同时访问,而不是保护代码被同时执行

5.1 信号量(semaphore

5.1.1 基本概念

  • 作用:保护临界区资源同一时刻只能有一个进程获取信号量,访问保护的临界区;一个进程未释放信号量,另外的进程试图访问临界区,将不能获取信号量,会睡眠等待释放信号量;多个进程访问未释放信号量的临界区,这些进程将排队等待并睡眠,直到信号量释放,一个一个唤起
  • 应用场景:主要应用在进程上下文环境中,可以睡眠;不能用在不可睡眠的地方,如中断服务程序
  • 操作:信号量为1表示资源可用,为0表示资源不可用,对信号量的加减主要涉及PV操作,进入临界区调用P操作(down)将信号量减1,退出临界区调用V操作(up)将信号量加1

5.1.2 函数接口

  • 头文件(#include <linux/semaphore.h>
  • 初始化
//静态初始化,使用宏
#define DEFINE_SEMAPHORE(name)  \
    struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)
//动态初始化,先定义semaphore指针变量,然后调用
inline void sema_init(struct semaphore *sem, int val)//第2个参数一般为1
  • API
/*加锁,得不到锁的进程将在此处睡眠等待,直到等到锁,中途睡眠不可打断。得到锁后返回继续往下执行*/
extern void down(struct semaphore *sem);
/*加锁,得不到锁的进程,将在此睡眠,进程中途可被其他信号打断,打断后将返回非0,进程继续运行。得到锁后返回0*/ 
extern int __must_check down_interruptible(struct semaphore *sem);
/*与down_interruptible用法差不多,返回值也差不多,在打断信号类型上有要求*/
extern int __must_check down_killable(struct semaphore *sem);
/*不等待不睡眠,得不到锁立即返回*/
extern int __must_check down_trylock(struct semaphore *sem);
/*与down_interruptible差不多,返回值也差不多,区别在于,睡眠不可打断,睡眠时间受第2个参数jiffies限制,时间到,还没获得锁,返回非0*/
extern int __must_check down_timeout(struct semaphore *sem, long jiffies);
/*解锁*/
extern void up(struct semaphore *sem);//

5.2 Completions机制

5.2.1 基本概念

  • 应用场景:一个动作需要等待另外一个动作完成,才能继续下去,这种场景用completions,虽然用信号量也可以做到,但是completions在这种场景要比信号量好,性能上和各种极端情况都要好;completions典型应用是模块退出和线程退出时一起退出
  • completions等待另外动作完成的进程是不杀死的

5.2.2 函数接口

  • 头文件:(#include <linux/completion.h>
  • 初始化
//静态初始化,使用宏
#define DECLARE_COMPLETION(work) \
    struct completion work = COMPLETION_INITIALIZER(work)
//动态初始化
struct completion comp;
init_completion(&comp);
  • API
//等待通知
extern void wait_for_completion(struct completion *);
extern void wait_for_completion_io
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值