信号量机制

发布时间:2023-05-20

一、什么是信号量机制

信号量机制是操作系统多进程间的同步和互斥机制。它是一个计数器,用于控制对共享资源的访问。当进程需要使用共享资源时,必须先获得信号量许可。信号量是由内核维护的,在进程间共享。

二、信号量机制的基本操作

信号量机制的操作主要有两个,分别是P操作和V操作:

void P(Semaphore s) { // 申请s许可
   while(s <= 0) ; // busy waiting
   s--;
}
void V(Semaphore s) { // 释放s许可
   s++;
}

在使用信号量时,进程需要执行P操作来获得许可(信号量减一),使用完后执行V操作来释放许可(信号量加一)。

三、信号量机制的作用

信号量机制主要用于进程间的同步和互斥: 1、同步:多个进程需要按照一定的严格顺序执行,可以使用信号量机制。例如,一个生产者和一个消费者交替执行,需要保证生产者先生产数据,消费者才能消费数据,可以使用一个二元信号量实现。

Semaphore empty = 1; // 缓冲区空位信号量
Semaphore full = 0; // 缓冲区占用信号量
void producer() { // 生产者进程
   while(true) {
       produce(); // 生产数据
       P(empty); // 申请空位
       put(); // 放入缓冲区
       V(full); // 占用一个缓冲区
   }
}
void consumer() { // 消费者进程
   while(true) {
       P(full); // 申请占用
       get(); // 从缓冲区取出数据
       V(empty); // 释放一个空位
       consume(); // 消费数据
   }
}

2、互斥:多个进程需要访问共享资源时,需要避免数据的竞争问题,可以使用信号量机制。例如,多个进程需要访问同一个文件或打印机,需要确保只有一个进程在使用,可以使用一个互斥信号量实现。

Semaphore mutex = 1; // 文件互斥信号量
void process() { // 进程访问文件
   while(true) {
       P(mutex); // 申请文件访问
       // 访问文件
       V(mutex); // 释放文件访问
   }
}

四、信号量机制的优缺点

信号量机制的优点是可以实现多进程间的同步和互斥,且在不同进程之间是共享的。但是它也有缺点,例如: 1、死锁问题:如果进程获取信号量的顺序不正确,或者信号量的数量不够,可能导致死锁。 2、busy waiting问题:当一个进程在进行P操作时,如果所需的资源已经被其他进程占用,那么该进程就会进入busy waiting状态,占用CPU资源。 3、优先级问题:信号量机制无法控制不同进程的优先级,可能导致高优先级的进程一直在等待资源,低优先级的进程一直在占用资源。