🌐 虚拟内存 (Virtual Memory)
🔹 概念
虚拟内存是一种内存管理技术,它为每个进程提供了一个连续且独立的地址空间,使程序员认为每个进程都独占整个内存空间,即使物理内存不足时也能继续执行。
虚拟内存的核心思想:
➡️ 将程序的逻辑地址空间(用户视角)映射到物理内存(硬件视角)上。
➡️ 使用硬盘作为扩展内存,将不活跃的数据暂时存储在硬盘上,按需加载到物理内存。
🧠 虚拟内存的优点
✅ 内存扩展:程序可使用比物理内存更大的地址空间;
✅ 内存保护:每个进程的虚拟地址空间是独立的,避免互相干扰;
✅ 内存共享:多个进程可以共享相同的代码或数据段;
✅ 加载灵活:只加载程序中需要的部分,提高内存利用率;
⚙️ 虚拟内存的核心机制
虚拟内存的实现依赖以下机制:
- 地址映射 (Address Mapping)
- 分页 (Paging)
- 分段 (Segmentation)
- 页面置换算法 (Page Replacement Algorithm)
- 缺页异常 (Page Fault)
- 内存映射文件 (Memory-Mapped Files)
📌 1. 地址映射 (Address Mapping)
- 逻辑地址 (Logical Address):程序员编写程序时使用的内存地址;
- 物理地址 (Physical Address):内存硬件上的实际地址;
- 页表 (Page Table):负责将逻辑地址映射为物理地址。
➤ 地址映射流程
- CPU 生成逻辑地址;
- MMU (Memory Management Unit) 通过页表将逻辑地址转换为物理地址;
- 若数据已在内存中,直接访问;否则触发缺页异常,从磁盘加载数据。
📌 2. 分页 (Paging)
🔹 分页原理
- 将虚拟内存和物理内存都划分成固定大小的页面 (Page) 和页框 (Frame);
- 每个页面在物理内存中都有对应的页框;
- 页表记录每个页面与页框的映射关系。
➤ 示意图
虚拟内存 物理内存
+--------+ +--------+
| Page 0 | ---> | Frame 5 |
| Page 1 | ---> | Frame 8 |
| Page 2 | ---> | Frame 3 |
+--------+ +--------+
➤ 地址结构
逻辑地址 = 页号 (Page Number) + 页内偏移 (Offset)
- 页号 → 查找页表,找到对应的页框;
- 页内偏移 → 在页框中定位具体数据;
➤ 示例
- 假设每页大小为 4KB (即 2¹² 字节),逻辑地址为
0x1234 - 页号 =
0x1(第1页) - 偏移 =
0x234(页内第 0x234 处)
📌 3. 分段 (Segmentation)
🔹 分段原理
- 将程序按功能划分成若干个段 (Segment),如代码段、数据段、堆栈段等;
- 每个段具有独立的基址 (Base) 和限长 (Limit);
➤ 示意图
虚拟内存 物理内存
+--------+ +--------+
| Code | ---> | 代码段 |
| Data | ---> | 数据段 |
| Stack | ---> | 堆栈段 |
+--------+ +--------+
➤ 地址结构
逻辑地址 = 段号 (Segment Number) + 段内偏移 (Offset)
📌 4. 页面置换算法 (Page Replacement Algorithm)
🔹 何时触发?
当物理内存已满且需要加载新页面时,操作系统必须选择某个页面淘汰,将其替换出内存。
🔹 常见置换算法
| 算法名称 | 原理 | 优势 | 劣势 |
|---|---|---|---|
| FIFO (先进先出) | 淘汰最早进入内存的页面 | 实现简单 | 可能淘汰热点数据 |
| LRU (最近最少使用) | 淘汰最长时间未使用的页面 | 效果较好 | 实现较复杂 |
| OPT (最佳置换) | 淘汰未来最长时间不使用的页面 | 最优性能 | 需预知未来数据 |
| CLOCK (时钟算法) | 基于访问位 (Reference Bit) 标志是否使用过 | 空间开销小 | 可能引发抖动 |
📌 5. 缺页异常 (Page Fault)
🔹 定义
当 CPU 访问的页面尚未加载到内存时,会触发缺页异常。操作系统会暂停当前进程并加载所需页面。
➤ 缺页处理流程
- CPU 访问内存,发现页面缺失;
- 操作系统触发缺页异常;
- 若有空闲页框,直接加载页面;
- 若无空闲页框,使用页面置换算法淘汰旧页面;
- 将新页面加载到内存并更新页表;
- 恢复进程执行。
📌 6. 内存映射文件 (Memory-Mapped Files)
🔹 定义
内存映射文件是一种将文件内容直接映射到虚拟内存空间的技术,避免频繁的 I/O 操作,提高性能。
➤ 应用场景
✅ 数据库系统;
✅ 多个进程共享同一份数据;
✅ 大型文件的快速访问;
➤ 示例代码 (C - mmap)
#include <stdio.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <unistd.h>
int main() {
int fd = open("data.txt", O_RDONLY);
char* data = mmap(NULL, 4096, PROT_READ, MAP_PRIVATE, fd, 0);
printf("文件内容:%s\n", data);
munmap(data, 4096);
close(fd);
return 0;
}
🔎 虚拟内存与物理内存的区别
| 特点 | 虚拟内存 | 物理内存 |
|---|---|---|
| 定义 | 程序运行时的逻辑地址空间 | 计算机的实际内存条 |
| 地址空间 | 每个进程独立,连续的虚拟地址 | 离散的物理地址 |
| 大小 | 通常远大于物理内存 | 受限于硬件配置 |
| 安全性 | 提供内存保护机制 | 无直接保护机制 |
🧩 总结
✅ 分页和分段是虚拟内存的两种主要实现方式;
✅ 页表在虚拟内存中起关键作用,负责地址映射;
✅ 页面置换算法决定缺页异常时替换哪些数据;
✅ 虚拟内存提升了内存利用率、系统稳定性,是现代操作系统的重要机制;
720

被折叠的 条评论
为什么被折叠?



