一个信号量要么允许访问资源,要么不允许访问资源。二者只能选其一。而具体是哪一种,则要看设置。
详情可参考《 信号量:二进位信号量和计数信号量 》这篇文章。
互斥锁其实是一个对象。Mutex的全称是Mutual Exclusion Object,也就是互斥锁是一个互斥对象。它是一种特殊的二进位信号量(binary semaphore),用来控制访问共享区域资源。它包括一个优先级继承机制,以避免扩展的优先级反转问题。它允许当前优先级较高的任务在阻塞状态下维持的时间尽可能的少。然而,优先级继承并不能完全避免优先级反转,而只会最小化其影响。
对于单个缓冲区(single buffer),我们可以将4kb缓冲区分成四个1kb缓冲区。信号量可以与这四个缓冲区相关联。这允许用户和生产者同时处理不同的缓冲区。
互斥锁用于提供互斥,它使得拥有钥匙(key or mutex)的生产者才能访问资源。只要生产者占用了缓冲区(buffer),用户必须等待,反之亦然。在互斥锁的机制中,整块缓冲区始终只能提供给一个线程访问。
下面列举信号量的优点:
下面列举互斥锁的优点:
下面列举信号量的缺点:
下面列举互斥锁的缺点:
以下两种类型:二值信号量:最简单的信号量形式,信号量的值只能取0或1,类似于互斥锁。
注:二值信号量能够实现互斥锁的功能,但两者的关注内容不同。信号量强调共享资源,只要共享资源可用,其他进程同样可以修改信号量的值;互斥锁更强调进程,占用资源的进程使用完资源后,必须由进
mutex的设计目的是"持有后快速释放",也就是说如果一个竞争者在获取失败后,会spin几个循环后再尝试,如果仍然失败,则进入睡眠,这相当于semaphore获取失败后直接睡眠,多了一个spin过程,所以如果每个mutex在持有后又很快释放,那么就不存在CPU的唤醒过程。这显然比semaphore快很多。具体参考https://github.com/torvalds/linux/blob/master/kernel/locking/mutex.c欢迎分享,转载请注明来源:夏雨云
评论列表(0条)