版权声明:本文为博主原创文章,任何组织或者个人可以在任何媒介上发表或转载我的文章、图片等.且转载后必须注明出处和邮箱,博客地址(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); /*释放互斥锁*/
- 底半部导致的并发
分为两种,一种是中断,一种是进程
在上面都已经提到了.