看过Linux内核的同学都知道,Linux内核中除了有semaphore之外,还有一个mutex lock。前者我们的操作系统教科书称之为信号量,后者不知道教科书有没有具体的名称,但是在Linux内核中,它的称谓是"互斥锁"或者“互斥体”(总之,称谓不是问题)。为了提升一下本帖的理论密度,特从Wiki中摘录一段关于semaphore的描述:

“ In computer science, a semaphore is a variable or abstract data type that provides a simple but useful abstraction for controlling access by multiple processes to a common resource in a parallel programming environment.

A useful way to think of a semaphore is as a record of how many units of a particular resource are available, coupled with operations to safely (i.e., without race conditions) adjust that record as units are required or become free, and if necessary wait until a unit of the resource becomes available. Semaphores are a useful tool in the prevention of race conditions and deadlocks; however, their use is by no means a guarantee that a program is free from these problems. Semaphores which allow an arbitrary resource count are called counting semaphores, while semaphores which are restricted to the values 0 and 1 (or locked/unlocked, unavailable/available) are called binary semaphores (same functionality that mutexes have). ”。

其中关键信息主要是“a semaphore is a data type for controlling access by multiple processes to a common resource in a parallel programming environment... Semaphores which allow an arbitrary resource count are called counting semaphores, while semaphores which are restricted to the values 0 and 1 (or locked/unlocked, unavailable/available) are called binary semaphores (same functionality that mutexes have)”,也即信号量在并行处理环境下对多个processes访问某个公共资源进行保护,后面提到的binary semaphore,本质上应该就是mutex了,从same functionality that mutexes have这句话来看,mutex和binary semaphore功能应该相同。从以上的文字中显然可以看到,相对mutex而言信号量的适用范围更广(mutex只是信号量的用途之一),这个我们接下来在后续的Linux源码中也可以看到这其中某些细微之处的区分。

*注:昨天写这个帖子时手头没有操作系统方面的书籍拿来参考,今天我翻了一下《现代操作系统》(陈向群等译,机械工业出版社  1999年11月第1版), 关于这个话题,书里明确提到的只有"2.2.5 信号量",至于mutex,书中并没有作为一个独立的概念提出来,只是在讲信号量时提到了上面所说的binary semaphore,并且说“信号量mutex(应该是指binary semaphore)用于互斥...互斥是避免混乱所必需的操作...信号量的另一种用途是用于实现同步(synchronization)。信号量full和empty用来保证一定的事件顺序发生或不发生。在本例中,它们保证缓冲区满的时候生产者停止运行,或者当缓冲区空的时候消费者停止运行。这种用法与互斥是不同的” --- P30-31 *

OK,理论上的概念有了,那么就来看看实际当中Linux下的semaphone到底长的啥样。以下是semaphore在Linux源码中的定义,源码来自3.2.9:
<include/linux/semaphore.h>

  1. /* Please don't access any members of this structure directly */
  2. struct semaphore {
  3. raw_spinlock_t                lock;
  4. unsigned int                count;
  5. struct list_head        wait_list;
  6. };

复制代码

如果count=1的话,那么semaphore就可以用来进行互斥操作了,早先内核源码中曾有一个专门的宏用来定义一个count=1的信号量DECLARE_MUTEX:

  1. #define DECLARE_MUTEX(name) \
  2. struct semaphore name = __SEMAPHORE_INITIALIZER(name, 1)

复制代码

