进程同步与互斥基础

一、基本概念

同步:为了完成某个任务而建立的两个或多个进程,这些进程为了需要在某些位置上协调它们的工作次序而等待、传递信息所产生的制约关系。进程间的制约关系就是源于它们之间的相互合作。

互斥:当一个进程进入临界区使用临界资源是,另一个进程必须等待,当占用临界区资源的进程退出临界区以后才允许进入临界区,访问资源。注意,这里的一个并非卡死就一次只能一个进程访问临界资源。当信号量个数大于1的时候,一次可以有多个进程同时访问临界资源。前文的互斥定义只是最原始的定义。

二、同步准则

1)空闲让进:临界区空闲时,应该允许某个进程立即进入临界区访问临界资源。

2)忙则等待:当临界区进程访问数达到方位上限时,其他试图进入临界区的进程应该等待。

3)有限等待:应该避免进程一直等待永远进入不了临界区的情况。

4)让权等待:“权”即CPU使用权,当进程不能进入临界区的时候,应该放弃使用CPU,进入等待队列,而不是“忙等待”。

为了记忆,我们做个比喻:假设厕所就是临界区,擦屁股纸就是CPU。很不幸一个厕所只有一卷擦屁股纸。然后突然来了一群尿急的人在外面排队。厕所里没人了,当然应该让外面等的人进去(空闲让进);厕所里有人了,外面的人再尿急也应该等待(忙则等待);但是外面的人总不可能一直憋着不让上吧(有限等待);你不上厕所,就别把擦屁股纸抓在手里,拿给别人用用呗(让权等待)。

三、信号量实现同步

信号量课分为整性信号量和记录型信号量,二者的区别是整型信号量使用的是while循环不断测试,会产生“忙等待”。记录型信号量则是将等待进程加入等待队列,避免了“忙等待”。具体定义请自己Google。

进程同步互斥的三种基础模型

1)利用信号量实现同步

设有两个进程p1,p2 ,p2的Y语句需要等待p1中X语句的执行结果,说白了就是p2要等p1中x 语句执行完毕才能执行Y语句(Y→X )

semaphore s=0;
p1()
{
  ...
  x;//语句x
  v(s);//通知进程p2,语句x已经执行完毕
  ...
}
p2()
{
  ...
  p(s);//当x未执行则陷入等待
  y;//此时x语句已执行完,可以执行y语句了
  ...
}
2)利用信号量实现互斥

假设一次只能有一个进程进入临界区,则设置信号量S=1(即可用资源数为1)。假设此时有两个进程P1,P2(实际上可以有多个进程),那么实现临界资源互斥访问的算法如下:

semaphore s=1;
p1()
{
   ...
   p(s);
   ...//临界区
   v(s);
   ...
}
p2()
{
   ...
   p(s);
   ...//临界区
   v(s);
   ...
}
3)利用信号量实现前驱关系

下图给出了s1,s2,s3...s6六个进程间的依赖关系,为使六个进程得到有序的运行,需要对每个“依赖”用一个信号量来保证,为此我们针对这七个依赖设了七个信号量,分别是:a1,a2,b1,b2,c,d和e(均展示在图上)

进程同步与互斥基础_第1张图片

s1()
{
  ...
  v(a1);v(a2);//告知s2、s3已执行完
}
s2()
{
  ...
  p(a1);//等待s1执行完
  ...
  v(b1);v(b2);//告知s4、s5已执行完
}
s3()
{
  ...
  p(a2);//等待s1执行完
  ...
  v(c);//告知s6已执行完
}
s4()
{
  ...
  p(b1);//等待s2执行完
  ...
  v(d);//告知s6已执行完
}
s5()
{
  ...
  p(b2);//等待s1执行完
  ...
  v(e);//告知s6已执行完
}
s6()
{
  ...
  p(c);p(d);p(e);//等待s3,s4,s5执行完
  ...
}

四、分析进程同步互斥的步骤

1)关系分析:找出进程数目,分析进程之间的依赖关系。弄清进程间是同步、互斥还是前驱关系的?最好展示在一张图上,分别用不同的符号表示不同的关系。

2)整理思路:找出解决问题的关键点,并根据做过的题目找出解决的思路,根据操作流程确定P、V的大致顺序。

3)设置信号量:根据上面两步,确定信号量的个数以及每个信号量的初始值。

你可能感兴趣的:(操作系统,信号量,进程同步互斥)