进程之间的关系
在多道程序环境下,系统内同时运行的并发进程通常有多个,在这多个进程间必定存在以下两种情况:
-
相互独立的进程:这种进程既不影响系统中其它进程的执行,也不受其它进程的影响,它们各自是独立的。
-
彼此有关的进程:这种进程的执行依赖于其它进程的进展情况,或者说,它们之间存在着相互制约关系。
进程间执行时的相互制约关系又可分为两种:
- 间接制约关系:共享系统资源
- 直接制约关系:相互合作
并发执行的进程间存在这样的制约关系,以及进程在并发执行时具有异步性会给系统造成混乱。
解决的方法:
(1)保证多个进程采用互斥的方式访问临界资源;
(2)其次要协调相互合作的各个进程的执行次序。
进程同步
- 进程同步:指多个相关进程在执行次序上的协调。
- 主要任务:对多个相关进程在执行次序上进行协调,以使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
一、进程同步的基本概念
1、临界资源
在一段时间内只允许一个进程访问的资源,称为是临界资源,对于临界资源应采用互斥的访问方式。
2、临界区
临界区:
进程中访问临界资源时要执行的代码段。
repeat
entry section; 进入区
critical section; 临界区
exit section; 退出区
remainder section; 剩余区
until false;
临界区的作用:
只有进程进入到临界区才能访问临界资源,也即临界区就是为了让进程以互斥的方式访问临界资源而设置的。
3、同步机制应遵循的规则
- 空闲让进:当临界资源处于空闲状态,应允许一个请求进入临界区的进程立即进入临界区。
- 忙则等待:进程正在访问某临界资源则不允许其它的进程再进入到临界区去访问这个临界资源,而是让它等待。
- 有限等待:进程在等待进入临界区访问临界资源时,应该限制这个等待的时间。
- 让权等待:权是指处理机的使用权。
二、信号量机制
1、整型信号量
- 信号量S:表示系统某类资源可用的个数。
- 原子操作wait(S):进程申请一个资源; P操作
- 原子操作signal(S):进程释放一个资源。V操作
在进程对某类临界资源进行访问时必须执行而且只能执行这两个原子操作才能对资源进行访问。
wait和signal操作可描述为:
wait(S): while S≤0 do no-op S≤0表示系统中没有此类资源
S:=S-1; 若系统还有这类资源,则允许进程访问,并且在进程访问时将该类资源的个数减少一个。
—————申请资源的操作/P操作
signal(S): S:=S+1; 进程在访问完资源后要释放此类资源,系统中的这类资源就增加一个,因此要将信号量S做加一操作
—————释放资源的操作/V操作
P、V操作的性质:
具有原子性,进程只有通过 P操作 或是 V操作 才可以对信号量S进行修改,其它的进程不能同时对信号量S进行修改的。
利用 P、V操作 实现进程对资源的互斥访问。
利用P、V操作实现对临界资源的互斥访问
例如:系统中有两个进程A和B竞争进入临界区,用信号量S表示临界区这种资源的个数,并设S的初始值为1,那么描述如下:
进程A 进程B
…… ……
P(S); P(S);
临界区操作; 临界区操作;
V(S); V(S);
利用P、V操作实现进程间的简单同步。
例如:设S是信号量,表示缓冲区的所存放的信息资源个数,在这里我们让这一个缓冲区中只能存放一个信息,且初始值为0:
进程A 进程B
…… ……
将信息送到缓冲区; P(S);
V(S); 把信息从缓冲区取走;
型号量机制注意事项
- 如果只有wait操作而没有signal操作,那么会出现只申请资源而不释放资源,使得别的进程由于申请不到该类资源而处于阻塞状态并且有可能一直处于阻塞状态。
- 如果只有signal操作而没有wait操作,那么说明任何一个进程都可以修改信号量的值,从而不能保证进程对临界资源的互斥访问。
- 这两个操作是必须成对出现的,但是可以不在一个进程中同时出现,如用P、V操作实现进程同步的例子。
整型信号量的缺点
违反同步机制中 “让权等待” 的规则
2、记录型信号量
在信号量机制中,除了一个用于代表资源数目的整型变量value外,还应增加一个进程链表L,用于链接那些由于申请不到某类临界资源而暂时等待的所有进程。它所包含的上述两个数据项可描述为:
type semaphore=record
value: integer ;
L: list of process ;
end
wait和signal操作可描述为:
procedure wait(S)
var S:semaphore;
begin
S.value:=S.value-1;
if S.value<0 then block(S.L)
end
procedure signal(S)
var S:semaphore;
begin
S.value:=S.value+1;
if S.value≤0 then wakeup(S.L);
end
P操作的功能描述
V操作的功能描述
记录型信号量的物理意义
- S.value > 0时, S.value为系统中可用资源的数量;
- S.value = 0时,可用资源量正好用完;
- S.value < 0时,| S.value |为系统中等待使用该资源的队列长度,即 (在信号量上等待的进程数)。
3、AND型信号量
AND同步机制的基本思想
将进程在整个运行过程中需要的所有资源,一次性全部地分配给进程,等进程使用完后再一起将这些资源释放。
因此可以在wait操作中通过增加一个“AND”条件来实现同时申请操作,即Swait操作, Swait定义如下:
Swait (S1,S2,…,Sn)
if S1≥1 and … and Sn≥1 then
for i:﹦1 to n do
Si:﹦Si﹣1;
endfor
else
place the process in the waiting queue associated with
the first Si found with Si<1, and set the program count of
this process to the beginning of Swait operation
endif
Ssignal (S1,S2,…,Sn)
for i:﹦1 to n do
Si:﹦Si﹢1;
remove all the process waiting in the queue
associated with Si into the ready queue
endfor;
4、信号量集
对AND信号量机制加以扩充,对进程所申请的所有资源以及每类资源不同的资源需求量,在一次P、V原语操作中完成申请或释放。
其中
- Si:资源信号量,系统目前有的资源数;
- ti:某资源分配的下限;
- di:进程对某资源的需求量。
Swait (S1,t1,d1,…,Sn,tn,dn)
if S1≥t1 and … and Sn≥tn then
for i:﹦1 to n do
Si:﹦Si﹣di;
endfor
else
Place the process in the waiting queue of the first Si with Si<ti and set its program
counter to the beginning of the Swait Operation
endif
Ssignal (S1,d1,…,Sn,dn)
for i:﹦1 to n do
Si:﹦Si﹢di;
Remove all the process waiting in the queue associated with Si into the ready queue
endfor;
在信号量集机制中对于Swait操作有以下几种特殊情况:
(1)Swait ( S, d, d )
此时在信号量集中只有一个信号量S,但允许它每次申请d个资源,当现有资源数少于d时,不予分配。
(2)Swait ( S, 1, 1 )
此时的信号量集已蜕化为一般的记录型信号量(S>1时)或互斥信号量(S=1时)。
(3)Swait ( S, 1, 0 )
这是一种很特殊且很有用的信号量操作。当S≥1时,允许多个进程进入某特定区;当S变为0后,将阻止任何进程进入特定区。换言之,它相当于一个可控开关。
5、信号量的作用
(1)利用信号量实现进程互斥
(2)利用信号量实现前驱关系
例:设有两个并发执行的进程P1和P2。 P1中有语句S1;P2中有语句S2。要求实现S1先于S2执行。
分析:进程P1和P2两者之间的关系。
解决:设置公用信号量S,初始值为0。
在进程P1中:
……
执行S1;
signal(S);
……
在进程P2中:
……
wait(S);
执行S2;
……