1、进程同步:
使并发执行的诸进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
多个相互合作的进程,在一些关键点上可能需要互相等待或互相交换信息,这种相互制约关系称为进程同步关系
互斥:当一个进程进入临界区使用临界资源时,另一个进程必须等待,直到占用临界资源的进程退出临界区,我们称进程之间的这种相互制约关系为“互斥”。
2、临界区:
每个进程中访问临界资源的那段代码叫临界区。 为了正确同步,对临界区的代码要增加控制。
进入区:对欲访问的临界资源进行检。若此刻未被访问,设正在访问的标志 。不被打断,防止同步中的问题出现。
临界区:访问临界资源的代码。
退出区:将正在访问的标志恢复为未被访问的标志
剩余区:其余部分
3、临界资源:
一次仅允许一个进程使用的资源。
ep:
1+1不等于2的问题:
共享资源x应按临界资源处理,
一个进程还没用完前不能让其他进程使用
4、同步机制原则
- 空闲让进:资源使用最基本原则
- 忙则等待:保证互斥
- 有限等待:合适时被唤醒防止死等
- 让权等待:能主动释放CPU防止忙等
5、举个栗子
6、同步控制关键:
不应被打断(原语,OS核心态运行),不被打断的进行标志值的判断和修改
7、信号量机制
7.1 整型信号量
* P操作 wait(S): While S<=0 do no-op;
S=S-1;
* V操作 signal(S): S=S+1;
s是整型信号量,只能用于wait、signal,不能s=s+1,但可以赋值。s的值不会小于等于-2.
ep:
初始化s=1;
1)程序1:s=1,执行wait(s),s=1,s不符合while,不执行空操作,往下执行s--,—> s=0 —> 使用R
2)设此时程序2也申请使用R :s=0,符合while —> 空操作,不能使用R
3)当程序2时间片耗完,则会转到程序1 —>执行signal —> s=s+1=1
4)程序1,执行完转回接着执行程序2,—>执行程序2的while —> 条件不符合while —>执行s-- —>使用R —>执行signal
整型信号量的wait操作,当s ≤0时,当前进程会占着CPU不断测试; 信号量原语不能被打断,这个占有CPU的进程会一直不断的占据CPU循环下去,陷入忙等。
整型信息量可以控制同步,符合“有限等待”原则,不符合“让权等待”原则,效率低,使用使用用记录型信号量。
7.2 记录型信号量
P操作 wait(): S.value = S.value - 1;
if S.value < 0 then block(S.L)
V操作 signal(): S.value = S.value + 1;
if S.value <= 0 then wakeup(S.L)
ep:
初始化s.value=1;
1)程序1:s=1,执行wait(s),s.value=s.value-1=0,不符合if,不执行if,往下执行使用R
2)设此时程序2也申请使用R :执行wait—> s.value=s.value-1=-1,符合 if条件—> 被block,不能使用R —>跳回程序1
3)程序1:执行signal (s.value=s.value+1=0) —>符合if条件 —> wakeup(s.l)—> 转回执行程序2
4) 转回接着执行程序2(因为是if,使用转回执行程序2,直接执行if下一条指令),—>使用R —>执行signal(s.value=1,不符if,执行结束)
7.3 AND型信号量
一次性分配给进程所需资源,用完一起释放。Wait操作时对它所有需要的资源都要判断,有AND条件,故称“AND同步”、“同时wait”。
Swait(S1, S2, …, Sn)
if (S1 >=1 and … and Sn>=1 )then
for i=1 to n do Si= Si -1 ;
end for else
将进程阻塞在第一个不能满足资源信号量的队列中。
end if
Ssignal(S1, S2, …, Sn)
for i=1 to n do Si= Si +1 ;
唤醒所以与si相关的阻塞进程
end for
7.4 信号量集
Swait(S1, t1, d1, …, Sn, tn, dn)
if S1>= t1 and … and Sn>= tn then
for i=1 to n do Si:= Si - di ;
end for else …
end if
Ssignal(S1, d1, …, Sn, dn)
for i:=1 to n do Si= Si +di ;
…. end for
AND信号量机制上加以扩充,每种资源参数有三:
S 为信号量(现有值);
t 为下限值(现有不能少于该条件);
d 为需求值;
!只有一个信号量S的几种特殊情况
- Swait(S, d, d),,允许每次申请d个资源,若现有资源数少于d,不予分配。
- Swait(S, 1, 1),蜕化为一般的记录型信号量,一次申请一个,至多分配一个(S>1时可计数,或S=1时可控制互斥)。
- Swait(S, 1, 0),当S>=1时,允许多个进程进入某特定区,当S变为0后,阻止任何进程进入特定区,相当于可控开关。并不对S资源的数量产生影响。
8、信号量
只能被信号量原语操作(wait、signal),在原语内通过判断,控制是否操作,起程序控制作用,用于进程控制的变量。