PV操作弄得我好糊涂。。。
下面是一些理解,不知道是否正确,还望大家指正。
前提:PV操作的目的是为了防止多个进程同时访问相同的变量。
用书面上的语言来解释PV操作,就是:PV操作有两个操作——P操作和V操作组成;
P操作:将信号量S减去1,若结果小于0,则将调用P(S)的进程置成等待信号量S的状态
V操作:将信号量加上1,若结果不大于0,则释放一个等待信号量S的进程。(在此释放一个等待信号量S的进程理解为:有进程在等待执行。若结果大于0,则表示没有进程在等待)
注:信号量表示可以利用的资源,若有等待 则表示为负数。
用更直观的解释可以用两个实例分别表示:
首先,分别解释什么是PV操作:
对于只有一个信号量控制的操作:
就拿上下车来说,车里所能容纳的人数就是信号量S,如果有人要上车首先要确定还有没有座位,确定有没有座位的操作就是P操作,若有则上车(运行),没有则等待。当这个人下车的时候就执行V操作,释放一个座位资源。
对于两个信号量控制的操作:
拿父亲和儿子放苹果和拿苹果来说,父亲和儿子的操作是并发的,这里通过盘子来解耦。父亲将苹果放到盘子里,儿子从盘子里拿走苹果。在父亲放苹果之前要进行P操作:P(S父),即检验盘子是否有空间来让自己放苹果,若有空间则将苹果放到盘子里,并通知儿子去拿苹果,进行V操作:V(S子),若没有空间则等待。与此同时,儿子要执行拿苹果的操作,之前进行P操作:P(S子),若盘子内有苹果则执行拿苹果的操作,并通知父亲可以放苹果了,进行V操作:V(S父)。若没有苹果则儿子等待。
父亲和儿子信号量的的初值分别为S父=盘子内所能容纳的苹果数,由于初始盘子内没有苹果,且儿子在等待拿苹果,所以儿子信号量的初值为S子=-1。
在父亲和儿子对苹果进行操作的情况下:当且仅当盘子内只能容纳一个苹果时,父亲和儿子进行操作位两个同步的进程。