CoderMrWu

生活诚可期,爱情价更高!

操作系统的信号量以及PV操作

系统中应该有解决进程同步的一种专门机制。实际上,同步是并发进程之间在执行时序 上的一种相互制约的关系。进程互斥的实质也是同步,可把进程互斥看作是一种特殊的进程同步。

同步机制应该满足如下一些基本要求。首先,它的描述能力应足够强,即能解决各种进 程间同步互斥问题;其次,该同步机制应该容易实现并且效率高;第三,使用方便。

同步机制有各种类型,有硬件同步机制;有软件同步机制,如信号量及P、V操作,管 程,条件临界域等;有用于集中式系统中的路径表达式;还有适用于分布式系统中的远程过 程调用等同步机制。

这里我们主要介绍用于进程同步的信号量以及P、V操作。

一、信号量

用常规的程序来实现进程之间同步、互斥关系需要复杂的算法,而且会造成“忙等待”,浪费处理器资源,为此引人信号量的概念。信号量是一种特殊的变量,它的表面形式 是一个整型变量附加一个队列;而且,它只能被特殊的操作(即P操作和V操作)使用。P操作和V操作都是原语

荷兰的著名计算机科学家Dijkstm把进程互斥的关键含义抽象成为信号量(Semaphore) 概念,并引入了在信号量上的P、V操作作为同步原语(P和V分别是荷兰文的“等待”和 “发信号”两词的首字母)。这里,信号量是个被保护的量,只有P、V操作和信号量初始化操作才能访问和改变它的值

设信号量为S,S可以取不同的整数值。可以利用信号量S的取值表示共享资源的使用情况,或用它来指示协作进程之间交换的信息。在具体使用时,把信号量S放在进程运行的 环境中,赋予其不同的初值,并在其上实施P操作和V操作,从而实现进程间的同步与互斥。对信号量S实施的P操作和V操作,可分别用P (S)和V (S)表示。

二、P、V操作

P操作和V操作定义如下:

P (S)

{

S=S-1;

若S<0,将该进程状态置为等待状态,然后将该进程的PCB插入相应的S信号量等待 队列末尾,直到有其他进程在S上执行V操作为止;

}

V (S)

{

S = S + 1 ;

若S<=0,释放在S信号量队列中等待的一个进程,将其状态改变为就绪态,并将其插 入就绪队列;然后,执行本操作的进程继续执行;

}

三、信号量与P、V操作的物理含义

P操作和V操作是对信号量S进行的,有关信号量S和P、V操作的物理含义可以进一 步说明如下。

信号量S表示某类可用的临界资源。对于不同的临界资源,则用不同的信号量表示。

当S>0时,S值的大小表示某类可用资源的数量,即表示有该类资源可以分配。

当S<0时,表示没有可分配的资源数量,其S的绝对值表示排在S信号量的等待队列 中进程的数目。

每执行一次P操作,意味着请求的进程分配到一个资源;每执行一次V操作,意味着 进程释放了一个资源。

四、用P、V操作实现进程之间的互斥

这里叙述用P、V操作解决进程之间的互斥问题。

假设有进程A、B竞争进入临界区,用P、V操作实现进程之间的互斥的程序可以写成:

进程A

P(S)

临界区操作

V(S);

进程B

P(S);

临界区操作;

V(S);

其中,S的初值为1

五、用P、V操作实现进程间的同步

考虑一种同步关系,其中有两个信号量S1和S2,赋予它们的初值均为0, S1表示在一个缓冲区中是否装满信息,S2表示该缓冲区中信息是否取走。程序可写成:

进程A

while(true){

把信息送入缓存区;

V(S1);

P(S2);

};

进程B

while(true){

P(S1);

把信息从缓存区取走;

V(S2);

};

又如,有三个进程:进程get从输人设备上不断读数据,并放人缓冲区buffer1;进程 copy不断地将缓冲区buffer1的内容复制到缓冲区buffer2; 进程put则不断将buffer2的内容 在打印机上输出。为了使三个进程并行工作以大大加快执行速度,又保证打印结果和输人内 容一致,三个进程之间必须协调工作。需设置四个信号量 S1,S2, S3,S4,并令S1初值 为1,S2初值为0, S3初值为0, S4初值为1。则程序可以写成:

//进程get

while(true){

P(S1);

从输入设备向缓冲区buffer1读数据;

V(S2);

};

//进程copy

while(true){

P(S2);

P(S4);

将buffer1的内容复制到buffer2;

V(S1);

V(S3);

};

//进程put

while(true){

P(S3);

将缓冲区 buffer2内容在打印机上输出;

V(S4);

};

六、信号量及P、V操作小结

需要指出的是,P、V操作虽然逻辑上完整,能比较有效地实现进程同步与互斥问题, 但它也有明显的弱点:由于P或V操作每次只做加1或减1运算,即每执行一次P操作只能请求分配一个单位的资源,每执行一次V操作只释放出一个单位的资源,因此,如果一 个进程需要一次使用多个资源,就需要连续执行多次P操作,释放这些资源时也需多次执行V操作。这不仅增加了程序的复杂性,也降低了通信效率,致使进程之间需要相互等待很长的时间,甚至有可能导致死锁的发生

P、V操作在使用时必须成对出现,有一个P操作就一定有一个V操作。当为互斥操作 时,它们同处于同一进程;当为同步操作时,则不在同一进程中出现。

如果进程中P (S1和P (S2)两个操作在一起,那么P操作的顺序至关重要,尤其是 一个同步P操作与一个互斥P操作在一起时,同步P操作应出现在互斥P操作前。而两个V 操作的顺序无关紧要。

总而言之,信号量及P、V操作简单,而且表达能力强,用P、V操作可解决任何进程同步互斥问题。但P、V操作使用时不够安全,特别是P、V操作使用不当会出现死锁;此外遇到复杂同步互斥问题时用P、V操作实现也很复杂。

点赞