信号量的含义?信号量正负值的含义?PV操作分别是什么?(最好用一个典型程序体现三方面信息)。
时间: 2024-09-19 08:03:08 浏览: 141
信号量是一种进程间通信工具,用于控制对共享资源的访问。它维护了一个计数器,表示当前可用的资源数量。当一个进程请求资源时,如果信号量的值大于0,就减1并允许进程访问;如果等于0,则进程会被阻塞,直到有其他进程释放资源使得信号量增加。
信号量的正数值代表可供使用的资源数量,而负值通常表示等待该资源的数量。例如,一个信号量初始设为1,意味着有一个单位资源可供使用,当有两个进程尝试获取时,第一个成功,第二个被阻塞,此时信号量变为0。若第一个进程释放资源,信号量恢复为1,此时第二个进程可以继续执行。
PV操作是P(Pend)和V(Signal)操作的缩写:
- P (Wait) 操作:当一个进程尝试减少信号量的值,如果信号量小于等于0,进程就会进入睡眠状态,并把自己的进程ID放入信号量对应的等待队列。
- V (Wake-up) 操作:当一个进程完成了对资源的使用并释放资源时,它会增加信号量的值。如果此时有进程正在等待,信号量值大于0,那么唤醒一个等待进程,让其继续执行。
下面是一个简单的C语言示例:
```c
#include <semaphore.h>
sem_t sem; // 创建一个信号量
void producer() {
for(int i = 0; i < 5; ++i) {
sem_wait(&sem); // P操作,等待资源
printf("Producer produced item %d\n", i);
sem_post(&sem); // V操作,释放资源
}
}
void consumer() {
for(int i = 0; i < 5; ++i) {
sem_wait(&sem); // 等待生产者完成
printf("Consumer consumed item %d\n", i);
sem_post(&sem); // 防止其他消费者立即占用资源
}
}
int main() {
sem_init(&sem, 0, 1); // 初始化信号量为1
pthread_t prod_thread, cons_thread;
pthread_create(&prod_thread, NULL, producer, NULL);
pthread_create(&cons_thread, NULL, consumer, NULL);
pthread_join(prod_thread, NULL);
pthread_join(cons_thread, NULL);
sem_destroy(&sem); // 销毁信号量
return 0;
}
```
在这个例子中,`producer` 和 `consumer` 进程通过信号量协作,保证资源按顺序分配给消费者。
阅读全文