PV操作

来源:互联网 发布:如何做一名数据分析师 编辑:程序博客网 时间:2024/06/04 17:55

一,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() 两个不停循环的函数

原创粉丝点击