多进程的系统中避免不了进程间的相互关系。本讲将介绍进程间的两种主要关系——同步
与互斥,然后着重讲解解决进程同步的几种机制。)
进程互斥是进程之间发生的一种间接性作用,一般是程序不希望的。通常的情况是两
个或两个以上的进程需要同时访问某个共享变量。我们一般将发生能够问共享变量的程序
段称为临界区。两个进程不能同时进入临界区,否则就会导致数据的不一致,产生与时间
有关的错误。解决互斥问题应该满足互斥和公平两个原则,即任意时刻只能允许一个进程
处于同一共享变量的临界区,而且不能让任一进程无限期地等待。互斥问题可以用硬件方
法解决,我们不作展开;也可以用软件方法,这将会在本讲详细介绍。)
进程同步是进程之间直接的相互作用,是合作进程间有意识的行为,典型的例子是公
共汽车上司机与售票员的合作。只有当售票员关门之后司机才能启动车辆,只有司机停车
之后售票员才能开车门。司机和售票员的行动需要一定的协调。同样地,两个进程之间有
时也有这样的依赖关系,因此我们也要有一定的同步机制保证它们的执行次序。)
本讲主要介绍以下四种同步和互斥机制:信号量、管程、会合、分布式系统。
一,信号量
参考自 http://blog.csdn.net/leves1989/article/details/3305609
理解 PV:
PV 操作由 P 操作原语和 V 操作原语组成(原语是不可中断的过程),对信号量进行操作,
具体定义如下:
P(S):①将信号量 S 的值减 1,即 S=S-1;
② 如果 S³0,则该进程继续执行;否则该进程置为等待状态,排入等待队列。
V(S):①将信号量 S 的值加 1,即 S=S+1;
② 如果 S>0,则该进程继续执行;否则释放队列中第一个等待信号量的进程。
PV 操作的意义:我们用信号量及 PV 操作来实现进程的同步和互斥。PV 操作属于进程的
低级通信。
什么是信号量?信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该
信号量的下一个进程。信号量的值与相应资源的使用情况有关。当它的值大于 0 时,表示
当前可用资源的数量;当它的值小于 0 时,其绝对值表示等待使用该资源的进程个数。注
意,信号量的值仅能由 PV 操作来改变。
一般来说,信号量 S³0 时,S 表示可用资源的数量。执行一次 P 操作意味着请求分配一
个单位资源,因此 S 的值减 1;当 S<0 时,表示已经没有可用资源,请求者必须等待别的
进程释放该类资源,它才能运行下去。而执行一个 V 操作意味着释放一个单位资源,因此
S 的值加 1;若 S£0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,
使之运行下去。
利用信号量和 PV 操作实现进程互斥的一般模型是:
进程 P
1
进程 P
2
…… 进程 Pn
…… …… ……
P(S);))))))))))))))P(S);)))))))))))))))))))))))))P(S);
临界区;)))))))))))))临界区;))))))))))))))))))))))))临界区;
V(S);))))))))))))))V(S);))))))))))))))))))))))))V(S);
…… …… …… ……
其中信号量 S 用于互斥,初值为 1。
使用 PV 操作实现进程互斥时应该注意的是:
(1)每个程序中用户实现互斥的 P、V 操作必须成对出现,先做 P 操作,进临界区,后