版权声明:版权声明:本文为博主原创文章,转载请注明出处。 https://blog.csdn.net/lililuni/article/details/83782688
1. 信号量
在上节中,提到了并发和同步,其中,多线程并发会导致资源竞争,相应的解决办法就是同步,同步主要就是协调多线程对共享资源的访问,使得任何时刻只有一个线程执行临界区代码。
确保同步正确的方法主要有基于底层的硬件实现和高层次的编程抽象。而信号量和管程就属于高层次的抽象方法。其中,信号量是和锁处于同一层次的方法。
1. 信号量相关概念
-
信号量引入
下图中的软件同步指的是上节中的基于软件的同步办法
-
信号量组成
信号量是一种抽象数据模型,由一个整型(sem)变量(表示系统资源的数量)和两个原子操作组成。
P和V执行的原子性是由操作系统保护的,执行不会被打断,不同于基于软件的方法(它在操作过程中可能发生中断,导致变量的改变)。 -
信号量的特性
-
信号量的实现
2. 信号量的使用
- 信号量分类
- 用信号量实现临界区的互斥访问
- 用信号量实现条件同步
- 生产者消费者问题
1号箭头表示当缓存区满时,生产者必须等待消费者。因为没有空缓存区时,eB=n,生产者的p()的条件不满足,进入等待,等到生产者v()执行了就可以了。注意,此时p(),v()和第一节中的p()和v()不同
2号箭头表示当缓存区为空时,消费者必须等待生产者
- 使用信号量的困难
2. 管程
管程是为改进信号量在处理临界区的一些麻烦,管程试图把pv操作集中在一起,它也是一种并发程序的编程方法。它是与临界区处于同一层次,同时,在抽象层加入条件变量。
- 管程概念(程序结构)
- 管程组成
- 条件变量
条件变量是管程内部的等待机制,进入管程的线程因为资源被占用而进入等待状态,每个条件变量表示一种等待原因,对应着一个等待队列。然后在条件变量上再添加两个操作。
- 利用管程解决生产者消费者问题
- 管程条件变量的释放处理方式
在Hansen管程中(当前在管程中执行的线程优先级高),T1进入等待后,放弃管程,T2进入管程,然后T2唤醒了T1,但此时T2并不放弃管程,直到执行完才退出管程。然后T1再开始执行,Hore则相反。
Hansen的while表示:当条件变量释放之后,也仅是一个提示,仍得重新检查条件。再次检查就说明要再次重新排队,因为另外一个进程在释放条件变量之后,仍会继续运行,这个过程可能导致条件变量发生变化。
Hoare的if表示:当另外一个释放条件变量后,也就放弃了管程访问,立即转到当前进程了。也就是说等待条件变量的进程优先级中更高