MST

星途 面试题库

面试题:并发与同步之中等难度:信号量机制在操作系统并发控制中的应用

请简述信号量机制的原理,并举例说明如何使用信号量来解决操作系统中进程间的同步和互斥问题,例如生产者 - 消费者模型。
22.2万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

信号量机制原理

信号量是一个整型变量,它通过一个计数器来控制对共享资源的访问。信号量的值表示当前可用的共享资源数量。当进程需要访问共享资源时,它尝试获取信号量(即减少计数器的值)。如果计数器的值大于0,则获取成功,进程可以继续执行;如果计数器的值为0,则获取失败,进程将被阻塞,直到其他进程释放信号量(增加计数器的值)。

使用信号量解决进程间同步和互斥问题 - 生产者 - 消费者模型示例

  1. 初始化信号量
    • 假设有两个信号量,一个是empty,表示缓冲区中的空闲位置,初始值为缓冲区大小n
    • 另一个是full,表示缓冲区中的已占用位置,初始值为0。
    • 还需要一个互斥信号量mutex,用于保证对缓冲区的互斥访问,初始值为1。
  2. 生产者代码示例(伪代码)
while (true) {
    // 生产数据
    produce_data();
    // 获取empty信号量,表示获取一个空闲缓冲区位置
    wait(empty); 
    // 获取互斥锁,确保对缓冲区的互斥访问
    wait(mutex); 
    // 将数据放入缓冲区
    put_data_to_buffer(); 
    // 释放互斥锁
    signal(mutex); 
    // 释放full信号量,表示缓冲区有新数据
    signal(full); 
}
  1. 消费者代码示例(伪代码)
while (true) {
    // 获取full信号量,表示获取一个有数据的缓冲区位置
    wait(full); 
    // 获取互斥锁,确保对缓冲区的互斥访问
    wait(mutex); 
    // 从缓冲区取出数据
    get_data_from_buffer(); 
    // 释放互斥锁
    signal(mutex); 
    // 释放empty信号量,表示缓冲区有空闲位置
    signal(empty); 
    // 消费数据
    consume_data(); 
}

在生产者 - 消费者模型中,emptyfull信号量实现了生产者和消费者之间的同步,确保生产者不会在缓冲区满时继续生产,消费者不会在缓冲区空时消费。而mutex信号量解决了对共享缓冲区的互斥访问问题,避免多个进程同时访问缓冲区导致数据混乱。