进程同步

进程同步的基本概念

在多道程序环境下 ,进程是并发执行的,不同进程之间存在不同的相互制约关系。 为了协调进程之间的相互制约关系,引入了进程同步的概念。 举一个简单例子让大家理解这个概念 ,比如,让系统计算1+2*3,假设系统产生两个进程:一个是加法进程 、一个是乘法进程。为了让计算结果是正确的,那么一定要让加法进程发生在乘法进程之后,但实际上操作系统具有异步性, 如果不加制约,加法进程发生在乘法进程之前是绝对有可能的,所以就要制定一定的机制,去约束加法进程,让他在乘法进程完成之后才发生,而这种机制,就是本节要讨论的内容。

    临界资源

虽然多个进程可以共享系统中的各种资源,但其中许多资源一次只能为一个进程所使用,我们把一次仅允一个进程使用的资源称为临界资源。许多物理设备都属于临界资源,如打印机等。 此外,还有许多变量、数据等都可以被若干进程共享,也属于临界资源。

对临界资源的访问,必须互斥地进行,在每个选程中,访问临界资源的那段代码称为临界区。

为了保证临界资源的正确使用,可以把临界资源的访问过程分成四个部分:

1)进入区。为了进入临界区使用临界资源,在进入区要检查可否进入临界区,如果可以进入临界区,则应设置正在访问临界区的标志,以阻止其他进程同时进入临界区。

2)临界区。进程中访问临界资源的那段代码,又称临界段。

3)退出区。将正在访问临界区的标志清除。

4)剩余区。代码中的其余部分。

2 . 同步

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

例如,输入进程 A 通过单缓冲向进程 B 提供数据。当该缓冲区空时,进程 B 不能获得所需数据而阻塞,一旦进程 A 将数据送入缓冲区,进程 B 被唤醒。反之,当缓冲区满时,进程 A 被阻塞,仅当进程 B 取走缓冲数据时,才唤醒进程 A。

3 . 互斥

互斥亦称间接制约关系。当一个进程进入临界区使用临界资源时,另一个进程必须等待,当占用临界资源的进程退出临界区后,另一进程才允许去访问此临界资源。

例如,在仅有一台打印机的系统中,有两个进程A 和进程 B,如果进程 A 需要打印时,系统己将打印机分配给进程 B,则进程 A 必须阻塞。一旦进程 B 将打印机释放,系统便将进程 A 映醒,并将其由阻塞状态变为就绪状态 。

为禁止两个进程同时进入临界区 ,同步机制应遵循以下准则:

1)空闲让进。临界区空闲时,可以允许一个请求进入临界区的进程立即进入临界区。

2)优则等待。当己有进程进入临界区时,其他试图进入临界区的进程必须等待。

3)有限等待。对请求访问的进程,应保证能在有限时间内进入临界区。

4)让权等待。当进程不能进入临界区时,应立即释放处理器,防止进程忙等待。

管程

    管程的定义

系统中的各种硬件资源和软件资源,均可用数据结构抽象地描述其资源特性,即用少量信息和对资源所执行的操作来表征该资源,而忽略了它们的内部结构和实现细节。管程是由一组数据以及定义在这组数据之上的对这组数据的操作组成的软件模块,这组操作能初始化并改变管程中的数据和同步进程。

    管程的组成

1)局部于管程的共享结构数据说明。

2)对该数据结构进行操作的一组过程。

3)对局部于管程的共享数据设置初始值的语句。 相信熟悉面向对象程序设计的读者看到管程的组成后,会立即联想到,管程很像一个抽象类。

    管程的基本特性

1)局部于管程的数据只能被局部于管程内的过程所访问。

2)一个进程只有通过调用管程内的过程才能进入管程访问共享数据,

3)每次仅允许一个进程在管程内执行某个内部过程。

由于管程是一个语言成分,所以管程的互斥访问完全由编译程序在编译时自动添加,无需程序员关注,而且保证正确。

在看完前面那么正规化、学术化的对管程的介绍后,相信不少读者仍然对管程没有清晰的认识,这里,我们再用生活化的语言介绍什么是特程。 

管程实质上是一个抽象类。这个抽象类有好几个成员变量,系统中任何设备部门都以通过这几个成员变量进行区分和描述;管程中还有对这些成员变量进行操作的一组成员函数,例如,对外设的操作中,会有 read, write  这一类函数。假如,进程 P0要使用一台打印机,于是管程这个抽象类就会利用初始值语句对自身的几个成员变量赋初值 (这个行为不需要程序员关注),特定的几个初值可以让管程表示成一台打印机,进程P0进入管程后,通过调用管程内的成员函数 (即上而所说的过程) 对这台打印机进行操作。每次进入这个管程的 ,只能是一个进程。

你可能感兴趣的:(进程同步)