理解PV操作和信号量

对于信号量,可以认为是一个仓库,有两个概念,容量和当前的货物个数。

P操作从仓库拿货,如果仓库中没有货,线程一直等待,直到V操作,往仓库里添加了货物,为了避免P操作一直等待下去,会有一个超时时间。

V操作往仓库送货,如果仓库满了,线程等待,直到有P操作,从仓库中拿走货物,有空的位置。

创建信号量,设置容量,先有V操作,才能P操作。

P操作:货物个数减1,减过之后,货物个数大于等于0,说明已经拿到货物,线程继续。否者线程阻塞。

V操作:货物个数加1,加过之后,货物个数小于等于容量,说明添加成功,线程继续。否者线程阻塞。

信号量:0≤ 信号量≤容量 ,取值 表示当前可以使用的货物;

        信号量<0 ,  取值 表示当前等待使用货物的线程;

信号量>容量 ,  信号量-容量 表示当前等待添加货物的线程。

通常,信号量的容量设置很大,可以一直V操作,不会阻塞,但是P操作的时候,很可能阻塞。

当容量为1,也就是互斥,执行流程必定是V操作,P操作,V操作,P操作...



信号量如何做到线程同步?

可以认为信号量关联一组线程,保存一个指针,指向线程数组的首地址。比如当前信号量为-1,进行P操作,信号量为-2,说明没有拿到货物,线程等待,取值为-2,说明有两个线程等待那货物。这个时候,其他线程进行V操作,信号量加1,为-1,信号量通知等待的线程中,第一个线程继续执行,第二个线程继续等待。

也就是说,P操作等待的情况是减1后,信号量小于0。 P操作继续执行的情况有两种:a、减1后,信号量大于等于0,不需等待,直接执行;b、信号量小于0,等待中,其他人进行了V操作,通知这个线程,继续执行。



项目中的使用场景:

客户端使用提供的SDk与服务交互,为了提高效率,客户端发送一个请求后,SDK异步回调给客户端。但是,有些请求,客户端希望同步,等待回复。这个时候,建立一个map,以req的sequence为key,value为信号量的指针,信号量的容量设置为1,可用的货物为0,对信号量进行TimeoutP操作,货物个数为-1,阻塞在这里。异步回调,收到回复的sequence,根据map找到信号量指针,进行V操作,货物个数为0,通知前面TimeoutP的线程继续执行下去,这个时候,TimeoutP的线程,把回复消息取出来,返回给客户端。

时间: 2024-12-14 18:41:20

理解PV操作和信号量的相关文章

PV操作,我终于懂你了!

上个星期,米老师给我们讲课实在是精彩!本人终于对Pv操作有了自己的理解.之前一直不太理解Pv操作,现在总结一下,以供下阶段学习和总结. 为什么叫PV操作?原因是:这是狄克斯特拉用荷兰文定义的,因为在荷 兰文中,通过叫passeren,释放叫vrijgeven,PV操作因此得名. 这张图乍一看谁也不知道我想说明什么.我想通过这张图来给大家解释一下PV操作! 中间这加粗的黑线是秤杆,就像我们生活中的上下控制的电源开关!只有两个状态,一个是向上,一个是向下. 这张图的上面是消费者(儿子),对于消费者来

PV操作 (转载)

PV操作与信号量的处理相关,P表示通过的意思,V表示释放的意思.信号量是最早出现的用来解决进程同步与互斥问题的机制,包括一个称为信号量的变量及对它进行的两个原语操作. 信号量(semaphore)的数据结构为一个值和一个指针,指针指向等待该信号量的下一个进程.信号量的值与相应资源的使用情况有关.当它的值大于0时,表示当前可用资源的数量:当它的值小于0时,其绝对值表示等待使用该资源的进程个数.注意,信号量的值仅能由PV操作来改变. 一般来说,信号量S>=0时,S表示可用资源的数量.执行一次P操作意

【软考】PV操作同步互斥

