MST

星途 面试题库

面试题:并发与同步之生产者消费者模型问题

在操作系统中,生产者 - 消费者模型是经典的并发同步场景。请描述如何使用信号量来实现生产者 - 消费者模型,并且说明信号量的取值及含义。
36.1万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试
  1. 实现步骤
    • 定义信号量
      • 通常需要两个信号量,一个用于表示缓冲区中的空闲槽位,命名为empty;另一个用于表示缓冲区中的已占用槽位,命名为full。还可能需要一个互斥信号量mutex来保护对共享缓冲区的访问。
    • 生产者代码
      • 生产者首先等待empty信号量,若empty的值大于0,则将其值减1,意味着占用一个空闲槽位。
      • 然后获取mutex信号量,以确保对共享缓冲区的安全访问。
      • 向共享缓冲区写入数据。
      • 释放mutex信号量。
      • 最后发出full信号量,将full的值加1,表示缓冲区有新的数据可供消费。
    • 消费者代码
      • 消费者首先等待full信号量,若full的值大于0,则将其值减1,意味着占用一个已占用槽位。
      • 然后获取mutex信号量,以确保对共享缓冲区的安全访问。
      • 从共享缓冲区读取数据。
      • 释放mutex信号量。
      • 最后发出empty信号量,将empty的值加1,表示缓冲区有了空闲槽位。
  2. 信号量取值及含义
    • empty信号量
      • 初始值为共享缓冲区的大小n,表示缓冲区中的空闲槽位数量。其值的变化反映了缓冲区中空闲位置的情况,每次生产者向缓冲区写入数据前,empty的值减1;每次消费者从缓冲区读取数据后,empty的值加1。
    • full信号量
      • 初始值为0,表示缓冲区中已占用槽位数量。其值的变化反映了缓冲区中数据的情况,每次生产者向缓冲区写入数据后,full的值加1;每次消费者从缓冲区读取数据前,full的值减1。
    • mutex信号量
      • 初始值为1,它是一个二元信号量(取值为0或1),用于保护共享缓冲区的互斥访问。当一个线程获取mutex(值变为0)时,其他线程就不能再获取,直到该线程释放mutex(值变为1)。