应同步维护队列与驻留集合:用std::queue记录顺序、std::unordered_set(或vector)判断存在性,所有增删操作必须原子对齐,避免状态不一致导致命中误判、缺页虚高或淘汰错乱。

如果您在C++中实现FIFO页面置换算法时发现命中率统计异常、缺页次数虚高或淘汰行为错乱,则很可能是由于仅依赖std::queue而未同步维护驻留状态所致。以下是解决此问题的步骤:
一、同步使用std::queue与std::unordered_set
该方法通过双结构协同保障O(1)命中判断与严格顺序淘汰:队列管理入队时序,哈希集合维护当前驻留页集合,二者所有插入、删除操作必须原子对齐,否则将导致页存在性误判。
1、声明两个核心容器:std::queue
2、每次访问页号page前,先执行 if (inMemory.find(page) != inMemory.end()) 判断命中,命中则跳过后续操作。
3、若未命中,先递增缺页计数器pageFaults++,再检查内存是否已满:if (pageQueue.size() == frameCount)。
4、若满,则取出队首页int victim = pageQueue.front();,执行 pageQueue.pop(); inMemory.erase(victim); 严格同步清除。
5、最后将新页推入队列并加入集合:pageQueue.push(page); inMemory.insert(page);。
二、采用循环数组配合cur指针模拟FIFO队列
该方法避免STL动态分配开销,适用于嵌入式或性能敏感场景;关键在于cur仅在缺页且内存满时更新,并始终约束于物理块数范围内,否则将导致淘汰位置漂移或越界写入。
1、定义固定大小内存帧数组:std::vector
2、声明淘汰指针 int cur = 0;,注意其含义是“下次应覆盖的位置”,而非“当前最老页索引”。
3、访问页page未命中且frames已满时,执行 int victim = frames[cur]; 获取待淘汰页。
4、将新页写入frames[cur]后,立即更新指针:cur = (cur + 1) % frameCount;,确保下标始终合法。
5、为支持命中判断,仍需独立维护std::unordered_set<int> inMemory</int>,并在每次装入/淘汰后同步insert()或erase()。
三、使用std::vector替代哈希集合进行驻留标记
当页号范围有限且连续(如0~999)时,该方法以空间换时间,用布尔向量直接映射页号存在性,避免哈希冲突与内存分配,查询与更新均为O(1)且无额外开销。
1、预分配标记向量:std::vectormaxPageId为页号最大值。
2、页page命中判断简化为:if (isResident[page]),无需迭代或哈希计算。
3、装入新页时,设 isResident[page] = true;;淘汰旧页victim时,立即将 isResident[victim] = false;。
4、注意:该方案要求页号为非负整数且范围可控,若页号稀疏或极大(如超过1e6),将造成显著内存浪费。
四、封装独立内存快照结构用于状态输出
该方法解决std::queue无法遍历的问题,使每次访问后能准确打印当前内存中实际驻留的页集合,避免因队列单向性导致的显示失真。
1、声明辅助容器:std::vector
2、每次成功装入或置换后,清空currentFrames,然后遍历inMemory集合(或扫描isResident向量),将所有true对应页号填入该向量。
3、为保持FIFO语义下的可读性,可对currentFrames按入队时间排序——但需额外维护时间戳或依赖pageQueue重建顺序。
4、输出时直接打印currentFrames内容,例如:cout 后接各元素及分隔符,"]\n";。
五、校验命中率分母为总访问次数
该步骤防止因跳过初始化阶段或去重统计导致的数学定义错误;操作系统规范明确缺页率=缺页次数/总页面访问次数,分母必须等于输入序列长度,不可裁剪或变换。
1、在程序起始处记录访问序列总长度:const size_t totalAccesses = pageReferences.size();。
2、命中率计算严格写作:double hitRate = static_cast
3、禁止使用pageFaults / (totalAccesses - pageFaults)、hits / validAccesses或任何剔除前m次访问的变体表达式。
4、对序列{7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1}(共17项),分母必须为17,无论前3次是否填满内存。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











