[RT_Thread] 【RT-Thread读书笔记】第二部分(3)信号量与互斥量

我爱下载   2019-5-8 11:40 楼主
这里将互斥量在一起学习,因为互斥量是一种特殊信号量。
信号量也是RTOS中非常重要的内容,主要实现线程间通讯机制,线程同步或临界资源互斥访问。
信号量分为二值信号量和计数信号量。基本接口函数包括信号量创建,信号量删除,信号量释放,信号量获取。
这里值得注意的是二值信号量和互斥量的关系,因为他们非常相似。但是二值信号量在使用中会造成优先级翻转问题,因此互斥量应运而生,有效的解决了优先级翻转问题。
下面解释一下他们的差异,这内容来源网络,我觉得写的听明白。
假定我们现在有三个任务,task1,task2,task3,任务优先级task1最高,然后依次降低。我们知道在系统调度的时候当两个任务同时处于就绪态的时候,系统会优先执行优先级高的任务。
好了,让我们来看两个案例:
l 优先级翻转分析(使用信号量)

在例子中,我们使用pend()函数来表示获取信号量,用post()函数来表示释放信号量
18.jpg
如上图所示,过程分下面几步
1) 一开始task3开始运行,先获取到信号量;
2) task1开始运行尝试去获取信号量失败被阻塞等待task3执行完;
3) task3运行过程中,task2被触发,由于其优先级高于task3,task2被运行,浪费了大量时间;
4) 继续运行task3,运行完后释放信号量;
5) task1继续运行;
看到这里我们可以得知,本应该优先级最高的task1结果居然是最后开始运行的,这就是优先级反转现象。这明显是不利的。比如如果有安装看门狗,task1在长时间没有得到执行,就会触发看门狗,导致系统的重启。
l 改进分析(使用互斥锁)

在例子中,我们使用lock()函数来表示获取互斥锁,用unlock()函数来表示释放互斥锁。
19.jpg
如上图所示,过程分下面几步
1) 一开始task3开始运行,先获取到互斥锁
2) task1开始运行尝试去获取互斥锁失败被阻塞等待task3执行完,但是此时提升task3的优先级,让其优先级跟自己一样
3) task3运行过程中,task2被触发,由于其优先级低于task3(第2步被提升过),task2等待运行
4) 继续运行task3,运行完后释放互斥锁
5) task1继续运行
6) task1执行完,执行task2
所以过程跟前面的虽然一样,但是互斥锁多做了一个步骤就是将task3的优先级提升到task1的级别,防止task2中途出来搅局浪费大量时间。
其中信号量和互斥量关系的对比部分来源于网络。
此内容由EEWORLD论坛网友我爱下载原创,如需转载或用于商业用途需征得作者同意并注明出处 本帖最后由 我爱下载 于 2019-5-8 11:42 编辑

回复评论 (2)

部分内容来源于网络,但是对于信号量和互斥量的讲解我认为非常不错,所以一起作为学习笔记展现出来
点赞  2019-5-8 11:41

用心了

点赞  2019-10-12 19:01
电子工程世界版权所有 京B2-20211791 京ICP备10001474号-1 京公网安备 11010802033920号
    写回复