互斥和同步

为什么要用到互斥,是由于cpu调度引起来的,任何一个进程或线程随时都有可能被终止, 运行另一个进程和线程,假如两个进程同时操作一个共享资源(全局变量),就可能引起问题.
  
   驱动里的互斥主要有两种方法:   信号量 和 自旋锁
    信号量: (休眠了)
        void sema_init (struct semaphore *sem, int val);
        void down(struct semaphore * sem);  //不能在中断上下文使用
        int down_interruptible(struct semaphore * sem)// 能被信号打断
        void up(struct semaphore * sem);
   总结: 1. 可以长期加锁
           2. 只能用于进程上下文,不能用于中断
           3. 持有自旋锁时不能持有信号量
    自旋锁: (忙等待)
       
 spin_lock_init(lock)
        spin_lock(lock)
        spin_unlock(lock)

为了防止得到锁的代码在执行时收到本地中断的影响需要用到自旋锁衍生函数

        spin_lock_irqsave
        spin_lock_irqrestore
    总结: 1. 进程获得自旋锁后 copy_to_user copy_from_user kmalloc 这类有可能引起阻塞的函数都不能调用
            2.  短期加锁
            3.  系统开销大
            4.  持有自旋锁时不能持有信号量 也不能第二次持有(死锁)
    原子操作:
        原子整数操作
     int i = 7;
           i++; //此操作cpu执行三个操作  获得 i的值  计算 7+1 =8  将8写回到i中

      atomic.h
     atomic_t u = ATOMIC_INT(4);
     atomic_add (2+&u);

   原子位操作:
     test_and_set_bit(int nr ,void *addr)

               原子设置 所指向对象的第nr位,并返回原先的值


同步:

wait_event(queue,condition);

wait_event_interruptible(queue,condition);

如果condition不满足继续休眠

wake_up_interruptible (wait_queue_head_t *q);
   唤醒 q 指定的注册在等待队列上的进程。该函数不能直接的立即唤醒进程,而是由调度程序转换上下文,调整为可运行状态。

延时的话可以用schedule_timeout(1) 代替msleep(1);


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
互斥同步是计算机科学中常见的概念,用于控制多个线程或进程之间的访问和操作。信号量是实现互斥同步的一种机制。 互斥同步都使用信号量来实现。它们之间的区别在于信号量的操作方法。 互斥是指在同一时间只能有一个线程或进程访问共享资源。在信号量中,互斥可以通过二进制信号量实现,即只有两个状态:0和1。当一个线程或进程想要访问共享资源时,它会请求信号量,并将信号量减1。如果信号量的值为0,则表示共享资源正在被另一个线程或进程使用,当前线程或进程需要等待。当另一个线程或进程释放共享资源时,它会增加信号量的值,此时等待的线程或进程可以重新请求信号量,获取共享资源并开始访问。 同步是指多个线程或进程在执行的时候需要按照特定的顺序执行,以确保正确性和一致性。在信号量中,同步可以通过计数信号量实现,即信号量的值可以大于1。当一个线程或进程想要执行某个操作时,它会请求信号量,并将信号量减1。如果信号量的值为0,则表示另一个线程或进程正在执行某个操作,当前线程或进程需要等待。当另一个线程或进程完成操作并释放信号量时,它会增加信号量的值,此时等待的线程或进程可以重新请求信号量,并开始执行操作。 因此,互斥同步的区别在于信号量的值的范围。二进制信号量用于互斥,计数信号量用于同步

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值