面试题答案
一键面试预防死锁的策略
- 破坏死锁的四个必要条件:
- 互斥条件:使资源可共享使用,但有些资源本身特性决定无法避免互斥,如打印机。
- 占有并等待条件:进程必须一次性申请所有需要的资源,在资源未满足前不占有任何资源。例如,一个任务需要资源A和资源B,它必须先申请A和B都成功后才能开始使用,而不是先占有A再等待B。
- 不可剥夺条件:允许系统剥夺某些进程已占有的资源给其他更需要的进程。例如,高优先级任务可以剥夺低优先级任务占有的资源。
- 循环等待条件:对资源进行排序,进程只能按照递增顺序申请资源。比如,资源A、B、C排序后,进程只能先申请A,再申请B,最后申请C,不能逆向申请。
- 资源分配图算法:通过对资源分配图进行算法分析,判断是否存在死锁环,从而避免死锁。
以破坏占有并等待条件为例的实际代码实现
以下以C语言在嵌入式系统中为例,假设有两个资源(Resource1和Resource2),一个任务Task1需要这两个资源:
#include <stdio.h>
#include <stdbool.h>
// 模拟资源
bool Resource1 = true;
bool Resource2 = true;
// 申请资源函数
bool requestResources() {
if (Resource1 && Resource2) {
Resource1 = false;
Resource2 = false;
return true;
}
return false;
}
// 释放资源函数
void releaseResources() {
Resource1 = true;
Resource2 = true;
}
int main() {
if (requestResources()) {
// 任务执行代码
printf("任务获取到资源,开始执行\n");
// 任务执行完毕
releaseResources();
} else {
printf("任务未能获取到资源,无法执行\n");
}
return 0;
}
在上述代码中,requestResources
函数会一次性尝试获取两个资源,如果都获取成功则返回true
,任务可以执行;否则返回false
,任务不能执行,这样就避免了占有并等待的情况,从而预防死锁。任务执行完毕后通过releaseResources
函数释放资源。