一、前言
最近看了MySQL和PostgreSQL源码对于mutex处理,Semaphore和mutex的关系,有些地方模糊了。想想也是,从大学那会儿学linux内核后,后面很少看那块了,更多的是研究数据库的一些东西。因此,刚好可以补习下,找回记忆。
二、概况
其实从本质上来讲,两都并没有太大区别,从linux源码实现来讲,至少两者都是结构体。但是所不同的是,mutex多了owner指针,就因为这个owner指针,导致了mutex和semaphore在功用上的不同。其中以下红色圈出部分,就是"owner"指针。
semaphore在linux中的源码定义:
mutex在linux中的源码定义:
三、Semaphore
semaphore实际上有好几种类型,最常见的为:counting semaphore和binary semaphore。
Binary semaphore其实已经和mutex非常接近了。Binary semaphore与Counting semaphore的区别就在于Semaphore结构体成员"count"的取值范围。
Binary semaphore只有"1"和"0"两种。即"unlocked"和"locked"。
Binary semaphore的初始化:
Counting semaphore其count值可以是任意的。对于semaphore的操作,也就是通常所说的PV操作。P(s),减少此值,V(s),增加此值。而且每次都只增加“1”或者减少“1”。
四、Mutex
Mutex的count有三种可能值。“1”代表unlocked,"0"代表lokced,负值代表可能的等待者。
Mutex有如下约定:
有且只有一个进程来持有。
有且只有owner本身可以unlock mutex(owner指针的作用)。
不允许递归锁。但是semaphore是允许的,MySQL在这块上,之前还有一个BUG:Bug #24745 InnoDB semaphore wait timeout/crash – deadlock waiting for itself
只能能过API来初始化,不允许通过memset和copying来初始化。
当持有mutex时,进程一般不退出;存放mutex的内存不能被释放。
通常不用于软硬件的中断。
五、总结
从上面的定义,可以看出,semaphore一般只是表示资源有多少,信息量有多少,用来类似于解决producer-consumer的问题和同步信号发送等。不能解决串行化问题。
而Mutex则是来解决互斥问题,保证某个资源或者代码片段的串行访问;因为只有owner才能释放锁。另外,有同学可能会问,Binary semaphore也只有两种可能值,也可以实现互斥访问。但是要知道,Binary semaphore还是没有owner指针。但有一点相似处,就是在ISR(Interrupt Service Routine)系统中,semaphore或者mutex会被中断程序中断。
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30088583/viewspace-1429893/ ,如需转载,请注明出处,否则将追究法律责任。