PV操作简介

PV操作,即Passeren和Vrijgeven的缩写,分别对应wait等待和signal释放,用于进程间通信。在Java中,AQS利用PV操作思想实现线程同步,如ReentrantLock和Semaphore。PV操作配合信号量,实现资源访问的互斥和同步。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

PV操作就是荷兰语Passeren(通过),Vrijgeven(释放)的简称。对应的就是wait等待,signal释放操作。

P操作就是,将进程从运行态转化为阻塞态,直到它被另一个进程唤醒

V操作就是,将一个处于阻塞态的进程唤醒。

这两个操作是CPU原语,所以从操作系统层面能保证这两个操作是原子操作。

PV操作一般都和信号量所关联,来实现一些互斥或者同步的逻辑。比如说将信号量设为0,此时表示一个互斥资源;将信号量设为N,此时就表示最多可以有N个进程并发访问,多出来的进程要陷入阻塞态

在Java中也有所体现,JUC下的AQS就用了这样的思想;AQS也维护了一个state属性和一个等待队列,state属性就是信号量,等待队列就专门用来存放陷入阻塞状态的线程。JUC下的很多类都是基于AQS实现的,比如ReentrantLock就是一个state值默认为0的AQS,Semaphore就是一个state默认值为N的AQS

在这里插入图片描述
可以看到这里就维护了等待队列的头结点和尾节点,还有一个state值,就是信号量

### 信号量的PV操作及其用法 #### 什么是信号量? 信号量是一种用于实现进程间同步和互斥的机制。它本质上是一个计数值,用来控制多个进程对共享资源的访问[^1]。 #### PV操作简介 P操作(也称为`semWait`)和V操作(也称为`semSignal`)是对信号量进行的操作。以下是它们的具体含义: - **P操作**: P操作会使信号量减去1。如果信号量的值变为负数,则调用该操作的进程会被阻塞,直到另一个进程通过V操作将其唤醒[^3]。这一步骤通常用于申请资源或进入临界区。 - **V操作**: V操作会使信号量加上1。如果此时信号量的值小于等于0,则会释放一个因P操作而被阻塞的进程。此操作常用于释放资源或将其他进程从等待状态中唤醒。 #### 使用场景分析 ##### 进程互斥 在多线程环境中,当多个线程试图访问同一份共享资源时,可能会发生冲突。为了解决这一问题,可以通过设置初始值为1的信号量来实现互斥访问。具体方法如下: - 在进入临界区之前执行P操作; - 在退出临界区之后执行V操作[^1]。 例如,在一个多线程程序中,假设存在一段代码区域只能由单一线程运行,则可以在该区域前后分别加入P和V操作以确保安全性。 ```c // 声明并初始化信号量mutex, 初值设为1 sem_t mutex; sem_init(&mutex, 0, 1); void* thread_function(void *arg) { // 请求进入临界区 (P操作) sem_wait(&mutex); // 访问共享资源... // 结束访问后释放锁 (V操作) sem_post(&mutex); } ``` ##### 生产者消费者问题 这是经典的同步问题之一,涉及两个角色——生产者和消费者以及两者共同使用的有限缓冲池。这里需要用到两种类型的信号量: - `empty`: 表示空闲槽位数量,初值设定为缓冲池大小; - `full`: 表示已填充槽位数量,初值为0。 工作流程描述如下: - 生产者每生成一项数据即减少`empty`并通过增加`full`通知消费者; - 消费者每次消费则减少`full`并将相应位置标记为空从而提升`empty`[^4]。 ```c sem_t empty; // 空槽数目 sem_t full; // 已填満槽数目 int buffer[N]; // 缓冲区大小N // 初始化信号量 sem_init(&empty, 0, N); sem_init(&full, 0, 0); void producer() { while(true){ produce_item(); // 创建新项 sem_wait(&empty); // 减少空槽数(P操作) acquire_lock(); insert_item(buffer); // 插入到buffer release_lock(); sem_post(&full); // 提升已填槽数(V操作) } } void consumer(){ while(true){ sem_wait(&full); // 减少已填槽数(P操作) acquire_lock(); remove_item(buffer); // 移除item consume_item(); // 处理移除后的item release_lock(); sem_post(&empty); // 提升空槽数(V操作) } } ``` #### 总结 通过对信号量的理解及合理运用其上的PV操作,能够有效管理并发环境下的资源共享与协调问题。无论是简单的互斥还是复杂的生产者/消费者模型都可以借助这种工具得到妥善处理。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值