多道程序下进程是并发执行的,因此就产生了同步的问题。
解释几个概念:
临界资源:一次只能被一个所使用的资源
临界区:访问临界资源的那部分代码
同步:直接制约关系,必须要进程A先执行才能执行B,这就叫同步。比如管道通信的读写进程
互斥:间接制约关系,当一个进程进入临界区后,另一个进程必须在外等待,这就叫互斥。比如两个进程访问打印机,如果进程A在使用打印机,那么进程B必须等待
为禁止两个进程同时进入临界区,同步机制应遵循以下准则:
- 空闲让进
- 忙则等待
- 有限等待:不能一直干等下去
- 让权等待:如果进程不能进入临界区,那么应该释放它所拥有的处理器资源,防止进程忙等
实现临界区互斥的基本方法(不具体辣,具体的请百度)
软件实现方式
- 单标志法:两个进程交替访问临界区。但是如果有一个进程不想访问了,那么另一个进程也没法访问了
- 双标志法先检查:这种容易由于进程推进顺序不当而造成两个进程同时进入临界区
- 双标志法后检查:这种可能会出现两个进程互相谦让结果谁都进不去
- Peterson’s Alogrithm:这个可以!设置
flag[i]
、flag[j]
和turn
,伪代码如下:
进程i
flag[i] = TRUE, turn = j;
while(flag[j]&&turn==j);
临界区;
flag[i] = FALSE;
。。。
进程j
flag[j] = TRUE, turn = i;
while(flag[i]&&turn==i);
临界区;
flag[i] = FALSE;
。。。
硬件实现方式
(1)在进入临界区前关中断,退出后开中断。因为CPU只在中断发生的时候进行进程切换。
(2)硬件指令方式:即原子操作
解决互斥与同步问题的一个更好的机制是信号量,即wait(S)
和signal(S)
原语,常记为PV操作,不过其实PV操作和这俩原语是有区别的。
细节请百度吧~~~