进程 在操作系统中,进程是占有资源的最小单位(线程可以访问其所在进程内的所有资源,但线程本身并不占有资源或仅仅占有一点必须资源),一个进程能有多个线程. 临界资源 指一次只能有一个进程在占用的资源.如现实中的衣服.一件衣服只能一个人在穿.比如一个硬盘.有两个进程对同一块区域进行写操作.数据不就一锅粥了么= = 临界区 在一个进程占有临界资源的时候.别的进程不能占有.这是互斥.从进程占有资源到资源被释放.这一段代码就叫临界区. 临界区原则(有空即进-无空则等-有限等待-让权等待) 个人造词= =

转 PV操作简单理解

传送门 PV操作简单理解 进程通常分为就绪.运行和阻塞三个工作状态.三种状态在某些条件下可以转换,三者之间的转换关系如下: 进程三个状态之间的转换就是靠PV操作来控制的.PV操作主要就是P操作.V操作和信号量.其中信号量起到了至关重要的作用. 信号量 信号量是最早出现的用来解决进程同步与互斥问题的机制. 信号量(Saphore)由一个值和一个指针组成,指针指向等待该信号量的进程.信号量的值表示相应资源的使用情况.信号量S>=0时,S表示可用资源的数量.执行一次P操作意味着请求分配一个资源,因此S

理解同步的PV操作

PV操作是Edsger Dijkstra提出的一种经典的解决同步不同执行线程的问题的方法,这种方法是基于一种叫信号量的特殊变量来实现的. 简单理解为就是通过共享变量+信号量实现的一种同步机制,其应用与生产者消费者模型,读写问题等领域. 在Java中有基于AQS实现的Semaphore信号量类. wiki对于其名字来源的解释 https://en.wikipedia.org/wiki/Semaphore_(programming)#Operation_names 可以做出以下对比:P(down/s

Operating System-进程/线程内部通信-信号量、PV操作的实现和应用(解决哲学家进餐和生产者消费者问题)

本文主要内容: 信号量的实现 利用信号量解决哲学家用餐问题 利用信号量解决生产者消费者问题 一.信号量的实现 1.1 信号量结构 typedef struct { int value; struct process * list } semaphore; value代表当前信号量可以使用的数量,list代表当前信号量上所等待的进程. 1.2 P操作实现 P(semaphore * s) { s.value--; if(s.value < 0) { add current process to s

Operating System-进程/线程内部通信-信号量和PV操作

本文介绍操作系统进程管理的两个核心概念: 信号量 PV操作 一.信号量介绍 1.1 信号量引入 信号量(Semaphore)1965年由Dijkstra引入的.信号量一般由一个值是一个变量,其值有可能是0,或者一个正数,或者是负数: 0表示没有资源可以使用 大于0,标识可用资源的数量 小于0,其绝对值表示等待这个资源的进程的个数 针对信号量,Dijkstra提出了两个操作: P操作 V操作 信号量的值只有通过PV操作来完成. 1.2 PV原语操作(atomic action) PV操作里面会有一

信号量与PV操作

在操作系统中进程之间经常会存在互斥和同步两种关系.为了有效处理这种情况,W.Dijskra在1965年提出信号量和PV操作的概念(1)信号量:一种特殊的变量,表现形式是一个整型S和一个队列(2)P操作:也成为"down()和wait()操作",使S=S-1,若S<0,进程暂停执行并放入信号量的等待队列.(3)V操作,也称为"up()和signal()操作",使S=S+1,若S<=0,唤醒等待队列中的一个进程. PV操作属于进程的低级通信. 利用信号量和P

(转)关于PV操作理解的例子

P就是请求资源,V就是释放资源. 问题1 一个司机与售票员的例子 在公共汽车上,为保证乘客的安全,司机和售票员应协调工作: 停车后才能开门,关车门后才能行车.用PV操作来实现他们之间的协调. S1:是否允许司机启动汽车的变量 S2:是否允许售票员开门的变量 driver()//司机进程 { while (1)//不停地循环 { P(S1);//请求启动汽车 启动汽车; 正常行车: 到站停车: V(S2); //释放开门变量,相当于通知售票员可以开门 } } busman()//售票员进程 { w