zoukankan      html  css  js  c++  java
  • Linux 驱动需要考虑的同步问题

    --- title: Linux 驱动需要考虑的同步问题 date: 2020-06-22 07:21:32 categories: tags: - ipc - linux - kernel - driver ---

    http://blog.chinaunix.net/uid-21977330-id-3793200.html

    • 这个数据是不是全局变量?除了当前线程外,其他线程能不能访问它?
      如果其他线程要访问全局数据,那么该数据需要采取某种形式的同步方法。

    • 这个数据会不会在进程上下文和中断上下文中共享?他是不是在两个不同的中断处理程序中共享?
      如果中断中访问共享数据,那么进程中访问共享数据时,需要禁止中断,又由于该数据也是进程共享,应该
      防止被抢占。
      适用的API:

    spin_lock_irqsave()-- spin_unlock_irqrestore()
    spin_lock_irq() -- spin_unlock_irq()
    

    如果只是进程间共享数据,适用的API:

    spin_lock() -- spin_unlock()
    
    • 进程在访问数据是可不可能被抢占?被调度的新程序会不会访问同一数据?
      如果数据对每个处理器是唯一的,那么没有必要使用锁,可以通过禁止内核调度达到数据同步目的。API:
    preempt_disable() : 增加抢占计数,禁止内核抢占
    preempt_enable():减少抢占计数,当值降为0时,检查和执行被挂起的需调度的任务。
    preempt_count() : 返回抢占计数。
    preempt_enable_no_resched(): 激活内核抢占但不再检查任何被挂起的需调度任务。
    
    • 当前进程是不是会睡眠(阻塞)在某些资源上,如果是,他会让共享数据处于何种状态?
      信号量是一种睡眠锁,如果进程试图获得已被占用的信号量时,信号量会将该进程推进一个等待队列,然后让其睡眠。处理器
      去执行其他代码
    • 怎样防止数据失控?
    • 如果这个函数又在另一个处理器上被调度将会发生什么?

    自旋锁:防止多处理器(SMP)的真并发
    禁止调度: 如果数据对每个处理器是唯一的,那么没有必要使用锁,可以通过禁止内核调度达到数据同步目的。

    禁止中断:中断也是系统内核需要同步的主要原因之一。控制中断开关的原因是需要提供同步,通过禁止中断可以
    确保某个中断处理程序不会抢占当前代码,还可以禁止 内核抢占。但它们都没有提供任何保护机制防止来自其他处
    理器的并发访问。单独使用中断屏蔽并不是一个值得推荐的避免竞态的方法,它一般和自旋锁配合使用, 以解决多
    CPU引发的竞态问题。另外关闭中断可能导致中断无法得到及时响应,这也是导致Linux系统不能满足实时系统短响
    应时间要求的原因之一。

    禁止与允许中断的函数包括:

    void disable_irq(int irq); //禁止单个中断,等待成功返回
    void disable_irq_nosync(int irq); //禁止单个中断,不等待返回  
    void enable_irq(int irq); //允许单个中断  
    void local_irq_save(unsigned long flags); //禁止所有中断,并保存标志  
    void local_irq_diable(void); //禁止所有中断  
    void local_irq_restore(unsigned long flags); //使能所有中断,并恢复标志 
    void loval_irq_enable(void); //使能所有中断 
    
  • 相关阅读:
    1012 The Best Rank (25 分)(排序)
    1011. World Cup Betting (20)(查找元素)
    1009 Product of Polynomials (25 分)(模拟)
    1008 Elevator (20 分)(数学问题)
    1006 Sign In and Sign Out (25 分)(查找元素)
    1005 Spell It Right (20 分)(字符串处理)
    Kafka Connect 出现ERROR Failed to flush WorkerSourceTask{id=local-file-source-0}, timed out while wait
    flume、kafka、avro组成的消息系统
    Java23种设计模式总结【转载】
    Java编程 思维导图
  • 原文地址:https://www.cnblogs.com/schips/p/13178614.html
Copyright © 2011-2022 走看看