1、如何理解p、v操作:

           P: s-- 若s>=0 则占有资源,向下执行 ,否则等待该资源,底层表现在加入该资源的等待队列上

           V:  s++ 即归还资源,若s>0 则继续向下执行,若s<=0  ,则说明原本s的值是负数,有进程正在等待,此时需要从等待队列上将其唤醒。(s=0,表示有一个在等待,依次类推)

           执行完P、V操作之后的s值:  s>=0 s表现为可用的资源数   S<0表现为正在等待的进程数。

 

 

2、 如何做P、V操作题 :

          

             1、分析题目,抽取进程的逻辑关系,具体表现为每个进程需要什么资源  做什么事 返还什么资源 。如若要根据某种情况选择不同的执行方案 则需要增加 控制变量 ,当然这也是临界变量;  

                  对于资源,一定要具体到每个进程需要哪个资源,必要时,可以对资源进行编号,如哲学家就餐问题。

            2、选择信号量,即互斥信号量和同步信号量。对于同步信号量 ,明确其代表的含义和用来阻塞哪个进程。
                 

                 互斥信号量即两个进程对临界资源的访问,这取决于临界资源的个数,一般为1。只要出现某一变量有两段修改的代码而该变量的值又与逻辑相关 就需要设置互斥变量,并不是所有的控制变量都需要互斥信号量,如吸烟者问题中 供应商提供不同的物品唤醒不同的吸烟者就不需要互斥信号量。

                 设置同步信号量取决于上一步中逻辑关系,每个进程什么时候需要被阻塞 ,则加一个信号量,一般来说 一个信号量用于阻塞一个进程,被另一个进程唤醒。

 

3、伪代码

       

                1、遵循这样一个原则,先P(同步信号量),再P(互斥信号量),操作 ,V(互斥信号量),V(同步信号量)  
                        
                         其中 ,先P(同步信号量)是为了判断进程有没有必要进入临界区,即先确保能拿到运行所要的资源,再进入临界区进行操作,具体案例见生产者消费者问题。