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); //使能所有中断 
```

猜你喜欢

转载自www.cnblogs.com/schips/p/13178614.html