Semaphore vs. Mutex 简单区别

一、前言

    最近看了MySQL和PostgreSQL源码对于mutex处理,Semaphore和mutex的关系,有些地方模糊了。想想也是,从大学那会儿学linux内核后,后面很少看那块了,更多的是研究数据库的一些东西。因此,刚好可以补习下,找回记忆。

二、概况

    其实从本质上来讲,两都并没有太大区别,从linux源码实现来讲,至少两者都是结构体。但是所不同的是,mutex多了owner指针,就因为这个owner指针,导致了mutex和semaphore在功用上的不同。其中以下红色圈出部分,就是"owner"指针。

semaphore在linux中的源码定义:

image

mutex在linux中的源码定义:

image

三、Semaphore

   semaphore实际上有好几种类型,最常见的为:counting semaphore和binary semaphore。

   Binary semaphore其实已经和mutex非常接近了。Binary semaphore与Counting semaphore的区别就在于Semaphore结构体成员"count"的取值范围。

   Binary semaphore只有"1"和"0"两种。即"unlocked"和"locked"。

   Binary semaphore的初始化:

image

   Counting semaphore其count值可以是任意的。对于semaphore的操作,也就是通常所说的PV操作。P(s),减少此值,V(s),增加此值。而且每次都只增加“1”或者减少“1”。

四、Mutex

Mutex的count有三种可能值。“1”代表unlocked,"0"代表lokced,负值代表可能的等待者。

Mutex有如下约定:

  1. 有且只有一个进程来持有。

  2. 有且只有owner本身可以unlock mutex(owner指针的作用)。

  3. 不允许递归锁。但是semaphore是允许的,MySQL在这块上,之前还有一个BUG:Bug #24745 InnoDB semaphore wait timeout/crash – deadlock waiting for itself

  4. 只能能过API来初始化,不允许通过memset和copying来初始化。

  5. 当持有mutex时,进程一般不退出;存放mutex的内存不能被释放。

  6. 通常不用于软硬件的中断。

五、总结

    从上面的定义,可以看出,semaphore一般只是表示资源有多少,信息量有多少,用来类似于解决producer-consumer的问题和同步信号发送等。不能解决串行化问题。
    而Mutex则是来解决互斥问题,保证某个资源或者代码片段的串行访问;因为只有owner才能释放锁。另外,有同学可能会问,Binary semaphore也只有两种可能值,也可以实现互斥访问。但是要知道,Binary semaphore还是没有owner指针。但有一点相似处,就是在ISR(Interrupt Service Routine)系统中,semaphore或者mutex会被中断程序中断。

来自 “ ITPUB博客 ” ,链接:http://blog.itpub.net/30088583/viewspace-1429893/,如需转载,请注明出处,否则将追究法律责任。

转载于:http://blog.itpub.net/30088583/viewspace-1429893/

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值