linux设备驱动之并发控制

一、基本概念

      并发是指多个执行单元同时、并行被执行,而并发的单元对共享资源(硬件资源和软件上的全局变量、静态变量等)的访问很容易导致静态。

二、产生竞态的情况

    主要有三种情况:1.对称多处理器的多个CPU。2.单CPU内进程与抢占它的进程进程。3.中断(硬中断、软中断、Tasklet、底半部)与进程之间。

三、单CPU避免竞态的方法

   避免竞态主要有5种方法分别是中断屏蔽、原子操作、自旋锁、信号量、互斥体。

 1.中断屏蔽

   进入临界区前,屏蔽中断,可以避免因中断引起的竞态。中断可能引起竞态的原因是中断处理程序中可能会访问共享资源。其次中断处理程序也可能被更高优先级的中断打断,多个中断间也可能引起竞态。

   中断屏蔽一般不单独使用,而是配合自旋锁使用。

2.原子操作

   原子操作是指在执行过程中不会被别的代码路径所中断的操作。

   原子操作分为两类:1.整型变量原子操作。2.位原子操作。

   原子操作处理竞态是定义一个原子变量并初始化,访问临界区前先检查原子变量的值,看下是否能进行下一步操作。使用原子操作可以实现设备最多只能被一个进程打开。

3.自旋锁

   自旋锁实现对临界资源互斥访问。CPU执行一个原子操作,测试并设置某个内存变量,测试结果空闲则继续运行,测试结果表明锁被占用,程序将在一个小循环里面重复这个“测试并设置”操作,即自旋。当自旋锁持有者重置该变量释放自旋锁后,某个等待“测试并设置”操作向其调用者报告锁已释放。

    自旋锁使用中要注意的地方:1.临界区很大,或共享设备占用锁的时间长会降低系统性能。2.CPU递归使用自旋锁将导致死锁。3.自旋锁定期间不能调用可能引起进程调度的函数。

    自旋锁衍生出读写锁。读写锁允许读的并发,不允许写的并发,读写不能同时进行。

   读写锁的优化是顺序锁。顺序锁与读写锁的不同之处在于读写可以同时进行,写操作发生后,读执行单元需要重新读取数据。

   读写锁的高性能版本是RCU(读-拷贝-更新)。RCU允许多个读执行单元和写执行单元同时访问被保护的数据。

4.信号量

   信号量是保护临界区的一种常用方法。与自旋锁相同,只有获取到信号量才能执行临界区的代码。与自旋锁不同的是当获取不到信号量时,进程进入休眠等待状态而不是原地打转。

   信号量被初始化为0,可用于同步,同步意味着一个执行单元的继续执行,需等待另一执行单元完成某事,保证执行的先后顺序。

   完成量是比信号量更好的同步机制,前者释放所有等待同一完成量的执行单元,后者只能唤醒一个等待的执行单元。

  读写信号量允许多个读执行单元同时访问共享数据,而最多只有一个写执行单元。

5.互斥体

  互斥体与信号量使用的场合完全一样。



    

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值