首页 > 其他分享 >信号量与互斥量的区别

信号量与互斥量的区别

时间:2022-12-08 22:00:40浏览次数:32  
标签:优先级 区别 信号量 互斥 线程 semaphore mutex


多任务间同步的方式包括关中断,调度器上锁, 互斥量(mutex),信号量,消息队列几种, 其中互斥量和信号量使用使用方式相近,连概念和实现都有些近似, 所以没有扎实操作系统背景知识的同学常常分不清出他们的区别,容易混淆, 下面简单分析以下.

1.互斥量

    互相斥量是管理临界资源的一种有效手段, 因为互斥量是独占的, 所以在一个时刻只允许一个线程占有互斥量,利用这个性质来实现共享资源的互斥量保护,任何时刻只允许一个线程获得互斥量对象,未能够获得互斥量对象的线程被挂起在该互斥量的等待线程队列上,这一点和1资源信号量是相同的, 但互斥量有所有者的概念,高优先级的任务可以在获取互斥量时通过对比所有者的优先级是否高于自己来决定是否提升所有者的优先级。  所以互斥量可以有效对付优先级反转的问题。

2.信号量

 信号量是用来解决线程同步和互斥的通用工具, 和互斥量类似, 信号量也可以用作自于资源互斥访问, 但信号量没有所有者的概念,在应用上比互斥量更广泛,信号量比较简单, 不能解决优先级反转问题,但信号量是一种轻量级的对象,比互斥量小巧,灵活,因此在很多对互斥要求不严格的的系统中,经常使用信号量来管理互斥资源。如果定义的信号量表示一种资源,则它是用来同步的,如果信号量定义成一把锁,则它是用来保护的。

小结:

  关于所有者的概念,最开始我也不是很清楚它的内涵,最近看了一下FreeRTOS 信号量头文件的一些注释,有些感悟和收获,注释原文在 freertoscode/source/include/semphr.h中。 

 * This type of semaphore can be used for pure synchronisation between tasks or
 * between an interrupt and a task.  The semaphore need not be given back once
 * obtained, so one task/interrupt can continuously 'give' the semaphore while
 * another continuously 'takes' the semaphore.  For this reason this type of
 * semaphore does not use a priority inheritance mechanism.
 For an alternative
 * that does use priority inheritance see xSemaphoreCreateMutex().
 *

大概意思是说, sem和mutex的使用方式不同, 对于同一个上下文内来说,mutex的获取和释放必须成对调用, 获取次数和释放次数必须一样,强调所有权的概念。

sem则没有这些限制,可以一个上下文执行释放,另一个上下文执行获取, 强调的是资源数的概念,至于资源是谁发出的,没有限制,同等对待,获取了不去释放,也无关紧要,反正不获取也能发出,资源可以无中生有.

总结成一句话就是:sem可以“无中生有",但是mutex不可以,创建时候多少个,就固定为多少个。

补充说明:

很多时候,其实信号量和互斥量是可以互换使用的,证据就是,在Linux早期,就经历过sem到mutex切换的过程,证据就是下面这段文字:

信号量与互斥量的区别_java

互斥锁最早是在2.6.16内核中由Red Hat Enterprise Linux的资深内核专家Ingo Molnar设计和实现的,信号量的count成员可以初始化为1,并且down和up也可以实现互斥锁的功能,那为什么要单独实现互斥锁呢?Ingo Molnar认为,在设计之初,信号量在Linux内核中的实现没有任何问题,但是互斥锁相对于信号量要简单轻便,在锁争用激烈的情况下,互斥锁比信号量执行速度更快,可扩展性更好,另外,mutex数据结构的定义比信号量要小,这些都是互斥锁设计之初Ingo Molnar提到的优点,互斥锁上的一些优化方案,已经移植到了读写信号量中。

结束!


标签:优先级,区别,信号量,互斥,线程,semaphore,mutex
From: https://blog.51cto.com/u_15899439/5923534

相关文章

  • 一文搞懂各种锁-互斥锁-自旋锁-可重入锁-读写锁-悲观锁-乐观锁-分布式锁
    原文网址:https://zhuanlan.zhihu.com/p/489305763一为什么会有锁机制1在多线程情况下共享操作同一个变量时,会导致数据不一致,出现并发安全问题,所以通过锁机制来保证数......
  • day46 6-14 mybatis#{}与$的区别、一二级缓存 & 6-15 事务管理 & SSM三大框架简单回顾
    mybatis——OGNL表达式(mapperxml文件内if标签内)OGNL全称Object-GraphNavigationLanguage,是Java中的一个开源的表达式语言,用于访问对象数据。也是mybatis实现动态......
  • DBJ,DB,CJJ,CECS 标准区别及全套下载教程
    DBJDBJ开头的标准是地方建筑标准:D——地方、B——标准、J——建筑。《中华人民共和国标准化法》将中国标准分为国家标准、行业标准、地方标准(DB)、企业标准(Q/)四......
  • 什么是SHA系列算法,SHA-1和MD5算法有什么区别
    有些朋友在研究微信支付接口的时候,发现它们不仅支持MD5摘要的验签,还支持SHA-256摘要。那么这个SHA是什么呢?别着急,本文将和大家说一说什么是SHA系列算法,SHA这么多版本之间有......
  • 什么是SHA系列算法,SHA-1和MD5算法有什么区别
    有些朋友在研究微信支付接口的时候,发现它们不仅支持MD5摘要的验签,还支持SHA-256摘要。那么这个SHA是什么呢?别着急,本文将和大家说一说什么是SHA系列算法,SHA这么多版本之间有......
  • 什么是SHA系列算法,SHA-1和MD5算法有什么区别
    有些朋友在研究微信支付接口的时候,发现它们不仅支持MD5摘要的验签,还支持SHA-256摘要。那么这个SHA是什么呢?别着急,本文将和大家说一说什么是SHA系列算法,SHA这么多版本之间有......
  • json.load 和json.dump的转换区别
     示例如下:importjson"""当进行预期和时间结果比对是,有些参数结果为null,但是python语言是不认识null的,只认识None,所以,要进行转换;"""ss='{"user":"python","passwd":"1......
  • $router 和 $route 的区别
    1.this.$router:表示全局路由对象,项目中通过router路由参数注入路由之后,在任何一个页面都可以通过此方法获取到路由器对象,并调用其push(),go()等方法;这个router......
  • JDK、JRE、JVM三者间的联系与区别
    1.JDK(JavaDevelopmentKit)是整个JAVA的核心,包括了Java运行环境(JavaRuntimeEnvirnment),一堆Java工具(javac/java/jdb等)和Java基础的类库(即JavaAPI包括rt.jar)2.Java运......
  • Dockerfile中CMD和ENTRYPOINT的区别
    CMD和ENTRYPOINT同样作为容器启动时执行的命令,区别有以下几点:CMD的命令会被dockerrun的命令覆盖而ENTRYPOINT不会如使用CMD["/bin/bash"]或ENTRYPOINT["/bin/bash"]后,......