MST

星途 面试题库

面试题:进程管理中信号量机制在进程同步的基本应用

请阐述信号量机制的基本原理,并举例说明如何使用信号量来实现两个进程之间的同步,比如一个进程生产数据,另一个进程消费数据。
48.8万 热度难度
操作系统进程管理

知识考点

AI 面试

面试题答案

一键面试

信号量机制基本原理

信号量(Semaphore)是一个整型变量,通过一个计数器控制对共享资源的访问。它有一个计数值,当进程请求访问共享资源时,信号量计数值减1;当进程释放共享资源时,信号量计数值加1。如果计数值为0,表示共享资源已被占用,请求的进程需要等待。

使用信号量实现进程同步示例(以生产 - 消费模型为例)

假设在C语言环境下,使用POSIX信号量实现。

  1. 引入头文件
#include <stdio.h>
#include <stdlib.h>
#include <pthread.h>
#include <semaphore.h>
  1. 定义信号量和共享数据
sem_t empty; // 表示缓冲区是否为空的信号量
sem_t full;  // 表示缓冲区是否有数据的信号量
int buffer;  // 共享缓冲区
  1. 生产者函数
void* producer(void* arg) {
    for (int i = 0; i < 5; i++) {
        sem_wait(&empty);  // 等待缓冲区为空
        buffer = i;
        printf("Produced: %d\n", buffer);
        sem_post(&full);   // 通知缓冲区有数据
    }
    return NULL;
}
  1. 消费者函数
void* consumer(void* arg) {
    for (int i = 0; i < 5; i++) {
        sem_wait(&full);   // 等待缓冲区有数据
        printf("Consumed: %d\n", buffer);
        sem_post(&empty);  // 通知缓冲区为空
    }
    return NULL;
}
  1. 主函数
int main() {
    pthread_t producer_thread, consumer_thread;

    sem_init(&empty, 0, 1); // 初始化empty信号量,初始值为1,即缓冲区初始为空
    sem_init(&full, 0, 0);  // 初始化full信号量,初始值为0,即缓冲区初始无数据

    pthread_create(&producer_thread, NULL, producer, NULL);
    pthread_create(&consumer_thread, NULL, consumer, NULL);

    pthread_join(producer_thread, NULL);
    pthread_join(consumer_thread, NULL);

    sem_destroy(&empty);
    sem_destroy(&full);

    return 0;
}

在上述代码中,producer函数生产数据放入共享缓冲区,consumer函数从共享缓冲区取出数据。empty信号量用于控制生产者何时可以向缓冲区写入数据(缓冲区为空时),full信号量用于控制消费者何时可以从缓冲区读取数据(缓冲区有数据时)。通过这两个信号量的协调,实现了生产者和消费者进程之间的同步。