关于互斥信号量和二值信号量的区别

二值信号量:

            用于任务同步和中断同步,也可以实现互斥访问,但不具有优先级继承

           通过二值信号量实现互斥访问:

1.创建3个任务task1,task2,task3,优先级分别是3,2,1.

2.  开始task3首先获得二值信号量资源,但task1优先级比task3高抢占了task3的cpu使用权

3.  task1也需要获取二值信号量,所以task1就会挂起,等待task3释放二值信号量。

4. 由于 task2已经处于就绪态,并且优先级比task3高,task2抢占了task3的cpu使用权,此时优先级翻转就发生了,task1(高优先任务)需要等待task2(低优先任务)运行完后才能运行,task3任务继续执行并释二值信号量资源,task1才能获取到二值信号量,从而可以继续执行


互斥信号量:

            互斥信号量简单说是具有优先级继承的二值信号量,用于进程中的互斥,不可用于中断中(1:具有优先级继承机制,2:中断服务函数不能因为等待互斥信号量而阻塞)

            互斥信号量优先级继承机制:当一个低优先级的任务正在使用这个互斥信号量时,高优先的任务在等待这个互斥信号量的时候,高优先级的任务会将低优先级的任务的优先级提到和自己同一个水平,从而来避免位于低优先和高优先的任务抢占cpu时间运行,而导致次优先级任务先于高优先级的任务运行,引起优先级翻转。

        优先级继承也只是尽可能的降低优先级翻转的发生,软件设计的时候需避免优先级翻转的问题发生

        通过互斥信号量实现互斥访问:

1.一开始task3开始运行,先获取到互斥锁

2. task1开始运行尝试去获取互斥锁失败被阻塞等待task3执行完,但是此时提升task3的优先级,让其优先级跟自己一样

3.task3运行过程中,task2被触发,由于其优先级低于task3(第2步被提升过),task2等待运行

4.继续运行task3,运行完后释放互斥锁5.task1继续运行6.task1执行完,执行task2所以过程跟前面的虽然一样,但是互斥锁多做了一个步骤就是将task3的优先级提升到task1的级别,防止task2中途出来搅局浪费大量时间

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 一、前言 上一篇文章iOS多线程浅汇-原理篇中整理了一些有关多线程的基本概念。本篇博文介绍的是iOS中常用的几个多...
    nuclear阅读 2,073评论 6 18
  • 我用转盘试了一次四柱人偶排列 辰巳空,所以巳火没有上来 确实也差不多集中在某个地方当大运流年还没上来之前 看癸水觉...
    PhoenixScorpio阅读 559评论 0 2
  • 我读完《如何学习》这本书,我的感想汇总如下: 1、看一篇文章,了解文章的主要内容,提出问题并问问自己,我了解什么?...
    sandy_a357阅读 188评论 0 0
  • 1.回顾 LED呼吸灯 线路图image.png实物图 程序图 2.我的钢琴 单词|单词|含义||--|--||B...
    孔颢博阅读 131评论 0 0
  • 名称:中国金柳工艺品有限公司 【打卡始于2018年3月19日,持续打卡于2018年5月17日】卡第 58天 【知~...
    holly8888阅读 63评论 0 0