PV操作

至少有三次机会我可以把它学好,但还是对一些概念模糊

PV操作主要分两类:互斥和同步

简单讲,互斥的PV是同一个信号量,或者讲只有一个信号量。而同步的PV在同一段代码中是不同的信号量。同步一般是两个信号量。

那么信号量是什么?具体的概念书本上有,我这边理解信号量是指示队列的。因为如果简单把信号量定义成资源的个数,同步的时候完全可以只用一个信号量,因为池的大小是固定的,两个信号量就会浪费资源嘛。

这也是我一直不理解的地方,同步的时候为什么一直使用两个信号量。把信号量定义为指示队列的就好理解了。生产者消费者模式里面,生产者如果被阻塞就会形成一个阻塞队列,消费者如果被阻塞,了会形成一个消费者的队列。那么信号量S1就指示的是生产者的队列,如果等于负数就是队列中有进程等待,否则就没有进程等待。S2指示的是消费者的队列,如果为负数就表示队列中有消费者在等待,其绝对值就是等待消费者的个数。

PV里面一个重大的特点是阻塞进队列,唤醒队列中的进程。如P(S1),表示我会无论如何先减1,占用一个资源,如果资源还有,那么我就执行接下来的操作,如果资源没有了,那么我进队列。重点是后半部分的进入队列。如果同步只有一个信号量的话,就不能完成进队列和唤醒的操作。而消费者在消费完一个商品后,会执行V(S1),这个操作里面也有一个判断,如果S1的值是负数,则在执行完之后还要去生产者的队列唤醒一个进程。

其实在想不通为什么他们会这样做的时候,可以先把我们要解决的问题拿出来,看我有没有更好的办法去解决这个问题,一旦发现自己的理论不能解决这个问题的时候,你就会发现书本上提供方法的巧妙之处了。比如我一直觉得,同步模型完全可以使用一个信号量表示缓冲池空余的个数。先不说没办法统一定义PV的操作,光是两个队列都不好表示了,因为一个信号量只能真实反应池中空余的个数,并不能并未已经阻塞了多少生产者和多少消费者。当然有办法,可以再定义一个池的大小,这样也是两个变量,表面上更好理解了,但对PV的统一性造成了破坏。

互斥模型比较好理解,因为在同一做代码中,PV操作使用的是同一个信号量,这个信号量既表示了阻塞的队列,也能表示资源剩余的个数。因为大家都是同样的并行进程,所以大家都进入一个队列。

发表评论

邮箱地址不会被公开。