面试题答案
一键面试信号量机制原理
信号量是一个整型变量,它通过一个计数器来控制对共享资源的访问。信号量的值表示当前可用的共享资源数量。当进程需要访问共享资源时,它尝试获取信号量(即减少计数器的值)。如果计数器的值大于0,则获取成功,进程可以继续执行;如果计数器的值为0,则获取失败,进程将被阻塞,直到其他进程释放信号量(增加计数器的值)。
使用信号量解决进程间同步和互斥问题 - 生产者 - 消费者模型示例
- 初始化信号量:
- 假设有两个信号量,一个是
empty
,表示缓冲区中的空闲位置,初始值为缓冲区大小n
。 - 另一个是
full
,表示缓冲区中的已占用位置,初始值为0。 - 还需要一个互斥信号量
mutex
,用于保证对缓冲区的互斥访问,初始值为1。
- 假设有两个信号量,一个是
- 生产者代码示例(伪代码):
while (true) {
// 生产数据
produce_data();
// 获取empty信号量,表示获取一个空闲缓冲区位置
wait(empty);
// 获取互斥锁,确保对缓冲区的互斥访问
wait(mutex);
// 将数据放入缓冲区
put_data_to_buffer();
// 释放互斥锁
signal(mutex);
// 释放full信号量,表示缓冲区有新数据
signal(full);
}
- 消费者代码示例(伪代码):
while (true) {
// 获取full信号量,表示获取一个有数据的缓冲区位置
wait(full);
// 获取互斥锁,确保对缓冲区的互斥访问
wait(mutex);
// 从缓冲区取出数据
get_data_from_buffer();
// 释放互斥锁
signal(mutex);
// 释放empty信号量,表示缓冲区有空闲位置
signal(empty);
// 消费数据
consume_data();
}
在生产者 - 消费者模型中,empty
和full
信号量实现了生产者和消费者之间的同步,确保生产者不会在缓冲区满时继续生产,消费者不会在缓冲区空时消费。而mutex
信号量解决了对共享缓冲区的互斥访问问题,避免多个进程同时访问缓冲区导致数据混乱。