PV操作和信号量

来源:互联网 发布:双十一淘宝价格规则 编辑:程序博客网 时间:2024/06/04 19:34

 

一个进程被分为了"就绪(ready)","运行(running)"和"阻塞(blocking)"三个工作状态,当前用处理器的哪个进程是"运行"状态,当前已经具备了使用处理器的条件而等待处理器的进程是处于就绪状态的进程,当运行的进程由于某种原因无法继续使用处理器的时候就停止他使用处理器使他进入"阻塞"状态,当他的条件再次的满足的时候再次进入就绪状态.

     而系统中的几个进程在一个访问某资源(读写缓存区)和数据(共享数据)的时候是互斥的,而解决这个问题的时候就用到了一种同步机制叫"PV"操作 他们是俩个执行的时候不能被打断的俩个操作原语句,

执行P操作P(S)时候信号量S的值减去一,若不为负则P(S)执行完毕,否则等待P操作的进程暂停来释放资源

执行V操作V(S)时候信号量S的值加上一,若不大于零则释放一个因为执行P(S)而等待的进程.对P1,P2可定义俩个信号量S1,S2初始值为1,0,进程P2在从缓冲B读取数据前执行P操作p(S2)在读出数据后执行V操作V(S1),当P1往缓冲B送入一数据后信号量S1变为0,在该数据读取之后才又变为1,因此前一数据 没有读取之前后一个数据不会送入,从而保证了P1 P2同步

 

用伪程序来说就是这样:

  P就是请求资源,V就是释放资源。

  例如一个司机与售票员的例子

  在公共汽车上,为保证乘客的安全,司机和售票员应协调工作:

  停车后才能开门,关车门后才能行车。用PV操作来实现他们之间的协调。

  S1:是否允许司机启动汽车的变量

  S2:是否允许售票员开门的变量

  driver()//司机进程

  {

  while (1)//不停地循环

  {

  P(S1);//请求启动汽车

  启动汽车;

  正常行车;

  到站停车;

  V(S2); //释放开门变量,相当于通知售票员可以开门

  }

  }

  busman()//售票员进程

  {

  while(1)

  {

  关车门;

  V(S1);//释放开车变量,相当于通知司机可以开车

  售票

  P(S2);//请求开门

  开车门;

  上下乘客;

  }

  }

  注意:busman() driver() 两个不停循环的函数

 

原创粉丝点击