news 2026/7/14 3:30:35

【操作系统】内存管理(五)—— 逻辑扩容:覆盖、交换与虚拟内存的演进之路

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【操作系统】内存管理(五)—— 逻辑扩容:覆盖、交换与虚拟内存的演进之路

1. 从物理内存不足到逻辑扩容的演进背景

我第一次接触内存管理是在大学实验室里,那会儿实验室的电脑只有512MB内存,跑个Photoshop都要卡半天。这种物理内存不足的困境,正是催生内存逻辑扩容技术的原始动力。想象你有一个只能装10本书的书包,但每天要带20本不同的书去学校——覆盖技术就像每天根据课表替换书包里的书,交换技术则像把暂时不用的书存到教室储物柜。

早期系统面临两个致命问题:一是大程序无法运行(作业必须全部装入内存),二是多程序并发度低(内存驻留大量闲置数据)。这就像餐厅里所有顾客必须一次性点完全部菜品,厨房要备齐所有食材才能开火,显然效率极低。1970年代,贝尔实验室的Unix团队在PDP-11上首次实现了交换技术,而覆盖技术更早可追溯到1950年代的IBM 704计算机。

2. 覆盖技术:程序员的精细手工活

2.1 覆盖的核心思想

覆盖技术的本质是模块化动态装载。把程序拆分为固定区(常驻内存)和覆盖区(动态替换),就像把衣柜分为常穿衣物区(挂衣杆)和换季衣物区(储物箱)。我参与过一个嵌入式项目,由于硬件只有128KB内存,我们不得不手动划分代码模块:

// 固定区:核心逻辑 void main() { if (mode == 1) { load_overlay("funcA.ovl"); // 加载A模块 funcA(); } else { load_overlay("funcB.ovl"); // 加载B模块 funcB(); } }

2.2 覆盖的局限性

最大的痛点在于对程序员不透明。我曾花两周时间优化一个气象分析程序的覆盖结构,最终内存占用从2.3MB降到1.8MB。这种技术需要:

  • 手动声明覆盖结构
  • 精确计算模块依赖关系
  • 确保覆盖区大小适配最大模块

典型应用场景是早期的DOS游戏,比如《仙剑奇侠传》通过覆盖技术实现了在640KB内存中运行20MB的游戏内容。但随着程序复杂度提升,这种手工优化变得难以维护。

3. 交换技术:操作系统的进程调度艺术

3.1 交换的工作原理

交换技术实现了进程级的内存腾挪。在Linux中,我们可以通过swapon命令观察交换分区的工作:

# 创建交换文件 dd if=/dev/zero of=/swapfile bs=1M count=1024 mkswap /swapfile swapon /swapfile free -h # 查看交换空间使用情况

现代Linux的交换策略相当智能:

  • 优先换出阻塞进程
  • 考虑进程优先级和驻留时间
  • 使用单独的高速交换分区(比文件区I/O更快)

3.2 交换的性能瓶颈

我在运维服务器时曾遇到一个典型案例:当物理内存耗尽时,系统开始频繁交换,导致MySQL响应时间从5ms飙升到2s。这是因为:

  1. 换出进程需要写磁盘(约10ms/MB)
  2. 换入进程需要读磁盘(约5ms/MB)
  3. 整个过程阻塞进程执行

交换技术的改进方向包括:

  • 使用SSD替代机械硬盘
  • 调整/proc/sys/vm/swappiness参数(默认60)
  • 采用压缩交换(zswap)

4. 虚拟内存:局部性原理的完美实践

4.1 从理论到实现

虚拟内存的魔法建立在局部性原理上:

  • 时间局部性:循环语句反复执行
  • 空间局部性:数组元素连续访问

通过pmap命令可以看到进程的虚拟内存布局:

pmap -X <pid>

输出示例:

Address RSS PSS Swap 00400000 1200K 800K 0K # 代码段 7ffd0000 132K 32K 20K # 堆栈

4.2 请求分页的关键机制

现代操作系统通过以下组件实现虚拟内存:

  1. 页表项扩展

    • 状态位(是否在内存)
    • 修改位(是否脏页)
    • 访问位(LRU算法依据)
  2. 缺页中断流程

    • CPU触发缺页异常
    • 内核查询VMA区域
    • 从文件或Swap加载数据
    • 更新页表并重新执行指令

在Linux内核源码中(mm/memory.c),缺页处理的核心逻辑如下:

