You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

操作系统课程作业:基于信号量的加油站进程同步伪代码实现需求

加油站资源同步的信号量解决方案(伪代码)

没问题,我帮你设计这个基于信号量的同步方案,先把核心约束理清楚,再给出伪代码和详细解释:

核心约束回顾

  • 最多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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.22 08:52:36