二值信号量和互斥锁有何异同
二值信号量和互斥锁有何异同(优先级反转的处理)
絮絮叨叨:之前一直以为互斥锁就是用二值信号量来实现的,但是发现两个还是有本质区别。
信号量和互斥锁
信号量:信号量本质是一种同步机制,用于线程间同步(时间先后顺序)。
信号量典型用例是一个生产者消费者模型,生产者线程进行V操作(释放信号量,信号量++),消费者线程进行P操作(持有信号量,信号量–),信号量为0时,消费无法持有信号量,进入挂起等待状态。
互斥量:互斥量本质是一种锁机制,也叫互斥锁,用于处理资源共享(资源同时只能有一人访问)
互斥锁典型使用场景是设备的访问,在同一时刻只能由一个线程访问。在使用设备前进行加锁,使用完成后进行解锁,在使用过程中由于资源被锁定,其他线程无法进行访问,从而实现临界资源的保护。
二值信号量:只有0和1的信号量。
由于二值信号量和互斥量的特点极为相似,都是只有0和1两种状态,所以二值信号量经常会干互斥锁的活。
二值信号量和互斥锁的异同
相同点:都只有两种状态,0和1,都可以用来作为共享资源的保护方式。
不同点:
- 互斥量只能由同一个线程加锁和解锁,二值信号量可以在不同的线程加锁和解锁。
- 互斥量有优先级,在高任务优先级等待低优先级任务的资源时,会将低优先级的任务进行
什么是优先级反转
优先级反转:共享资源被低优先级的任务持有,高优先级任务等待解锁。这时中等优先级任务一直运行,这导致高优先级任务在等待低优先级任务,而低优先级任务无法执行。
这种高优先级等待中优先级的情况,叫做优先级反转。
优先级继承:为了解决优先级反转而提出优化机制,让低优先级任务临时继承高优先级任务的优先级。在低优先级释放互斥锁之后,还要恢复原来的优先级。
互斥量和二值信号量
在上面提到,信号量和互斥量都可以实现资源的互斥访问,在优先级反转问题中,二者有重大区别。
互斥信号量是具有优先级继承的特点,而信号量没有该特点。使用互斥量可以处理优先级反转,而信号量不能。
一个栗子
部门举办活动,你选择一个会议室活动场地(会议室不能同时被使用,资源被锁定)。布置到一半经理过来说你之前的项目有问题,快过来修改一下(任务被抢占)。
过了一会老板说要用这个会议室,可是现在会议室被你放着各种东西,现在用不了(高优先级等待资源)。
所以老板只能等你用完会议室才能用(异常情况)。
这种高优先级任务等待低优先级的任务,叫做优先级反转。实际上不应该发生这种情况,也不会让这种情况发生。
正常情况是:在老板发现这个会议室被占用,而必须要使用它的时候,会让你停下经理安排的任务,然后赶快把它收拾好(低优先级任务先于中优先级任务执行,优先级继承),然后你收拾完后再去做经理安排的任务。
回到二值信号量和互斥量,在上面的例子中,互斥量已经标记好这个资源是你在访问,所以老板可以找到你,然后把你的优先级提升,去释放资源。
而信号量可以由多个线程持有和释放,所以不知道是谁持有该资源(找不到你在吗),所以老板只能干等你把其他事情做完,释放资源后才能继续使用资源。
https://zhuanlan.zhihu.com/p/90990453
https://blog.csdn.net/huangweiqing80/article/details/83038154
https://blog.csdn.net/cherisegege/article/details/80938475
https://blog.csdn.net/qq_14820081/article/details/89131589
https://blog.csdn.net/qq_34793133/article/details/80087727