信号量及PV操作实例详解

1.引言

在操作系统中,进程之间经常会存在互斥(都需要共享独占性资源时)和同步(完成异步的两个进程的协作)两种关系。为了有效的处理这两种情况,提出了信号量和PV操作。

(1)信号量:是一种特殊的变量,表现形式是一个整形S和一个队列。

(2)P操作:S=S-1,若S<0,进程暂停执行,进入等待队列。

(3)V操作:S=S+1,若S<=0,唤醒等待队列中的一个进程。

2.概念

同步:其实说同步还不如说”协作“,就是我们的目标只有一个,我们奔着同一个目标去的,都是在大家的努力下共同完成这么一件事情。还是比较容易理解的吧。

互斥:借用别人的一句话“千军万马过独木桥”,很通俗的一句话,就把咱们这个概念表达的淋漓尽致,就好比有一个大部队来到独木桥这,但是必须排好队,一个一个来;其实现实生活中,还有一个很好的例子可以说明这个互斥的概念,比如打印机,打印机这个工具就非常好的体现了互斥的概念,打印机一旦被别人占用了,那无乱你有多着急,都只能等着,对吧。

3.详解

为了更好的说明同步,我们接下来还继续看一下一张同步的图:

这张图也特别的形象具体,我们具体来看看这张图,A仓库有货物,然后我们需要把货物搬运到B仓库,由搬运工甲和搬运工乙来完成这个过程;那么他们的目标就只有一个,就是把货物从A搬到B去,共同奔着这个方向去发展,所以我们说这是一个同步的问题。

临界资源:就是咱们刚刚说的互斥,诸进程间需要互斥方式对其进行共享资源,如打印机、光驱等。

临界区:就是进程访问临界资源的那段代码。

讲了那么久,我们才引入了PV操作,看来这个PV操作还是挺有意思的。

PV操作:解决互斥和同步的问题。PV操作是分开来看的:

P操作:使S=S-1,若S>=0,则该进程继续执行,否则该进程排入等待队列。

V操作:使S=S+1,若S>0,唤醒等待队列中的一个进程。

这样理解不太好理解,咱们还是来看例子吧:

接下来,我们来看一个与咱们生活很贴切的问题:生产者——消费者问题:

我们还是一样,通过图片来分析问题:

这是一个著名的同步问题,虽然生产者进程和消费者进程都是异步方式运行的,但它们之间必须保持同步,即不允许消费者进程到一个空缓冲区去取产品,也不允许生产者进程向一个已装满产品且尚未被取走的缓冲区中投放产品。这是一个单缓冲区情况。那么这个单缓冲区的PV操作,应该是怎样的呢?我们来看看:

我们分析分析,很容易的发现这个流程,前提是S1初值为1,S2初值为0。我们需要记住P操作减1,V操作加1,然后这个分析就变得易如反掌了,我们先对初值进行一下说明:

a、我们把S1的初值设为1:是说明缓冲区还有一个空间可以使用,对于生产者而言,每一个缓冲区的一个空间就是一个资源,也就是说,一开始运行的时候,就允许生产者投放一个产品到缓冲区,

b、然后投放到缓冲区之后,我们来看消费者进程,P(S2):首先我们要进程一个判断,判断缓冲区中是否有产品,对消费者而言,缓冲区中有产品,就代表有一个资源可以使用,但是最初状态那个缓冲区中是没有资源的,所以S2的初值应该是为0的。

我们刚才都提到了资源的问题,就是信号量的一个值应该是表示资源的数量,但是就消费者和生产者而言,对于他们的资源是不同的,概念是不同的,生产者:缓冲区有多少个空格,就有多少个资源;而对消费者来说,缓冲区有多少个满的格,就有多少个资源,是刚好是相反,所以说,就是这么相反,所以当消费者从缓冲区取出一个产品之后,对于生产者而已,就多了一个资源。

其实这个过程就是这样的。

1、生产者:P(S1),那么P(S1),S1=S1-1,得到P(S1=0)这个进程还能进行,那么生产者把一个产品投放到缓冲区。

2、V(S2),S2=S2+1,S2初值为0,所以S2=S2+1>0,那么就激活了P(S2),那么消费者就能取出一个产品。

4、消费产品:消费产品之前,还有一个V(S1),就激活了P(S1),让生产者继续投放产品到缓冲区。

特别简单吧,这是单缓冲区分析。

我们接下来看一个相对来说,有点复杂一点点的,多缓冲区的,其实也一样一样的,继续:

我们还是分析一样的问题,生产者、消费者问题:

对应的PV操作应该是这样的:

有一点区别,就是要引用互斥的概念,因为缓冲区是一个临界资源,它始终只能有一个进程对其进行操作,所以我们就可以用一个互斥信号量来完成这一点,所以当某一个进程要使用到缓冲区之前,我们就进行以下判断,判断这个缓冲区现在是不是空闲呢?是不是有生产者或者消费者的进程在使用这个这个缓冲区呢?如果有,mute的初值为1,当有人使用这个缓冲区的时候,这个mute的值就由1变为0,这时,第二个进程向再来操作这个缓冲区,就不可能了,就会被阻塞,当第一个进程使用完缓冲区

