auto commit
This commit is contained in:
parent
e849e80495
commit
5697ac7798
|
@ -258,10 +258,10 @@ shortest remaining time next
|
|||
|
||||
### 3. 信号量
|
||||
|
||||
**信号量(Samaphore)**是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。
|
||||
**信号量(Samaphore)** 是一个整型变量,可以对其执行 down 和 up 操作,也就是常见的 P 和 V 操作。
|
||||
|
||||
- **down** : 如果信号量大于 0 ,执行 - 1 操作;如果信号量等于 0,将进程睡眠,等待信号量大于 0;
|
||||
- **up**:对信号量执行 + 1 操作,并且唤醒睡眠的进程,让进程完成 down 操作。
|
||||
- **down** : 如果信号量大于 0 ,执行 -1 操作;如果信号量等于 0,将进程睡眠,等待信号量大于 0;
|
||||
- **up**:对信号量执行 +1 操作,并且唤醒睡眠的进程,让进程完成 down 操作。
|
||||
|
||||
down 和 up 操作需要被设计成原语,不可分割,通常的做法是在执行这些操作的时候屏蔽中断。
|
||||
|
||||
|
@ -287,7 +287,7 @@ void P2() {
|
|||
|
||||
使用一个互斥量 mutex 来对临界资源进行访问;empty 记录空缓冲区的数量,full 记录满缓冲区的数量。
|
||||
|
||||
注意,必须先执行 down 操作再用互斥量对临界区加锁,否则会出现死锁。如果都先对临界区加锁,然后再执行 down 操作,考虑这种情况:生产者对临界区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生成者睡眠。消费者此时不能进入临界区,因为生产者对临界区加锁了,也就无法对执行 up(empty) 操作,那么生产者和消费者就会一直等待下去。
|
||||
注意,必须先执行 down 操作再用互斥量对临界区加锁,否则会出现死锁。因为如果都先对临界区加锁,然后再执行 down 操作,那么可能会出现这种情况:生产者对临界区加锁后,执行 down(empty) 操作,发现 empty = 0,此时生成者睡眠。消费者此时不能进入临界区,因为生产者对临界区加锁了,也就无法执行 up(empty) 操作,那么生产者和消费者就会一直等待下去。
|
||||
|
||||
```c
|
||||
#define N 100
|
||||
|
@ -325,7 +325,7 @@ void consumer() {
|
|||
|
||||
c 语言不支持管程,下面的示例代码使用了类 Pascal 语言来描述管程。示例代码中的管程提供了 insert() 和 remove() 方法,客户端代码通过调用这两个方法来解决生产者-消费者问题。
|
||||
|
||||
```html
|
||||
```pascal
|
||||
monitor ProducerConsumer
|
||||
integer i;
|
||||
condition c;
|
||||
|
@ -342,13 +342,13 @@ monitor ProducerConsumer
|
|||
end monitor;
|
||||
```
|
||||
|
||||
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,必须将进程阻塞,否者其它进程永远不能使用管程。
|
||||
管程有一个重要特性:在一个时刻只能有一个进程使用管程。进程在无法继续执行的时候不能一直占用管程,否者其它进程永远不能使用管程。
|
||||
|
||||
管程引入了 **条件变量** 以及相关的操作:**wait()** 和 **signal()** 来实现同步操作。对条件变量执行 wait() 操作会导致调用进程阻塞,把管程让出来让另一个进程持有。signal() 操作用于唤醒被阻塞的进程。
|
||||
|
||||
**使用管程实现生成者-消费者问题**
|
||||
|
||||
```html
|
||||
```pascal
|
||||
monitor ProducerConsumer
|
||||
condition full, empty;
|
||||
integer count := 0;
|
||||
|
@ -729,11 +729,6 @@ CSCAN
|
|||
# 参考资料
|
||||
|
||||
- Tanenbaum A S, Bos H. Modern operating systems[M]. Prentice Hall Press, 2014.
|
||||
|
||||
- 汤子瀛, 哲凤屏, 汤小丹. 计算机操作系统[M]. 西安电子科技大学出版社, 2001.
|
||||
|
||||
- Bryant, R. E., & O’Hallaron, D. R. (2004). 深入理解计算机系统.
|
||||
|
||||
- [小土刀的面试刷题笔记](http://wdxtub.com/interview/index.html)
|
||||
|
||||
- [进程间的几种通信方式](http://blog.csdn.net/yufaw/article/details/7409596)
|
||||
|
|
Loading…
Reference in New Issue
Block a user