进程同步的主要任务是使并发执行的进程之间能有效地共享资源和相互合作,从而使程序的执行具有可再现性。
1. 互斥与同步的基本概念
互斥:当一个进程正在访问某共享资源时,就不允许其他进程对其访问,这种相互制约关系称为互斥。
临界资源:一段时间内仅允许一个进程使用的资源称为临界资源。
应互斥使用的资源有:打印机、输入机、磁带机;共享变量、共享数据结构等。
共享变量例
P1: P2:
R1=C; R2=C;
R1=R1+1; R2=R2+1;
C=R1; C=R2;
如果先执行P1再执行P2,则C值增加2。
若按顺序R1=C;R2=C;R1=R1+1;C=R1;R2=R2+1;C=R2;则C值增加1。这种错误称为“与时间有关的错误”,产生的原因是没有互斥使用共享变量。
临界区
临界区:进程中访问临界资源的那段代码称为临界区,又称临界段。
同类临界区:所有与同一临界资源相关联的临界区。
同步
同步:多个相关进程在执行次序上的协调。
同步例:计算进程与打印进程共享一个单缓冲区。
4.2 解互斥问题的算法
互斥问题的软件解法就是让多个进程互斥地进入各自的同类临界区。
同类临界区:所有与一个CR相联系的CS
解互斥问题应遵循的原则
空闲让进:若无进程处于临界区时,应允许一个进程进入临界区。
忙则等待:当已有进程进入临界区,其他进程必须等待。
有限等待:应保证要求进入临界区的进程在有限时间内进入临界区。
让权等待:当进程不能进入自己的临界区时,应释放处理机。
驻留有限:进程驻留在临界区中的时间有限。
用软件方法实现互斥
假设互斥在两个进程间进行,两进程的并发执行表示如下:
void main()
{ 公共变量说明;
cobegin
p0();
p1();
coend }
访问临界资源的进程描述
void p(int i)
{
while(true)
{
进入代码;
临界区;