第一次在自学考试的过程中接触到PV操作,关于这部分的有些模糊,所以尝试着总结一下。
基本概念
PV操作主要涉及到临界区,信号量,P操作,V操作,进程的同步与互斥这些概念。
临界区:并发进程中与共享变量有关的程序段。
注意:并发进程,当两个进程可能同时需要一个资源的时候,在临界区就容易发生问题。临界区就涉及到了程序的同步与互斥的问题了。
信号量是最早用于解决进程同步和互斥的问题的机制。
信号量(Saphore):一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
P操作P(s):将信号量S减去1,若结果小于0,则把调用P(s)的进程置成等待信号量S的状态。
V操作V(s):将信号量S加1,若结果不大于0,则释放一个等待信号量S的进程。
原语:两种操作是不可分割的整体,即:两种操作要么都执行,要么都不执行。和数据库中事务的四个原则之一原子性一样。
个人理解
P操作可以简单理解为去占用资源,每当使用一个,资源数(信号量S)就减少一个,一直到资源数小于0了,没有办法再去使用了,所以P操作占用过程必须停止等待资源的释放。
S操作可以简单理解为解除占用,当资源不再被占用的时候就回收,资源数(信号量S)就增加一个,这个时候有资源可以利用,P操作就可以继续工作了(释放等待资源的进程)。
图+案例
这个案例来源于食堂的就餐环节,根据我们的餐具占用情况,使用餐具就是P操作,而餐具回收处就是V操作,其实在食堂中这两个过程也是不可分割的。
无论是使用者还是清洗者两者的关注点都在餐具上,用空闲的餐具,用餐者可以继续使用,没有餐具的时候,用餐者等待餐具,而清洗者在需要清洗使用过的餐盘以供使用。
PV操作的优点
起到的作用就是解耦合,使用清洗的过程并本应该是一体的,两个都去观察餐具的使用情况,两者是一个相互锁定的过程,使用绑定清洗,只要存在使用就必须去清洗,用现实中的例子,例如清洗者暂时有事无法工作,餐厅就无法继续营业了。而使用PV操作,两个都是针对餐具的数量,只需根据餐具的数量去工作就行了,不需要因为对方的变化而去改变自己的状态。而我们送餐盘到清洗处的问题就是通知清洗者了。所以PV操作的过程存在通知过程,但并没有添加耦合的过程了。生活就是这么神奇。
总结
PV操作的作用就是解耦合,降低程序的复杂性。个人感觉最重要就是两种操作的不可分性。关于PV操作这些仅仅是基础知识,而且只是停留于理论阶段,去学习这些东西的目的希望可以用到编程的过程,以提高程序的性能,做出好质量的产品。