操作系统课程作业:基于信号量的加油站进程同步伪代码实现需求
加油站资源同步的信号量解决方案(伪代码)
没问题,我帮你设计这个基于信号量的同步方案,先把核心约束理清楚,再给出伪代码和详细解释:
核心约束回顾
- 最多N辆车同时使用加油泵(加油泵是有限资源)
- 车辆加油前必须满足:有可用泵、储油罐油量足够、油罐车未在补油
- 油罐车仅能在无任何车辆加油时,将储油罐补满至最大容量M
全局共享状态与信号量定义
首先定义需要共享的状态变量和同步用的信号量:
// 全局共享状态 int storage_tank = M; // 储油罐当前油量,初始为满容量M int active_pumps = 0; // 统计当前正在使用的加油泵数量 // 信号量集合 semaphore fuel_mutex = 1; // 互斥锁:保护储油罐油量的读写操作 semaphore pump_mutex = 1; // 互斥锁:保护active_pumps变量的更新 semaphore refuel_pumps = N; // 计数信号量:控制可用加油泵数量(初始值为N) semaphore tank_refuel_turn = 1; // 互斥锁:确保同一时间只有一辆油罐车补油 semaphore vehicle_entry = 1; // 互斥锁:控制车辆是否可以进入加油流程(油罐车补油时锁定)
车辆加油进程伪代码
每辆车的加油流程需要严格遵循准入条件,确保资源访问的安全性:
Process Vehicle(required_fuel): while True: // 第一步:获取进入加油区的权限(确保油罐车没在补油) P(vehicle_entry) // 第二步:申请可用的加油泵 P(refuel_pumps) // 更新正在使用的泵数量 P(pump_mutex) active_pumps += 1 V(pump_mutex) // 第三步:检查储油量是否足够 P(fuel_mutex) if storage_tank >= required_fuel: // 油量充足,扣除所需油量 storage_tank -= required_fuel print(f"Vehicle starts refueling: needs {required_fuel}L, tank now has {storage_tank}L") V(fuel_mutex) // 模拟加油的耗时操作(比如车辆加油的时间) sleep(random_refuel_duration) // 加油完成,释放资源 P(pump_mutex) active_pumps -= 1 V(pump_mutex) V(refuel_pumps) print("Vehicle finished refueling") V(vehicle_entry) break // 完成加油,退出循环 else: // 油量不足,回滚已占用的资源 V(fuel_mutex) P(pump_mutex) active_pumps -= 1 V(pump_mutex) V(refuel_pumps) V(vehicle_entry) // 等待油罐车补油完成后再重试 wait_on_tank_refill() // 可通过条件变量实现唤醒逻辑
油罐车补油进程伪代码
油罐车需要确保无车辆加油时才能补油,补满后唤醒等待的车辆:
Process TankTruck(): while True: // 确保同一时间只有一辆油罐车进行补油操作 P(tank_refuel_turn) // 禁止新车辆进入加油流程 P(vehicle_entry) // 等待所有正在加油的车辆完成(确保无车辆使用加油泵) while True: P(pump_mutex) if active_pumps == 0: V(pump_mutex) break else: V(pump_mutex) sleep(1) // 短暂等待后再次检查 // 开始补油,将储油罐加满至最大容量M P(fuel_mutex) storage_tank = M print(f"Tank truck finished refilling: tank is now full ({M}L)") V(fuel_mutex) // 唤醒所有等待加油的车辆 wake_all_waiting_vehicles() // 对应车辆进程中的wait_on_tank_refill // 允许车辆再次进入加油流程 V(vehicle_entry) // 释放油罐车补油的锁,让其他油罐车可以补油 V(tank_refuel_turn) // 油罐车离开,前往下一次补油的地点(模拟间隔时间) sleep(long_refill_interval)
关键设计说明
refuel_pumps:计数信号量直接控制加油泵的并发使用数量,确保最多N辆车同时加油。fuel_mutex:避免多个进程同时修改储油罐油量,防止数据不一致问题。vehicle_entry:作为加油流程的“大门”,油罐车补油时会锁死这个信号量,禁止新车辆进入,同时等待已有车辆完成加油。active_pumps+pump_mutex:解决信号量无法直接读取值的问题,准确统计当前使用的加油泵数量,确保油罐车补油时无车辆正在加油。
内容的提问来源于stack exchange,提问作者Alopex
相关产品推荐
相关产品推荐

