操作系统 第二章 3 进程同步、信号量

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),在原语内通过判断,控制是否操作,起程序控制作用,用于进程控制的变量。

猜你喜欢

转载自blog.csdn.net/weixin_43214005/article/details/82827727