Monitor是另一种处理临界资源的机制。
信号量的缺点:
- 共享的变量对于所有进程来说是全局的,所有没有合理的保护机制,很容易误操作
- 并发代码散乱分布在整个程序中
- 一遇到mutual exclusion就要进行编码
管道的优点:
- 固定的共享变量对进程隐藏
- 通过管道procedure来访问管道
- 一次只允许一个进程在管道内进行操作,因为自动形成了mutual exclusion
- 条件变量可以提供同步
Condition variable c: an object defined inside a monitor which has its own queue of delayed processes
wait(c): add the process to c's queue of blocked processes
signal(c): move the front process from c's queue of blocked processes to a list of ready processes
如果阻塞队列为空的话,singal操作不会产生任何影响。
- Bounded Buffer Monitor
Monitor BBuffer {
buf[1:n]
int front = 1, rear = 1, count = 0;
cond not_full;
cond not_empty;
procedure deposit(item) {
while(count == n) wait(not_full);
put item into buf;
rear = (rear+1) % n;
count++;
signal(not_empty);
}
procedure fetch() {
while(count==0) wait(not_empty);
take item out of buf;
front = (front+1) % n;
count--;
singal(not_full);
}
}
- Readers and Writers
Monitor RWController {
int nr = 0, nw = 0;
cond oktoread;
cond oktowrite;
procedure request_read(){
while(nw > 0) wait(oktoread);
nr++;
}
procedure release_read(){
nr--;
while(nr == 0 && nw == 0) signal(oktowrite);
}
procedure request_write(){
while(nr > 0 && nw > 0) wait(oktowrite);
nw++;
}
procedure release_write(){
nw--;
while(nw == 0)
signal_all(oktoread);
}
}
- The Barber Shop
Monitor BarberShop {
int chair = 0, barber = 0, open = 0;
cond bfree, chocc, doorop, cleft;
procedure get_cut(){
while(barber == 0) wait(bfree);
wake up the barber;
barber--;
sleep;
chair++;
signal(chocc);
hair cut;
while(open == 0) wait(doorop);
open--;
signal(cleft);
}
procedure get_customer(){
barber++;
signal(bfree);
while(chair == 0) wait(chocc);
chair--;
}
procedure finish_cut() {
open++;
signal(doorop);
while(open > 0) wait(cleft);
}
}
本文深入探讨了Monitor机制作为处理临界资源的一种方式,并对比了信号量的不足之处。文章详细介绍了Monitor内部条件变量的作用及其实现过程,通过三个具体案例——有界缓冲区、读者写者问题和理发店问题,展示了Monitor在解决实际并发问题中的应用。
2万+

被折叠的 条评论
为什么被折叠?



