最经典的关于PV操作的解释说明
不知道各位有没有感觉,计算机⽅⾯的考试,操作系统那块似乎PV操作经常考,这⼀⽅⾯说明它的重要,另⼀⽅⾯也说明它不容易理解,出错的⼈很多,下⾯就举⼏个经典的例⼦来帮助⼤家学习,也与诸位同进步。
⼀,PV操作简介
PV两个字母是荷兰⽂ P asseren(通过),V rijgeven(释放)的简称。
PV操作与信号灯的处理相关,P表⽰通过的意思,V表⽰释放的意思。所谓信号灯,实际上就是⽤来控制进程状态的⼀个代表某⼀资源的存储单元。例如,P1和P2是分别将数据送⼊缓冲B和从缓冲B读出数据的两个进程,为了防⽌这两个进程并发时产⽣错误,狄克斯特拉设计了⼀种同步机制叫“PV操作”,P操作和V操作是执⾏时不被打断的两个操作系统原语。执⾏P操作P(S)时信号量S的值减1,若结果不为负则P(S)执⾏完毕,否则执⾏P操作的进程暂停以等待释放。执⾏V 操作V(S)时,S的值加1,若结果不⼤于0则释放⼀个因执⾏
P(S)⽽等待的进程。对P1和P2可定义两个信号量S1和S2,初值分别为1和0。进程 P1在向缓冲B送⼊数据前执⾏P操作P(S1),在送⼊数据后执⾏V操作V(S2)。进程P2在从缓冲B读取数据前先执⾏P操
作P(S2),在读出数据后执⾏V操作V(S1)。当P1往缓冲B 送⼊⼀数据后信号量S1之值变为0,在该数据读出后S1之值才⼜变为1,因此在前⼀数未读出前后⼀数不会送⼊,从⽽保证了P1和P2之间的同步。PV操作属于进程的低级通信。
具体定义如下:
P(S):①将信号量S的值减1,即S=S-1;
②如果S30,则该进程继续执⾏;否则该进程置为等待状态,排⼊等待队列。
V(S):①将信号量S的值加1,即S=S+1;
②如果S>0,则该进程继续执⾏;否则释放队列中第⼀个等待信号量的进程。
⼆,⼏个关于PV操作⽐较经典的例⼦
1.⼤学操作系统 中的经典例⼦
  P就是请求资源,V就是释放资源。
  例如⼀个司机与售票员的例⼦
  在公共汽车上,为保证乘客的安全,司机和售票员应协调⼯作:
  停车后才能开门,关车门后才能⾏车。⽤PV操作来实现他们之间的协调。
  S1:是否允许司机启动汽车的变量
  S2:是否允许售票员开门的变量
  driver()//司机进程
  {
  while (1)//不停地循环
  {
  P(S1);//请求启动汽车
  启动汽车;
  正常⾏车;
  到站停车;
  V(S2); //释放开门变量,相当于通知售票员可以开门
  }
  }
  busman()//售票员进程
  {
一块操  while(1)
  {
  关车门;
  V(S1);//释放开车变量,相当于通知司机可以开车
  售票
  P(S2);//请求开门
  开车门;
  上下乘客;
  }
  }
  注意:busman() driver() 两个不停循环的函数
2.仓库保管员的例⼦
某⼯⼚仓库有⼀名保管员,该仓库可存放n箱零件。该⼯⼚⽣产车间有m名⼯⼈,只要仓库空闲,⼯⼈将⽣产好的整箱零件放⼊仓库,并由保管员登记⼊库数量;该 ⼯⼚销售部有k名销售员,只要仓库库存数能满⾜客户要求,便可提货,并由保管员登记出库数量。规定⼯⼈和销售员不能同时进⼊仓库,但是⼯⼈和⼯⼈,销售员 和销售员可以同时进⼊仓库,其⼯作流程如下图所⽰。
这是⼀道2005年的系统分析师德考题,答案有兴趣搜搜看。
3.其他可参考《操作系统pv操作(pv⾦典)》