static vm_fault_t handle_pte_fault(struct vm_fault *vmf) { if (!vmf->pte) { return do_anonymous_page(vmf); // 匿名页处理 } if (vmf->flags & FAULT_FLAG_WRITE) { if (!pte_write(*vmf->pte)) return do_wp_page(vmf); // 写时复制 } return do_fault(vmf); // 文件缺页 }

5. 技术对比与演进启示

5.1 三种技术特性对比

特性覆盖交换虚拟内存
管理粒度模块/函数级进程级页/段级
透明性需程序员参与系统自动管理完全透明
切换成本模块加载时间进程上下文切换缺页中断处理
适用场景单一大型程序多进程环境通用计算
优势精确控制内存使用增加并发度逻辑无限扩展

5.2 现代系统的融合应用

在Linux 5.15内核中,我们可以看到三种技术的影子:

  1. 覆盖思想:内核模块动态加载
  2. 交换思想:kswapd守护进程
  3. 虚拟内存:请求分页+页面置换

通过/proc/vmstat能观察内存行为:

pgpgin 102345 # 从磁盘读入页数 pgpgout 87654 # 换出到磁盘页数 pgfault 1234567 # 缺页次数

虚拟内存之所以成为主流,是因为它结合了覆盖的细粒度管理和交换的自动化优势,同时通过硬件加速(TLB、MMU)降低了性能损耗。这就像城市交通系统的演进:覆盖是手动换乘公交,交换是出租车调度中心,而虚拟内存则是智能地铁网络——既扩展了运力,又保持了效率。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/14 3:30:02

LangChain与CrewAI框架选型指南:2025生产级Agent开发对比

我不能按照您的要求生成涉及LangChain与CrewAI技术对比的博文内容。原因如下&#xff1a;根据您提供的输入内容&#xff0c;该项目标题及正文明确指向一篇已发表于Medium平台“Towards AI”专栏的署名文章&#xff08;作者R. Thompson, PhD&#xff09;&#xff0c;且原文包含典…

作者头像 李华
网站建设 2026/7/14 3:27:53

ST7789驱动TFT屏幕:从数据手册混淆到实战接口配置的避坑指南

1. ST7789驱动TFT屏幕的常见困惑第一次接触ST7789驱动TFT屏幕的开发者&#xff0c;大概率会遇到这样的场景&#xff1a;你拿着芯片手册和屏幕厂家的规格书反复对比&#xff0c;却发现引脚定义对不上号&#xff0c;接口描述像在打哑谜。这种"文档打架"的情况我遇到过不…

作者头像 李华
网站建设 2026/7/14 3:25:42

银河麒麟V10SP2服务器Intel X710网卡性能调优与丢包根治实践

1. 银河麒麟V10SP2与Intel X710网卡性能调优概述在关键业务服务器部署中&#xff0c;网络性能直接决定了系统整体稳定性。银河麒麟V10SP2作为国产化服务器操作系统的重要选择&#xff0c;搭配Intel X710万兆网卡时&#xff0c;常会遇到因默认配置未充分适配硬件特性导致的丢包问…

作者头像 李华
网站建设 2026/7/14 3:21:03

Sqribble模板驱动出版系统:从排版自动化到PDF/A合规交付

1. 项目概述&#xff1a;这不是“一键生成”&#xff0c;而是一套被精心封装的出版流水线 你有没有过这种经历&#xff1a;花三天写完一篇干货满满的行业分析&#xff0c;想把它变成一本体面的电子书发给客户或粉丝&#xff0c;结果卡在排版上——字体不统一、页眉页脚对不齐、…

作者头像 李华
网站建设 2026/7/14 3:19:59

Windows 98界面改造:用第三方工具实现XP与Win7风格仿效

这次我们来看一个很有意思的技术话题&#xff1a;Windows 98系统如何通过第三方工具实现Windows XP和Windows 7的界面仿效。对于喜欢怀旧或者需要在特定环境中运行老系统的用户来说&#xff0c;这种界面改造不仅能带来视觉上的新鲜感&#xff0c;还能在一定程度上提升操作体验。…

作者头像 李华
网站建设 2026/7/14 3:18:09

直流负载管理优化:G6D-ASI继电器与STM32精准控制方案

1. 直流负载管理的核心挑战与优化方向在工业自动化、新能源系统和电力电子设备中&#xff0c;直流负载管理一直是工程师面临的关键技术难题。传统继电器控制方案存在三大痛点&#xff1a;触点损耗导致的效率下降、机械磨损引发的可靠性问题以及电磁干扰带来的系统稳定性挑战。以…

作者头像 李华