auto commit

This commit is contained in:
CyC2018 2018-02-27 13:24:26 +08:00
parent e849e80495
commit 5697ac7798

View File

@ -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., & OHallaron, D. R. (2004). 深入理解计算机系统.
- [小土刀的面试刷题笔记](http://wdxtub.com/interview/index.html)
- [进程间的几种通信方式](http://blog.csdn.net/yufaw/article/details/7409596)