补充1-PV操作、管程、生产者消费者
1. PV操作
P操作
void wait(S) {
S.value--;
if (S.value < 0) {
进入资源S的等待队列 S.L;
自我阻塞 block(S.L);
}
}
V操作
void signal(S) {
S.value++;
if (s.value <= 0) {
从S.L中取出一个进程P;
唤醒进程P wakeup(P);
}
}
2. 生产者消费者
- 对缓冲区的访问 - 互斥
- 生产者/消费者关系 - 同步
S.mutex = 1; // 互斥信号量
S.empty = n; // 同步信号量
S.full = 0;
Producer {
while(1) {
生产数据;
P(empty);
P(mutex);
放数据;
V(mutex);
V(full);
}
}
Customer {
while (1) {
P(full);
P(mutex);
取数据;
V(mutex);
V(empty);
}
}
3. 管程
- 把对共享资源的操作进行封装
- 每次只允许一个进程进入管程,进而实现互斥
- PV操作分解为
- 数据结构:用于标识资源数目
- 条件变量:用于唤醒/阻塞进程
monitor_demo {
共享数据结构 S;
条件变量 condition x;
void init_code () {
初始化资源数目;
}
void take_away() {
if (S <= 0) {
x.wait();
}
S--;
}
void give_back() {
S++;
if (有进程等待) {
s.notify();
}
}
}