并发编程专题-基础-4、信号量与管程
信号量 vs 管程
并发编程这个技术领域已经发展了半个世纪了,相关的理论和技术纷繁复杂。那有没有一种核心技术可以很方便地解决我们的并发问题呢?事实上,锁机制的实现方案有两种:
- **信号量(Semaphere)**:操作系统提供的一种协调共享资源访问的方法。和用软件实现的同步比较,软件同步是平等线程间的的一种同步协商机制,不能保证原子性。而信号量则由操作系统进行管理,地位高于进程,操作系统保证信号量的原子性。
- **管程(Monitor)**:解决信号量在临界区的 PV 操作上的配对的麻烦,把配对的 PV 操作集中在一起,生成的一种并发编程方法。其中使用了条件变量这种同步机制。
说明: 信号量将共享变量 S 封装起来,对共享变量 S 的所有操作都只能通过 PV 进行,这是不是和面向对象的思想是不是很像呢?事实上,封装共享变量是并发编程的常用手段。
在信号量中,当 P 操作无法获取到锁时,将当前线程添加到**同步队列(syncQueue)中。当其余线程 V 释放锁时,从同步队列中唤醒等待线程。但当有多个线程通过信号量 PV 配对时会异常复杂,所以管程中引入了等待队列(waitQueue)**的概念,进一步封装这些复杂的操作。
Mutex
[[../../../../../../cubox/006-ChromeCapture/20221111-Linux并发与同步专题 (4) Mutex互斥量 - ArnoldLu - 博客园]]
管程与mutex
互斥量 mutex 互斥量是信号量的一种特例,它的值只有0和1,当我们不需要用到信号量的计数能力时候,我们可以使用互斥量,实际上就是同一时间只允许一个进程进入临界区,而信号量是允许多个进程同时进入。
参考与感谢
[[../../../../cubox/006-ChromeCapture/20221110-锁原理 - 信号量 vs 管程:JDK 为什么选择管程 - binarylei - 博客园]]
[[../../../../cubox/006-ChromeCapture/20221110-OS:6-管程与信号量PV操作 - cpaulyz - 博客园]]
[[../../../../cubox/006-ChromeCapture/20221110-信号量与 PV 操作的 Java 讲解 - 掘金]]
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Taylor!
评论