-
-
[分享]虚拟存储器、置换算法、局部性原理和抖动
-
发表于: 2小时前 47
-
AI模型:Deepseek
仅供参考
Let's Go!
=======================我是分割线=================================
虚拟存储器:
严格说,前四种主要是实存管理方式,后三种(页式、段式、段页式)常用于实现虚拟存储器。按你的分类,举应用实例简要说明:
1. 单一连续分区
应用实例:MS-DOS。内存分系统区和用户区,一次只运行一个程序,如 DOS 下运行 edit.com 或早期游戏。
2. 固定分区
应用实例:IBM OS/360 MFT。内存预先分成若干固定大小分区,可同时装入多道作业,如银行批处理作业按分区大小排队装入。
3. 可变分区
应用实例:IBM OS/360 MVT。按作业实际大小动态划分内存,如作业需 200KB 就分 200KB,释放后留下空洞。
4. 可重定位分区
应用实例:OS/360 MVT 的内存紧凑。当空闲区太碎无法装入新作业时,系统移动已装入作业,合并出连续大空闲区再装入。
5. 页式
应用实例:Windows 虚拟内存。程序分页,物理内存分页框,页表映射;物理内存不够时,把不常用页换出到 pagefile.sys。
6. 段式
应用实例:16 位 DOS 的 CS:IP 寻址。程序按代码段、数据段、栈段分段,段表记录基址和长度,逻辑地址由“段号+偏移”组成。
7. 段页式
应用实例:32 位 Windows/Linux 在 x86 上的内存管理。先按段选择子找到段,再通过页目录、页表映射到物理页框,兼顾逻辑分段和页式离散分配。
总结:单一连续、固定、可变、可重定位主要用于早期实存管理;页式、段式、段页式是现代虚拟存储器的常见实现方式。
=======================我是分割线=================================
置换算法、局部性原理和控制抖动
这些概念在浏览器、手机、Windows 任务管理器、视频播放器、数据库里都很常见。举例如下:
一、置换算法
1. 最优算法(OPT)
淘汰未来最长时间不再用的页。理论上最优,但无法预知未来。
常见应用:作为基准,评估其他缓存/置换算法的好坏。比如数据库教学里,用已知查询序列计算“最少缺页次数”,看 LRU 差多少。实际系统不直接用。
2. 随机算法
随机选一个淘汰,简单但效果不稳定。
常见应用:Redis 缓存有 allkeys-random、volatile-random 淘汰策略;某些 CDN 边缘节点、代理缓存为了省事,随机踢掉旧内容。
3. 先进先出算法(FIFO)
淘汰最早进入的。
常见应用:监控录像循环覆盖,最早录的片段先被覆盖;聊天软件只保留最近 100 条消息,最早的先删;打印队列按提交顺序处理。
4. 最近最少使用算法(LRU)
淘汰最久没被访问的。
常见应用:
- Windows 内存管理用 Clock 算法近似 LRU。
- 手机后台:最近用过的 App 保留,很久没用的被杀死。
- 浏览器缓存、Redis、Memcached 常用 LRU 淘汰旧数据。
- 输入法:你刚打过的词排在前面,很久不用的词被挤下去。
二、局部性原理
1. 时间局部性
刚访问过的,很可能很快再次访问。
常见应用:
- 程序里的循环变量 i 被反复访问,CPU 缓存和内存页都保留它。
- 你在 Word 里反复改同一段文字,这段内容留在内存里。
- 输入法记住你刚打的词,下次优先显示。
2. 空间局部性
访问一个地址后,附近的地址很可能马上被访问。
常见应用:
- Excel 按行读单元格,读完 A1 很快读 B1、C1,系统预读相邻数据。
- 视频播放器顺序读文件,Windows 预读后面的数据,减少卡顿。
- 数组遍历:a[0]、a[1]、a[2] 连续访问,CPU 缓存一次取一整块。
三、控制抖动
1. 工作集
进程当前频繁访问的页面集合。
常见应用:
- 任务管理器“详细信息”里有“内存 - 工作集”。
- Photoshop 打开大图时工作集很大,Windows 尽量让它留在物理内存。
- 手机后台 App 工作集太大,系统会杀掉它,腾内存给前台。
2. 缺页率
缺页次数占总访问次数的比例。缺页率太高,说明内存不够,系统频繁读硬盘,产生抖动。
常见应用:
- 资源监视器“内存”里有“硬错误/秒”。
- 同时开太多程序,硬错误/秒飙升,磁盘占用 100%,鼠标卡顿,这就是抖动。
- 玩游戏时内存不足,频繁读硬盘,画面一卡一卡,也是抖动。
总结:
OPT、随机、FIFO、LRU 是缓存/页面淘汰策略;时间局部性和空间局部性解释了为什么缓存和预读有效;工作集和缺页率是判断系统是否抖动的关键指标。Windows、手机、浏览器、数据库里都能看到这些机制。