面试题答案
一键面试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操作)。
- 首先获取
- 使用三个信号量,一个信号量