Pipe-Coordination
Pipe 是检验 Sleep/Wakeup 机制的最佳案例。
数据结构
Pipe 有一把锁 pi->lock,保护 nread (读指针) 和 nwrite (写指针)。
Reader (PipeRead)
acquire(&pi->lock)。while(pi->nread == pi->nwrite)(缓冲区空):- 如果是空的,调用
sleep(&pi->nread, &pi->lock)。 - 注意:
sleep会释放pi->lock,允许 Writer 进来写数据。 - 醒来后,
sleep会重新拿到pi->lock,再次检查while条件。
- 如果是空的,调用
- 读取数据。
wakeup(&pi->nwrite)(通知 Writer:我有空位了)。release(&pi->lock)。
Writer (PipeWrite)
acquire(&pi->lock)。while(full):sleep(&pi->nwrite, &pi->lock)。- 写入数据。
wakeup(&pi->nread)(通知 Reader:我有数据了)。release(&pi->lock)。