PV操作的由来
进程之间的三个状态的转换就是用PV操作来控制的。PV操作的三个部分:P操作、V操作、信号量。
信号量最早出来解决进程同步与互斥的问题。信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程。信号量的值表示相应资源的使用情况。信号量S>=0时,S表示可用资源的数量。执行一次P操作意味着请求分配一个资源,因此S的值减1;当S<0时,表示已经没有可用资源,S的绝对值表示当前等待该资源的进程数。请求者必须等待其他进程释放该类资源,才能继续运行。而执行一个V操作意味着释放一个资源,因此S的值加1;若S<0,表示有某些进程正在等待该资源,因此要唤醒一个等待状态的进程,使之运行下去。
举例
桌子上有一个水果盘,每一次可以往里面放入一个水果。爸爸专向盘子中放苹果,儿子专等吃盘子中的苹果。
分析:把爸爸、儿子看作二个进程,试用P、V操作使这四个进程能正确地并发执行。
解答:
semaphore S_PlateNum; // 盘子容量,初值为1
semaphore S_AppleNum; // 苹果数量,初值为0
void father( ) // 父亲进程
{
while(1)
{
P(S_PlateNum);
往盘子中放入一个苹果;
V(S_AppleNum);
}
}
void son( ) // 儿子进程
{
while(1)
{
P(S_AppleNum);
从盘中取出苹果;
V(S_PlateNum);
吃苹果;
}
}
注意点
S的绝对值表示等待的进程数,同时又表示临界资源,这到底是怎么回事?
答(个人看法):当信号量S小于0时,其绝对值表示系统中因请求该类资源而被阻塞的进程数目.S大于0时表示可用的临界资源数。注意在不同情况下所表达的含义不一样。当等于0时,表示刚好用完。
小结
其实知识点没有学不会这一说,只有自己看的多与少的问题。弄清楚他的由来,再结合自己的生活例子去学习,书上的知识只不过是生活经验的抽象罢了。