信号量与互斥量都一样,都是特殊的队列。但是只有互斥量实现了优先级继承机制。
信号量与互斥量与队列一样,在操作增加或者减少时,必须先关中断在进行操作!
信号量创建揭秘
图中信号量的创建过程,在代码中的体现本质就是创建队列,不过传入的参数有些特殊。例如,第一个传入的参数是队列的长度1,第二个是每个元素的大小0。为什么是1呢,因为我们本质上是不需要使用队列进行消息传递的,所以我们将元素大小设置为0,队列长度设置为1即可。那么信号量是如何实现计数呢,队列中有个特殊的变量用于计算队列的长度,我们只需要根据需要即可实现设置信号量大小,增加或减少信号量的值。
优先级反转机制
在任务切换运行的过程中,如果低优先级的任务先获取了互斥量,而高优先级任务无法获取时。这时,高优先级任务就会进入阻塞状态,顺带提高一手低优先级任务的优先级。优先级是如何反转的呢,首先将低优先级任务移除就绪队列,设置低优先级任务的优先级,再放到就绪队列中,这样就完成了优先级反转。低优先级任务完成后,会自动唤醒高优先级任务,此时低优先级任务会被移除就绪队列,设置回原来的优先级,再放到就绪队列中,这样就完成优先级取消。