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); //使能所有中断 
    
  • 相关阅读:
    Openjudge-计算概论(A)-单词翻转
    Openjudge-计算概论(A)-字符串排序
    Openjudge-计算概论(A)-过滤多余的空格
    Openjudge-计算概论(A)-单词倒排
    Openjudge-计算概论(A)-统计字符数
    Openjudge-计算概论(A)-奇数单增序列
    碎碎的光阴(湖北荆门一考生)
    Openjudge-计算概论(A)-找和为K的两个元素
    php延迟加载的示例
    php排序测试
  • 原文地址:https://www.cnblogs.com/schips/p/13178614.html
Copyright © 2011-2022 走看看