面试题答案
一键面试可能导致死锁的场景
- 生产者和消费者对信号量获取顺序不一致:
- 假设生产者在获取资源信号量(例如表示缓冲区有空闲位置的信号量)之前先获取互斥信号量,而消费者在获取数据信号量(例如表示缓冲区有数据的信号量)之前也先获取互斥信号量。
- 生产者获取了互斥信号量,准备获取资源信号量,但此时资源信号量不足(缓冲区已满),生产者等待。
- 消费者获取了互斥信号量,准备获取数据信号量,但此时数据信号量不足(缓冲区为空),消费者等待。
- 由于双方都持有互斥信号量且都在等待对方释放相应的资源或数据信号量,从而形成死锁。
- 信号量计数设置不合理:
- 如果表示缓冲区空闲位置的信号量初始值为0,且生产者在未对其进行正确初始化(例如未通过某种机制增加其计数)的情况下,就尝试获取该信号量,同时消费者也在等待获取表示缓冲区有数据的信号量(初始值也可能设置错误为0)。
- 生产者等待空闲位置信号量,消费者等待数据信号量,而两者都没有办法继续执行以改变信号量状态,导致死锁。
死锁发生时系统资源的占用情况
- 互斥资源:
- 互斥信号量被生产者或消费者持有,导致其他进程无法进入临界区(如对共享缓冲区的操作区域)。例如,若生产者持有互斥信号量,消费者就不能访问共享缓冲区以取数据;反之,若消费者持有互斥信号量,生产者就不能访问共享缓冲区以放数据。
- 资源信号量:
- 表示缓冲区空闲位置的资源信号量可能因为计数不合理(如上述计数为0且未改变),使得生产者一直等待获取该信号量以放入数据,而缓冲区中的数据由于消费者无法获取数据信号量(可能也因计数不合理为0)而不能被取走,导致缓冲区资源一直处于僵持状态,无法有效利用。
- 数据信号量:
- 表示缓冲区有数据的信号量同样可能因为计数问题,使得消费者等待获取该信号量以取出数据,而生产者又因无法放入新数据(由于资源信号量问题),造成数据资源在缓冲区中无法流动,占用缓冲区空间却不能被处理。