进程问通过通信的合作 P1 P2 死锁 P2 饥饿 P1 P3
进程间通过通信的合作 P1 P2 P1 P2 P3 死锁 饥饿
互斥的要求 每次只有一个进程进入临界区 °没有进程在临界区内时其他进程可以进入 °需要进入临界区的进程不会被无限延迟 °进程在临界区停留时间有限 在非临界区停止的进程不影响其他进程 °对相关进程的速度和处理器数量没有限制
互斥的要求 • 每次只有一个进程进入临界区 • 没有进程在临界区内时其他进程可以进入 • 需要进入临界区的进程不会被无限延迟 • 进程在临界区停留时间有限 • 在非临界区停止的进程不影响其他进程 • 对相关进程的速度和处理器数量没有限制
互斥的实现 dekker算法 软件方法 peterson算法 中断禁用 机器指令 专门的机器指令 由OS或程序语言信号量 提供支持 管程 消息
互斥的实现 软件方法 dekker算法 peterson算法 机器指令 中断禁用 专门的机器指令 由OS或程序语言 提供支持 信号量 管程 消息
Dekker算法1-用tun表示进入次序 PO While turns>0; While tur+忙等待 临界区 临界区; busy waiting Turn=1 Turn=0 必须轮流使用临界区 如果P0失败,P1会永久阻塞
Dekker算法1-用turn表示进入次序 P0 … While turn<>0; 临界区; Turn=1; … P1 … While turn<>1; 临界区; Turn=0; … • 必须轮流使用临界区 • 如果P0失败,P1会永久阻塞 忙等待 busy waiting
Dekker算法2-用fag表示各自状态 PO P1 While flag[1]; 1 a While flag[01: Flag[true 2 b Flag [1=true; 临界区;3c临界区; a2b3c Flag[0]=false; 4 d Flag[1]=false 如果P0在临界区内失败,P1会永久阻塞 不能保证互斥
Dekker算法2-用flag表示各自状态 P0 … While flag[1]; Flag[0]=true; 临界区; Flag[0]=false; … P1 … While flag[0]; Flag[1]=true; 临界区; Flag[1]=false; … • 如果P0在临界区内失败,P1会永久阻塞 • 不能保证互斥 1 2 3 4 a b c d 1 a 2 b 3 c