进程同步

多道程序下进程是并发执行的,因此就产生了同步的问题。

解释几个概念:
临界资源:一次只能被一个所使用的资源
临界区:访问临界资源的那部分代码

同步:直接制约关系,必须要进程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操作和这俩原语是有区别的。
细节请百度吧~~~

原文地址:https://www.cnblogs.com/yinyoupoet/p/13287417.html