原文地址
什么是信号量?
信号量是一个非负变量, 并且在线程之间共享。信号量是一种信号机制,一个线程正在期待信号量能够由另一个线程收回。它应用两个原子操作,1)wait
和 2)signal
实现线程同步。
信号量实现容许或不容许拜访资源,这取决于它的设置形式。
什么是互斥锁?
互斥的残缺模式是互斥对象。它是一种非凡类型的二进制信号,用于管制对共享资源的拜访。它蕴含了一个优先级继承机制来防止扩大优先级反转问题。它容许以后优先级较高的工作在尽可能短的工夫内放弃在阻塞状态。然而,优先级继承并不能解决优先级反转问题,只能最小化其影响。
次要区别:
互斥锁是一种锁机制,信号量是一种信号机制
互斥锁是一个对象,信号量是一个整数
互斥锁没有子类型,信号量有两种子类型,计数信号量和二进制信号量
信号量反对 wait 和 signal 操作批改,而互斥锁仅能由可能申请或开释资源的过程批改
信号量的值应用wait()
和signal()
这两个办法批改,而互斥锁应用 lock 和 unlock 来操作。
应用信号量
在单个缓冲区的状况下,咱们能够将 4KB 的缓冲区分成四个 1KB 的缓冲区。信号量能够与这四个缓冲区相关联。这容许用户和生产者同时在不同的缓冲区上工作。
应用互斥锁
互斥锁提供了互斥的性能,不论是生产者还是消费者,都能够持有锁,持有锁的一方能够持续工作,另一方就要期待,在同一时间,只有一个线程能够解决整个缓冲区。
对于互斥和信号量的常见事实
- 只有一个工作能够获取到互斥锁,互斥锁有所有权,只有持有锁的工作能力开释互斥锁。
- 应用互斥锁和信号量的场景是不同的,然而因为实现形式有相似之处,互斥锁也被称为二进制信号量
- 一个家喻户晓的谬误:互斥量和信号量简直雷同,惟一的区别是互斥量可能计数到 1,而信号量可能从 0 计数到 N
- 二进制信号量和互斥量之间总是存在不确定性。你可能据说互斥锁是一个二进制信号量,这是不正确的
信号量的长处
- 容许多个线程拜访临界区
- 信号量是独立于机器的(因为它们是在内核服务中实现的)
- 不容许多个过程进入临界区。
- 信号量有忙等状态,因为不会浪费时间和资源
互斥锁的长处
- 互斥锁只是简略的锁,在进入临界区是持有它,来到时开释
- 因为在任何给定工夫只有一个线程处于临界区内,因而不存在数据竞争,能够始终保持数据一致性
信号量的毛病
- 信号量的最大限度之一是优先级反转问题
- 操作系统必须跟踪所有信号量的调用
- 为了防止信号量中的死锁,
wait
和signal
操作须要以正确的程序执行 - 信号量编程是一种简单的办法,因而有可能无奈实现互斥的成果
- 它也不是能够大规模应用的实用办法,因为它们的应用会毁坏模块化
- 程序员应用信号量更容易出错,容易呈现死锁
互斥锁的毛病
- 如果一个持有锁的线程休眠或者被强占了 CPU,其余线程就没方法继续执行了
- 一次只能容许一个线程拜访临界区
- 失常实现可能会导致忙期待状态,节约 CPU 工夫