1. 概念
并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行,但任一个时刻点上只有一个程序在处理机上运行。
来源:
1. Linux 系统运行多个进程, 在同一时间, 不止一个进程能够试图使用你的驱动.
2. 大部分设备能够中断处理器; 中断处理异步运行, 并且可能在你的驱动试图做其他事情的同一时间被调用.
3. 几个软件抽象( 例如内核定时器,)也异步运行.
4. Linux 可以在对称多处理器系统( SMP )上运行, 结果是你的驱动可能在多个 CPU 上并发执行.
在 2.6, 内核代码已经是可抢占的了; 这个变化使得即便是单处理器会有许多与多处理器系统同样的并发问题.
竞态: 不同的执行顺序导致不同的,非预期的行为发生。
死锁:是指两个或两个以上的进程在执行过程中,因争夺资源而造成的一种互相等待的现象,若无外力作用,它们都将无法推进下去。 由于资源占用是互斥的,当某个进程提出申请资源后,使得有关进程在无外力协助下,永远分配不到必需的资源而无法继续运行,这就产生了一种特殊现象:死锁
(1) 互斥条件:一个资源每次只能被一个进程使用。
(2) 请求与保持条件:一个进程因请求资源而阻塞时,对已获得的资源保持不放。
(3) 不剥夺条件:进程已获得的资源,在末使用完之前,不能强行剥夺。
(4) 循环等待条件:若干进程之间形成一种头尾相接的循环等待资源关系。
存在一个进程等待队列
{P1 , P2 , … , Pn}, 其中P1等待P2占有的资源,P2等待P3占有的资源,…,Pn等待P1占有的资源,形成一个进程等待环路
2. 处理并发
semaphore:
可计数。Binary semaphore = mutual exclusion。
PV操作。分可中断非可中断。条件不满足,休眠。
rwsem(reader/writer semaphore): 多并发读。
completion:
比信号量又啥好处?
spinlock:
不能sleep,只能busy wait。
采用spinlock的代码,代码要短小。
rwlock(reader/writer lock): 多并发读。
seqlock:要保护的资源很小,很简单,会被频繁访问而且写入访问很小发生,且必须快速时。
RCU:(read-copy-update)多读,少写。
锁之外的方法:
circular buffer, <linux/kfifo.h>
处理器原子操作:
原子变量:atomic_t 不能大于24的整数。
原子位操作: 硬件支持。 不推荐,推荐spinlock。
原子上下文: 执行多个步骤时,不能有任何的并发访问。