面试题答案
一键面试设计思路
- 优先级分配:为每个进程分配一个优先级,优先级高的进程优先获得资源。优先级可以基于进程的类型(如系统进程优先级高于用户进程)、任务紧急程度等因素确定。
- 资源请求队列:每个资源类型都有一个请求队列,进程按照优先级顺序加入到相应资源的请求队列中。
- 安全状态检测:在分配资源前,检查系统是否处于安全状态,即是否存在一种资源分配序列,使得所有进程都能运行完成而不发生死锁。
- 预分配检查:当一个进程请求资源时,先假设分配资源给它,然后检查这种预分配是否会导致系统进入不安全状态。如果不会,则进行实际分配;否则,拒绝分配。
数据结构
- 进程结构体(Process):
pid
:进程ID。priority
:进程优先级。allocation
:已分配的资源向量,记录每个资源类型已分配给该进程的数量。max_need
:最大需求资源向量,记录每个进程对每种资源的最大需求量。need
:需求资源向量,need = max_need - allocation
,表示进程还需要的资源量。
- 资源结构体(Resource):
total
:该资源类型的总量。available
:当前可用的该资源数量。request_queue
:请求该资源的进程队列,按照优先级排序。
- 系统状态结构体(SystemState):
processes
:所有进程的数组。resources
:所有资源类型的数组。
关键实现步骤
- 初始化:
- 初始化每个资源的
total
和available
值。 - 初始化每个进程的
pid
、priority
、allocation
、max_need
值,并计算need
值。
- 初始化每个资源的
- 资源请求处理:
- 当一个进程
P
请求资源时,首先检查其need
向量是否小于等于当前可用资源向量available
。如果不满足,则拒绝请求,因为没有足够资源。 - 假设分配资源给进程
P
,即更新available
向量(available = available - request
),更新进程P
的allocation
向量(allocation = allocation + request
),并重新计算need
向量。 - 调用安全状态检测函数检查系统是否处于安全状态。如果安全,则实际分配资源;否则,撤销假设分配,拒绝请求。
- 当一个进程
- 安全状态检测:
- 创建一个工作向量
work
,初始化为available
。 - 创建一个布尔数组
finish
,初始化为false
,表示所有进程都未完成。 - 遍历所有进程,找到一个
finish[i] == false
且need[i] <= work
的进程i
。如果找到,则将work = work + allocation[i]
,并将finish[i] = true
。重复此步骤。 - 如果所有进程的
finish
值都为true
,则系统处于安全状态;否则,系统处于不安全状态。
- 创建一个工作向量
- 资源释放:
- 当一个进程完成任务释放资源时,更新相应资源的
available
向量(available = available + allocation[pid]
),并从所有资源的请求队列中移除该进程。
- 当一个进程完成任务释放资源时,更新相应资源的