因为我们知道在Linux内核源码中还有一个DEFINE_MUTEX宏,所以Marcin Slusarz同学认为DECLARE_MUTEX宏容易让人困惑,毕竟它其实只是定义了一个count=1的信号量,因此该同学早在08年就向内核社区提交了一个PATCH,要求Rename DECLARE_MUTEX to DEFINE_SEMAPHORE( https://lkml.org/lkml/2008/10/26/74 ),这个PATCH最终被社区所接受(应该是在2.6.35和2.6.39版本之间,2.6.39已经没有了DECLARE_MUTEX,取而代之的是DEFINE_SEMAPHORE,但2.6.35还有,我当时在写《深入Linux设备驱动程序内核机制》时,最早引用的是2.6.35的版本,虽然在写作的中晚期将内核版本切换到2.6.39并在定稿阶段曾试图将之前写的文档全部修正到39版,但是DECLARE_MUTEX的残留显然是条漏网之鱼...)。因为只是rename,所以DEFINE_SEMAPHORE的定义和原来的DECLARE_MUTEX完全相同。

那么既然count=1的信号量可以用来完成mutex lock的功能,那么内核何必再多此一举弄出个mutex lock出来呢?

探讨mutex与semaphore相关推荐

  1. Mutex与Semaphore 第一部分:Semephore

    原文: https://blog.feabhas.com/2009/09/mutex-vs-semaphores-%E2%80%93-part-1-semaphores/ Mutex与Semaphor ...

  2. 多线程基础之二:mutex和semaphore使用方法

    mutex和semaphore都是内核对象,是用来实现多进程间或多线程锁机制的基础.本文将要介绍两者的使用方式. 0. 多线程锁机制涉及的Windows API 创建mutex内核对象,用来作为线程间 ...

  3. 【嵌入式操作系统】FreeRTOS信号量mutex和semaphore的区别

    今天学习信号量mutex和semaphore的区别,找到了正点原子的博客介绍,讲的挺详细的.建议大家阅读 转载自:https://blog.csdn.net/nippon1218/article/de ...

  4. java开发中的Mutex vs Semaphore

    先看一下stackoverflow上是怎么说的吧 原文地址:http://stackoverflow.com/questions/771347/what-is-mutex-and-semaphore- ...

  5. 多线程同步与并发访问共享资源工具—Lock、Monitor、Mutex、Semaphore

    "线程同步"的含义 当一个进程启动了多个线程时,如果需要控制这些线程的推进顺序(比如A线程必须等待B和C线程执行完毕之后才能继续执行),则称这些线程需要进行"线程同步(t ...

  6. Mutex与Semaphore 第二部分 互斥锁

    原文链接: https://blog.feabhas.com/2009/09/mutex-vs-semaphores-%E2%80%93-part-2-the-mutex/ In Part 1 of ...

  7. windows多线程之读写同步(线程锁Mutex + 信号量Semaphore )

    第一次使用博客,把自己学习的心得记录下来,与大家分享,有什么不足请指正,共同学习! 本文记录的是线程同步的一个经典问题,读写问题.这个场景在实际的应用中很常见,多线程中同时对文件进行读写很容易出问题, ...

  8. 用信号量解决进程的同步与互斥探讨

    <p>本篇也是一篇老文,发布于2015年5月,文章比较长,算老博客看的比较多的了,贴到这儿与大家分享,以求多多交流探讨.</p> 前言 现代操作系统采用多道程序设计机制,多个进 ...

  9. Semaphore、CountDownLatch和CyclicBarrier

    这三者都是java并发包的工具类,提供了比synchronized更加高级的各种同步结构,可以实现更加丰富的多线程操作. Semaphore 信号量,我们应该都在操作系统课程里学过,它是解决进程间通信 ...

最新文章

  1. AIX 系统迁移安装
  2. swift_026(Swift 的类型转换)
  3. sklearn之pipeline:pipeline的简介、使用技巧、案例应用之详细攻略
  4. 02 基本序列以及序列表示
  5. 使用 AppleScript 在 Chrome 中查看当前 Safari 打开的网页
  6. linux常用的文件操作命令大全,(办公)记事本_Linux常用的文件操作命令
  7. java猫和猫的名字
  8. Hadoop HA 部署
  9. 最新过浩方过VS魔兽1.24b全图工具发布
  10. pack_padded_sequence torch说明
  11. vue中对token的有效期的理解
  12. c语言判断字符是否对称,2020-07-23(C语言)数据结构-试设计算法判断该链表的全部n个字符是否中心对称。...
  13. mysql dba工具_Github推荐:MySQL DBA不可错过的五大开源管理工具!
  14. 运筹学基础(02375)-有道云笔记
  15. URL中文编码与文本中文编码的关系
  16. Matlab中的linspace()函数
  17. 安卓模拟器右边的虚拟键盘消失了,怎样调出来
  18. SpringBoot JSON 整合
  19. python 输出文件分隔符_使用Python文件读写,自定义分隔符的方法
  20. FAST 常见问题-1

热门文章

  1. python计算思维训练文件操作与异常处理_054 Python程序设计思维
  2. python3.4 pip必须升级python3.5_在ubuntu上将python3.4升级到python3.6会破坏pip
  3. fiddler如何设置过滤https_Google Analytics如何设置含有过滤器的帐户数据视图
  4. linux WiFi源码解析,Wifi移植浅析
  5. Python这些操作,逆天且实用!
  6. python中的系统模块_python中一些获取系统信息的模块
  7. 二维绕任意点旋转_二维图形复合线性变换程序设计:三角形绕任意点旋转2wfhbh...
  8. GAN生成对抗网络-SSGAN原理与基本实现-半监督学习GAN-08
  9. 怎么在服务器上注册vbs组件,Windows下查看PC服务器硬件序列号的vbs脚本
  10. linux中查看用户组标识符,Linux用户和组管理