C++实现高效的内存置换FIFO _ 队列管理与命中率测试【实战】

浅浩君_7960

浅浩君_7960

2026-04-13

459人浏览

原创

不能只用 std::queue 实现 FIFO 页面置换,因其不支持查找,无法高效判断页面是否命中;需配合 std::unordered_set 维护页集合以实现 O(1) 命中检测,并同步更新队列与集合。

c++实现高效的内存置换fifo _ 队列管理与命中率测试【实战】

直接用 std::queue 模拟 FIFO 页面置换是可行的,但**不能只靠它完成命中判断和淘汰逻辑**——因为 std::queue 不支持遍历或查找,你每次访问页面时无法快速知道它是否已在内存中。

为什么不能只用 std::queue 做 FIFO 置换

FIFO 的核心动作有两步:1)查页是否在内存里;2)若不在且内存满,则弹出队首、插入新页。但 std::queue 只提供 front()、back()、push()、pop(),没有 find() 或迭代器暴露机制。

  • 如果你每次查命中都把整个队列倒出来再塞回去,时间复杂度是 O(n),实测在 320 次访问 + 3 物理块下会慢 5–8 倍
  • std::queue 底层默认是 std::deque,虽支持随机访问,但接口被封装掉了,强行转型或访问内部容器属于未定义行为
  • 很多教学代码用 vector + 手动维护头尾索引,看似“不用 STL”,实则更易越界、难调试

推荐组合:std::queue + std::unordered_set

用 std::queue 维护页面进入顺序,用 std::unordered_set 维护当前内存中的页号集合——两者同步更新,查命中只需 O(1) 平均时间。

  • 插入新页时:queue.push(page) + set.insert(page)
  • 淘汰页时:int victim = queue.front(); queue.pop(); set.erase(victim)
  • 查命中:if (set.find(page) != set.end()),比遍历数组快一个数量级
  • 注意:std::unordered_set 要求页号类型可哈希,int 默认支持,无需额外操作

命中率计算容易漏掉的边界

命中率不是简单用「命中次数 / 总访问次数」,必须明确「缺页中断」才触发计数,而「命中」不改变物理块内容,也不计入缺页。

C++14
C++14

C++14 对 C++11 的修正与增强版本,适合旧系统维护和较老工具链兼容。

下载
  • 初始时物理块为空,第一次访问任何页都必然缺页,此时要先加载、再计数
  • 如果物理块大小为 0(极端输入),所有访问都缺页,但程序应提前报错而非崩溃
  • 测试序列含重复相邻页(如 0 0 0),第二个及之后的 0 是命中,但部分实现因忘记清空中间状态误判为缺页
  • 输出缺页率时建议用 printf("%.2f%%", 100.0 * cnt_miss / n),避免整数除法截断(如 5/13 直接得 0)

完整可运行的最小 FIFO 实现要点

以下逻辑足够跑通标准测试用例(如访问串 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1,块数=3):

  • 输入前先校验物理块数 m > 0 且访问序列非空
  • 用 std::queue 存驻留页顺序,std::unordered_set 存驻留页集合
  • 遍历每个访问页:if (set.count(page)) → 命中;否则 → 缺页,检查 queue.size() 决定是否淘汰
  • 淘汰时必须同时从 queue 和 set 移除同一页面,顺序不能颠倒(先 erase 再 pop 会导致 set 残留)
  • 最后输出缺页次数、缺页率、命中率三个值,别只打一个

真正卡住人的从来不是算法思想,而是 set 和 queue 同步时机、空块处理、浮点输出精度这三处细节。

C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!

相关文章

PHP速学视频免费教程(入门到精通)
PHP速学视频免费教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

c++

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

相关专题

更多
counta和count的区别
counta和count的区别

Count函数用于计算指定范围内数字的个数,而CountA函数用于计算指定范围内非空单元格的个数。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2023.11.20

3448

5

printf用法大全
printf用法大全

php中文网为大家提供printf用法大全,以及其他printf函数的相关文章、相关下载资源以及各种相关课程,供大家免费下载体验。

2023.06.20

848

5

fprintf和printf的区别
fprintf和printf的区别

fprintf和printf的区别在于输出的目标不同,printf输出到标准输出流,而fprintf输出到指定的文件流。根据需要选择合适的函数来进行输出操作。更多关于fprintf和printf的相关文章详情请看本专题下面的文章。php中文网欢迎大家前来学习。

2023.11.28

1029

10

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

2023.08.02

6799

3

int占多少字节
int占多少字节

int占4个字节,意味着一个int变量可以存储范围在-2,147,483,648到2,147,483,647之间的整数值,在某些情况下也可能是2个字节或8个字节,int是一种常用的数据类型,用于表示整数,需要根据具体情况选择合适的数据类型,以确保程序的正确性和性能。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

2024.08.29

3265

6

c++怎么把double转成int
c++怎么把double转成int

本专题整合了 c++ double相关教程,阅读专题下面的文章了解更多详细内容。

2025.08.29

4248

10

C++中int的含义
C++中int的含义

本专题整合了C++中int相关内容,阅读专题下面的文章了解更多详细内容。

2025.08.29

2885

10

硬盘接口类型介绍
硬盘接口类型介绍

硬盘接口类型有IDE、SATA、SCSI、Fibre Channel、USB、eSATA、mSATA、PCIe等等。详细介绍:1、IDE接口是一种并行接口,主要用于连接硬盘和光驱等设备,它主要有两种类型:ATA和ATAPI,IDE接口已经逐渐被SATA接口;2、SATA接口是一种串行接口,相较于IDE接口,它具有更高的传输速度、更低的功耗和更小的体积;3、SCSI接口等等。

2023.10.19

3188

3

PHP接口编写教程
PHP接口编写教程

本专题整合了PHP接口编写教程,阅读专题下面的文章了解更多详细内容。

2025.10.17

5109

12

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C++ Core Guidelines
C++ Core Guidelines

共0课时 | 0人学习

C++ Reference
C++ Reference

共0课时 | 0人学习

C++ 官方标准说明
C++ 官方标准说明

共0课时 | 0人学习