驱动的互斥

驱动的互斥
        应用程序:互斥可以解决多个进程或线程对共享资源的竞争访问问题
        驱动程序:
        
        驱动:设备号=主设备号+次设备号
           主设备号:表示一类设备,对应一个驱动程序(主设备用来表示一个特定的驱动程序)
           次设备:该类设备中的某一个设备,表示使用驱动程序的某一个设备。

        多个子设备共用一个驱动程序,若多个子设备同时访问该驱动程序,那么就会
        造成竞态访问。如何解决驱动程序的竞态访问问题呢?linux内核提供了多种
        互斥方法:互斥锁  信号量  原子变量 自旋锁。。。
        2.1互斥锁    pthread_mutex_t  mutex;
              1 定义互斥锁
            struct mutex    mutex;//内核互斥锁
            2 初始化互斥锁
            mutex_init(&mutex) ;-->HelloModule
            3 加锁
            mutex_lock(&mutex);-->helloOpen
            4 解锁
            mutex_unlock(&mutex);-->helloClose
      2.2信号量
        1 定义信号量
            struct semaphore  sem;//内核信号量
        2 初始化信号量
            sema_init(&sem,1);-->hellomodule
        3 获取信号量
            down_interruptible(&sem);-->p操作 sem_wait-->helloOpen
        4 释放信号量
            up(&sem);-->V操作 sem_post--->helloClose
            
    2.3原子变量
        1 定义一个原子变量并初始化
        atomic_t    a=ATOMIC_INIT(1);
        注:用原子变量来保证对共享资源访问的原子性操作
        2 如何使用原子变量
            可以通过Linux内核提供的接口函数来操作原子变量
            atomic_dec_and_test
            atomic_inc

        helloOpen:
            atomic_dec_and_test(&a):给原子变量减1,并测试其值是不是0?如果为0,
                                                返回true;如果不为0,返回false。
            if(!atomic_dec_and_test(&a))  
            {
                atomic_inc(&a); a=0
                return -EBUSY;
            }
            使用公共资源

            helloClose:
                    atomic_inc(&a)  
     2.4 自旋锁--》忙等锁
           1 定义自旋锁
            spinlock_t  g_SpinLock;
         2 初始化自旋锁
            spin_lock_init(&g_SpinLock);-->HelloModule
         3 获取自旋锁
            spin_lock(&g_SpinLock);-->HelloOpen
         4 释放自旋锁
            spin_unlock(&g_SpinLock)-->HelloClose

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值