公交车司机与售票员的问题:

我们来分析这个过程,我们把S1和S2的初值都设为0。我们来分析分析:

1、P(S1):S1=S1-1=-1,那么司机进程就被暂停,等会售票员进程,售票员关车门。

2、V(S1):S1=S1+1=0,激活了司机进程,那么司机就开始启动车辆、正常行驶、到站停车,当然售票员也有可能同时在售票。

3、P(S2):S2=S2-1,售票员在售票之后的进程就被暂停,等待司机进程。这样就避免了售票员售票之后就开车门了。因为这是不允许的。

4、V(S2):S2=S2+1,司机到站停车之后,就激活了售票员P(S2)的进程,那么售票员就进程 开车门、上下客的操作。

那么这个进程就完成了。

 

转载于:https://my.oschina.net/jimilee/blog/852007

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 进程之间可以使用信号来实现互斥,其中PV操作信号的基本操作PV操作包括两个操作:P操作和V操作。P操作用于获取信号,V操作用于释放信号。 在实现互斥的过程中,可以使用二元信号(也称为互斥信号)来实现。当一个进程需要访问共享资源时,它需要获取信号,即执行P操作。如果信号的值为1,则表示共享资源未被占用,进程可以获取信号并访问共享资源;如果信号的值为,则表示共享资源已被占用,进程需要等待其他进程释放信号。 当一个进程访问完共享资源后,需要释放信号,即执行V操作。这样,其他进程就可以获取信号并访问共享资源。 通过使用信号PV操作,进程之间可以实现互斥,避免多个进程同时访问共享资源导致的数据不一致问题。 ### 回答2: 互斥是指在同一时间只能有一个进程访问一个共享资源,以避免竞争条件的发生和数据的不一致性。其中,信号pv操作是一种常用的实现互斥的方法。 信号是一个计数器,初值为任意非负整数,可以在多个进程之间共享。在每个进程访问共享资源的时候,都需要申请信号,进入临界区代码段前使信号减1(P操作),表示占用该资源。使用完资源后,需要释放信号,将其加1(V操作),表示释放该资源。 以下以一个例子来说明。 假设有两个进程A和B,要实现对某个共享资源的互斥访问。 1. 定义一个信号,初值为1 semaphore mutex = 1; 2. 在进程A中访问共享资源的前面加上P(mutex),表示占用该资源,如果mutex为0,则进入等待队列;在释放共享资源的后面加上V(mutex),表示释放该资源,如果等待队列不为空,则唤醒一个等待进程。 P(mutex); // 访问共享资源 V(mutex); 3. 在进程B中同样加上P(mutex)和V(mutex)。 P(mutex); // 访问共享资源 V(mutex); 这样,就可以保证在任意时刻只有一个进程访问该共享资源,从而避免了竞争条件的发生和数据的不一致性。 在实际编程中,还需要考虑一些问题,比如避免死锁、优化pv操作等。但是总体来说,信号pv操作是一个非常重要的并发控制机制,可以帮助我们实现进程互斥,确保系统的正确性和可靠性。 ### 回答3: 互斥是指在多个进程或线程同时访问共享资源时,使用一种技术来保证任意时间只有一个进程或线程能够访问该资源。在进程之间实现互斥的一种常见方式是使用信号信号是一个计数器,用于控制多个进程或线程对共享资源的访问。在互斥中,信号的值只能为0或1,0表示共享资源被锁定,1表示共享资源可用。当某个进程需要访问共享资源时,它首先会尝试获取信号,如果获取成功,则将信号的值减1,并进入临界区访问共享资源;如果获取失败,则进程被阻塞,等待其他进程释放共享资源并增加信号的值。 在实现互斥时,需要使用信号的两个基本操作:P操作和V操作。P操作信号的值减1,用于占用共享资源;V操作信号的值加1,用于释放共享资源。这两个操作必须是原子性的,即一个进程正在执行这些操作时,其他进程不能同时进行相同的操作。 下面是一个使用信号实现互斥的示例代码: //定义信号 sem_t mutex; //初始化信号 sem_init(&mutex, 0, 1); //进入临界区前执行P操作 sem_wait(&mutex); //访问共享资源 ... //访问完共享资源后执行V操作 sem_post(&mutex); 在上面的代码中,初始化信号时将其值设为1,表示共享资源可用。在进入临界区前执行P操作,将信号的值减1,表示占用共享资源。在访问共享资源完成后执行V操作,将信号的值加1,表示释放共享资源。 需要注意的是,使用信号实现互斥时,必须保证任何情况下都能正确地执行P操作和V操作,否则可能出现死锁或资源泄漏等问题。另外,由于信号操作是原子性的,因此多个进程或线程之间的访问顺序是不可预测的。因此,在使用信号实现互斥时,还需要考虑到其他并发控制问题,例如死锁、饥饿、优先级反转等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值