- 分析并发进程的关键活动,划定临界区;
- 设置互斥信号量 mutex ,初值为 1 ;
- 在临界区之前执行 P( mutex );
- 在临界区之后执行 V( mutex );
semaphore mutex = 1; P1(){ …… …… P(mutex); 临界区代码…… V(mutex); …… …… } P2(){ …… …… P(mutex); 临界区代码…… V(mutex); …… …… }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
注意:
- 对不同的临界资源需要设置不同的互斥信号量;
- P、V操作必须成对出现,缺少 P 操作就不能保证临界资源的互斥,缺少 V 操作会导致资源永不被释放,等待进程永不被唤醒;
- 分析什么地方需要实现同步关系,必须保证 " 一前一后 " 的两个操作;
- 设置同步信号量 S,初始为 0 ;
- 在 " 前操作 " 之后执行 V(S) ;
- 在 " 后操作 " 之前执行 P(S) ;
semaphore S = 0; P1(){ 代码1; 代码2; V(S); 代码3; } P2(){ P(S); 代码4; 代码5; 代码6; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
每一对前驱关系都是一个进程同步的问题;
- 要为每一对前驱关系各设置一个同步变量,设初值为 0 ;
- 在 " 前操作 " 之后对相应的同步变量执行 V 操作;
- 在 " 后操作 " 之前对相应的同步变量执行 P 操作 ;
semaphore S1 = 0,S2 = 0; P1(){ 代码1; V(S1); 代码2; V(S2); } P2(){ P(S1); 代码1.3; 代码1.4; } P3(){ P(S2); 代码2.3; 代码2.4; }
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20