文章目录
- 一、互斥量理论基础
一、互斥量理论基础
在多任务系统中,任务A正在使用某个资源,还没用完的情况下任务B也来使用的话,就会出问题。这时就需要互斥量(互斥锁),使用过程如下:
- 互斥量初始值为1,任务A想访问临界资源,先获得并占有互斥量,然后开始访问
- 任务B也想访问临界资源,也要先获得互斥量:被别人占有了,于是阻塞
- 任务A使用完毕,释放互斥量;任务B被唤醒、得到并占有互斥量,然后开始访问临界资源 任务B使用完毕,释放互斥量
概念:谁上锁,谁解锁(程序员自觉)。
1、优先级反转:
- 假设任务A、B、C都想使用串口,优先级A<B<C
- 当任务A获得了串口的互斥量
- 任务C也想使用串口,它将会阻塞、等待A释放互斥量
- 高优先级的任务,被低优先级的任务延迟,这被称为"优先级反转"
2、优先级继承:
- 接上面优先级反转,假设持有互斥锁的是任务A,如果更高优先级的任务B也尝试获得这个锁
- 那任务A可以继承任务B的优先级,等待任务A释放互斥锁就可以恢复他的低优先级
- 任务B也就可以持有锁,互斥锁内部就实现了优先级的提升、恢复
3、递归锁:
谁持有,谁释放(默认)
在持有锁的过程中还可以再次上锁,"take"了N次,要"give"N次,这个锁才会被释放