MST

星途 面试题库

面试题:并发与同步:信号量在进程同步中的常见应用场景及原理

请举例说明信号量在进程同步中有哪些常见的应用场景,并详细阐述信号量在这些场景下是如何工作以实现进程同步的。
10.9万 热度难度
操作系统并发与同步

知识考点

AI 面试

面试题答案

一键面试

1. 资源访问控制场景

  • 应用场景举例:假设有一个打印机,多个进程可能都需要使用它进行打印任务。打印机作为一种共享资源,同一时间只能被一个进程使用。
  • 工作原理
    • 初始化一个信号量,其值为1,表示打印机初始状态为可用。
    • 当一个进程想要使用打印机时,它首先尝试获取信号量(如使用P操作)。如果信号量的值大于0,获取成功,信号量值减1,此时该进程可以使用打印机。
    • 其他进程在尝试获取信号量时,由于信号量值已为0,获取失败,这些进程会被阻塞,进入等待队列。
    • 当正在使用打印机的进程使用完毕后,释放信号量(如使用V操作),信号量值加1。此时等待队列中的一个进程会被唤醒,获取信号量并使用打印机。

2. 生产者 - 消费者场景

  • 应用场景举例:在一个生产 - 消费系统中,生产者进程不断生产数据并放入缓冲区,消费者进程从缓冲区取出数据进行处理。
  • 工作原理
    • 需要两个信号量,一个用于表示缓冲区是否有空闲空间,初始值为缓冲区的大小,记为empty;另一个用于表示缓冲区是否有数据,初始值为0,记为full
    • 生产者进程
      • 生产数据后,首先获取empty信号量(P操作),如果empty值大于0,获取成功,empty值减1,表示缓冲区有一个位置被占用。
      • 然后将数据放入缓冲区。
      • 最后释放full信号量(V操作),full值加1,表示缓冲区有新的数据。
    • 消费者进程
      • 首先获取full信号量(P操作),如果full值大于0,获取成功,full值减1,表示要从缓冲区取走一个数据。
      • 从缓冲区取出数据。
      • 最后释放empty信号量(V操作),empty值加1,表示缓冲区有了空闲位置。

3. 读者 - 写者场景

  • 应用场景举例:多个进程对共享数据进行读写操作,允许多个读者同时读取数据,但不允许写者和其他进程(读者或写者)同时访问数据。
  • 工作原理
    • 使用三个信号量,一个信号量mutex用于保护共享数据,初始值为1;一个信号量wrt用于控制写操作,初始值为1;一个整型变量readcount用于记录当前正在读的进程数,初始值为0。
    • 读者进程
      • 首先获取mutex信号量(P操作),对readcount进行操作。如果readcount为0,获取wrt信号量(P操作),防止写者同时操作数据。
      • readcount加1,然后释放mutex信号量(V操作)。
      • 进行读操作。
      • 读操作完成后,再次获取mutex信号量(P操作),readcount减1。如果readcount变为0,释放wrt信号量(V操作),允许写者操作数据。最后释放mutex信号量(V操作)。
    • 写者进程
      • 首先获取wrt信号量(P操作),防止其他进程(读者或写者)同时访问数据。
      • 进行写操作。
      • 写操作完成后,释放wrt信号量(V操作)。