驱动 (5) 并发与同步

版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(https://blog.csdn.net/u011011827),本人邮箱([email protected]) https://blog.csdn.net/u011011827/article/details/89415520
  • 内核并发1.0

并发分为真并发和伪并发
真并发
	1.cpu(SMP)
伪并发
	2. 进程调度(进程与进程)
	3. 中断与进程
  • 内核并发2.0
归根接地就是这三种原因
中断
调度
SMP

但是

1. 解决 中断 矛盾问题引入了软中断,也就引入了 软中断 产生的竞态

2. 在 __irq_svc 返回时调度, 也就引入了内核抢占的 竞态.


也就是现在有5个原因.

中断
调度
SMP

软中断 // 也就是说 软中断基于中断,如果中断被关闭,软中断产生的并发也就不需要考虑了
内核抢占

各种问题及解决方案

  • 内核抢占
开关内核抢占
  • SMP
不可关 
用自旋锁解决 // 自旋锁 函数中关了抢占 // 自旋锁内不能休眠 (sleep及调度)


  • 中断
开关中断

  • 调度
不可关
互斥锁 //可睡眠

  • 中断底半部(包括软中断)
tasklet 
    中断上下文//但好像是调度出来的,为什么是中断上下文呢? 待验证.
软中断
    中断上下文
工作队列 (线程)
    进程上下文

并发及方案

  • 内核抢占导致的并发
preempt_disable 
preempt_enable
  • SMP导致的 并发
spinlock_t     spinlock;

spin_lock_init(&spinlock);
spin_lock(&spinlock);
spin_unlock(&spinlock);

中断中用
spinlock_t     spinlock;
spin_lock_irqsave
spin_unlock_irqrestore
  • 中断导致的并发
local_irq_disable
local_irq_enable
  • 调度导致的进程间并发
struct mutex mutex;
mutex_init(&mutex); /*定义*/
...
mutex_lock(&mutex); /*获取互斥锁*/
... /*临界资源*/
mutex_unlock(&mutex); /*释放互斥锁*/
  • 底半部导致的并发
分为两种,一种是中断,一种是进程
在上面都已经提到了.

在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/u011011827/article/details/89415520