public void philosopher(int i)i parbegin(philosopher(0), wait(fork) wait(fork (i+1)%5); eato: 程的同步与通信 philosopher(4)); signal(fork [(i+1)%5D; signal(fork) 解决死锁的方法: 3.4 管程机制 至多允许四个哲学家同时进餐 仅当哲学家的左右两支叉子均可用时 管程的引入 进餐。(用AND信号量机制解决哲 学家进餐问题。) 管程的基本概念 奇数号哲学家先拿左边的叉子,偶数 >管程的定义 哲学家先拿右边的叉子。 条件变量 >利用管程解决生产者—消费者 问题 >利用管程解决哲学家进餐问题 final static int LEFT=(i-1)mod N; final static int RIGHT=(i+1)mod N; aa final static int THINKING=0 final static int EATING=210 操 作 系 统 | 进 程 的 同 步 与 通 信 55 CUIT 徐虹 public void philosopher (int i) { while (true) { think(); wait (fork[i]); wait (fork [(i+1) % 5]); eat(); signal(fork [(i+1) % 5]); signal(fork[i]); } } 操 作 系 统 | 进 程 的 同 步 与 通 信 56 CUIT 徐虹 public static void main() { parbegin (philosopher (0), philosopher (1), philosopher (2), philosopher (3), philosopher (4)); } } 操 作 系 统 | 进 程 的 同 步 与 通 信 57 CUIT 徐虹 ¾解决死锁的方法: ¾至多允许四个哲学家同时进餐。 ¾仅当哲学家的左右两支叉子均可用时, 才进餐。(用AND信号量机制解决哲 学家进餐问题。) ¾奇数号哲学家先拿左边的叉子,偶数 号哲学家先拿右边的叉子。 操 作 系 统 | 进 程 的 同 步 与 通 信 58 CUIT 徐虹 3 . 4 管程机制 ¾管程的引入 ¾管程的基本概念 ¾管程的定义 ¾条件变量 ¾利用管程解决生产者——消费者 问题 操 作 系 统 | 进 程 的 同 步 与 通 信 59 CUIT 徐虹 操 作 系 统 | 进 程 的 同 步 与 通 信 60 CUIT 徐虹 ¾利用管程解决哲学家进餐问题 Monitor forks; final static int N = 5; final static int LEFT = (i-1) mod N; final static int RIGHT = (i+1) mod N; final static int THINKING = 0; final static int HUNGRY = 1; final static int EATING = 2;