1. 并发和竞态:
并发:多个执行单元同时、并行被执行
竞态:当并发的执行单元对共享资源访问时会引起静态
还有一个概念:
临界区:访问的共享资源的代码区域
如何判断是不是会有竞态记住这句话:
只要并发的多个执行单元存在对共享资源的访问,竞态就有可能发生
2. 在linux中,主要的竞态发生在如下的3种情况:
- SMP(对称多处理器) 的多个 CPU
SMP 的特点就是多个 CPU,系统总线只有一套。 - 单 CPU 内进程和抢占它的进程
linux 2.6 内核之后支持抢占调度。
抢占调度指的是 一个进程在内核执行的时候可能被另一高优先级进程打断,
进程与抢占它的进程访问共享资源的情况类似于 SMP 的多个 CPU - 中断(硬中断、软中断、Tasklet、底半部) 与进程之间
中断可以打断正在执行的进程,如果中断处理程序访问进程正在访问的资源,则竞态也会发生。
解决竞态问题的途径是保证对共享资源的互斥访问。
在linux驱动中可采取的互斥途径:
- 中断屏蔽
- 原子操作
- 自旋锁
- 信号量
3. 优缺点:
项\类型 | 等待方式 | 控制区域 | 请求资源速度 | 常用在的函数 |
---|---|---|---|---|
自旋锁 | 忙等待(在内核的运行态) | 不能调用可能引起进程调度的函数不能调用睡眠函数要求短平快 | 相对较快 | 中断处理函数 |
信号量 | 睡眠等待(在睡眠态) | 无限制 | 相对较慢 | 普通函数 |