需实现C++多级反馈队列调度器:Task含id、arrival_time、burst_time、used_cpu、remaining_cpu(初始化为burst_time且仅递减)、priority、queue_entry_time、is_done;用vector表示N级就绪队列(0最高),queue模拟I/O队列;任务按arrival_time排序后逐个加入就绪队列;调度过程支持时间片轮转、优先级动态升降、队列迁移与I/O阻塞,最终输出各任务完成时间、周转时间、响应时间。

你需要在C++中模拟一个多级反馈队列(MLFQ)调度器,支持任务动态优先级升降、时间片轮转、队列迁移和I/O阻塞行为,最终输出每个任务的完成时间、周转时间与响应时间。
定义任务结构体与队列容器
创建Task类,包含id、到达时间、所需CPU时间、已用CPU时间、剩余CPU时间、当前优先级、进入当前队列的时间戳、是否已完成等字段;使用vector
注意:当前优先级必须是可变整数,不能用const或enum固定;【剩余CPU时间必须初始化为所需CPU时间,且后续只通过减法更新,不可重置或赋值为其他来源】。
初始化任务并按到达时间排序
读入任务列表(例如从标准输入或数组硬编码),每项含arrival_time、burst_time;将所有任务存入vector 这一步操作起来很简单,直接把文件拖进去就行。但若未排序,会导致“尚未到达的任务被提前插入就绪队列”,整个模拟时序崩溃。 维护全局clock变量,初始为0;设置最大队列级数level_count = 3,各级时间片分别为time_slice[0]=4, time_slice[1]=8, time_slice[2]=16;使用bool all_done标志跟踪是否全部完成。 步骤一:检查是否有新任务在当前clock到达 → 若有,将其插入第0级队列尾部。 步骤二:遍历所有就绪队列(从0到level_count−1),找到第一个非空队列;取出该队列头部任务task。 步骤三:执行task一个时间片(min(task.remaining_burst, time_slice[task.priority])),clock增加对应时长;task.used_burst += 执行时长;task.remaining_burst -= 执行时长。 步骤四:若task.remaining_burst == 0 → 标记completed=true,记录finish_time = clock,转入统计阶段;否则,若task在当前队列未用完时间片(即发生I/O中断或主动让出)→ 将task.priority提升一级(但不超过level_count−1),重置其进入时间戳,并插入下一级队列尾部;若已用完本级时间片仍未完成 → 保持priority不变,插入同级队列尾部(实现轮转)。 步骤五:检查I/O队列,将所有wait_time
方法一:在任务执行过程中,按概率触发I/O请求(例如每执行2~5个时间单位,随机生成一次I/O事件);触发后,记录当前clock + 预设I/O延迟(如10),构造新Task副本(仅修改id为原id+"_io"、arrival_time=触发时刻+延迟、burst_time=0、is_io_block=true),加入I/O等待队列。 方法二:更贴近真实场景——任务自带I/O描述符,例如vector 注意:I/O事件一旦触发,原始task必须从就绪队列中彻底移除,否则会重复调度;【未移除就继续执行,将导致同一任务被多次计时,周转时间严重失真】。 对每个completed任务,计算周转时间 = finish_time − arrival_time,响应时间 = 第一次获得CPU时间 − arrival_time(需在首次出队时记录);打印每项任务的id、arrival_time、burst_time、finish_time、turnaround_time、response_time。 最后输出平均周转时间与平均响应时间,保留两位小数。实现MLFQ核心调度循环
处理I/O阻塞逻辑
输出调度结果统计
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











