互斥量 vs 信号量2025年4月23日 | 阅读 6 分钟 根据操作系统术语,互斥锁和信号量是提供同步服务的内核资源,也称为同步原语。进程同步在保持共享数据的一致性方面起着重要作用。软件和硬件解决方案都存在用于处理临界区问题。但硬件解决方案对于临界区问题来说相当难以实现。互斥锁和信号量都提供同步服务,但它们并不相同。 什么是互斥锁?互斥锁是一个互斥对象,用于同步对资源的访问。它在程序开始时以唯一名称创建。互斥锁锁定机制确保只有一个线程可以获取互斥锁并进入临界区。该线程仅在退出临界区时释放互斥锁。 ![]() 它是一种特殊的二元信号量,用于控制对共享资源的访问。它包含优先级继承机制,以避免扩展的优先级反转问题。它允许当前高优先级任务被阻塞的时间尽可能短。然而,优先级继承并不能纠正优先级反转,而只能最小化其影响。 示例 这可以通过以下示例说明, 互斥锁的使用互斥锁提供互斥,生产者或消费者都可以拥有密钥(互斥锁)并继续进行工作。只要生产者填满缓冲区,用户就需要等待,反之亦然。在互斥锁模式下,任何时候只有一个线程可以处理整个缓冲区。 当程序启动时,它请求系统为给定资源创建一个互斥锁对象。系统使用唯一名称或 ID 创建互斥锁对象。每当程序线程想要使用该资源时,它就会锁定互斥锁对象,利用该资源,并在使用后,释放互斥锁对象上的锁。然后,下一个进程才允许获取互斥锁对象上的锁。 与此同时,当一个进程获取了互斥锁对象上的锁时,没有其他线程或进程可以访问该资源。如果互斥锁对象已被锁定,则希望获取互斥锁对象上锁的进程必须等待,并被系统排队,直到互斥锁对象被解锁。 互斥锁的优点互斥锁的一些优点如下:
互斥锁的缺点互斥锁也有一些缺点,例如:
什么是信号量?信号量只是一个在线程之间共享的非负变量。信号量是一种信号机制,另一个线程可以向正在等待信号量的线程发出信号。 ![]() 信号量使用两个原子操作: 1. Wait (等待):如果其参数 S 为正,则 Wait 操作会减少 S 的值。如果 S 为负或零,则不执行任何操作。 2. Signal (信号,用于进程同步):Signal 操作会增加其参数 S 的值。 信号量根据其设置方式,允许或拒绝对资源的访问。 信号量的使用在单个缓冲区的情况下,我们可以将 4 KB 的缓冲区分成四个 1 KB 的缓冲区。信号量可以与这些缓冲区关联,允许用户和生产者同时处理不同的缓冲区。 信号量类型信号量由操作系统区分成两类:计数信号量和二元信号量。 1. 计数信号量:信号量 S 的值初始化为系统中资源的数量。每当进程想要访问资源时,它就会在信号量上执行wait()操作,并将信号量值减一。当它释放资源时,它会执行信号量上的signal()操作,并将信号量值加一。 当信号量计数变为 0 时,表示进程占用了所有资源。当信号量计数为 0 时,进程需要使用资源。它执行wait()操作并被阻塞,直到信号量值大于 0。 ![]() 2. 二元信号量:信号量的值在0和1之间。它类似于互斥锁,但互斥锁是锁定机制,而信号量是信号机制。在二元信号量中,如果进程想要访问资源,它就在信号量上执行wait()操作,并将信号量的值从 1 减为 0。当它释放资源时,它执行signal()操作,并将值增至 1。假设信号量的值为 0,并且进程想要访问资源。在这种情况下,它执行wait()操作并自我阻塞,直到当前使用资源的进程释放资源。 ![]() 信号量的优点信号量的一些优点如下:
信号量的缺点信号量也存在一些缺点,例如:
互斥锁与信号量的区别信号量和互斥锁之间的基本区别在于,信号量是信号机制,即进程执行 wait() 和 signal() 操作来指示它们是正在获取还是释放资源。相比之下,互斥锁是锁定机制,如果进程想要获取资源,它必须获取互斥锁对象上的锁。以下是信号量和互斥锁之间的一些更多区别: ![]()
|
我们请求您订阅我们的新闻通讯以获取最新更新。