《深入理解计算机系统》虚拟存储器

📅 2026/7/15 21:20:19
《深入理解计算机系统》虚拟存储器
《深入理解计算机系统》CSAPP的**第 9 章虚拟存储器Virtual Memory, VM**是全书的巅峰章节之一。它结合了之前学过的硬件缓存、内存、软件链接、加载和操作系统进程、异常控制流知识构建了一个统一、高效且安全的内存抽象模型。1. 物理寻址 vs 虚拟寻址物理寻址早期计算机直接使用物理地址访问主存。缺点是多任务难以隔离程序重定位困难。虚拟寻址CPU 生成虚拟地址VA通过内存管理单元MMU转换为物理地址PA再访问主存。核心优势缓存主存将磁盘作为主存的缓存利用局部性。内存管理简化每个进程拥有独立的线性地址空间无需关心物理内存碎片。内存保护防止进程访问其他进程或内核的数据。2. 地址翻译Address Translation这是 VM 的硬件基础。MMU 利用存储在内存中的**页表Page Table**进行地址转换。分页机制Paging页Page虚拟内存块通常 4KB。页框Page Frame物理内存块。页表项PTE, Page Table Entry包含一个有效位Valid Bit和一个物理页框号PPN。Valid 1页面在物理内存中。Valid 0页面不在物理内存中可能在磁盘上或未分配。多级页表为了节省空间现代系统使用多级页表。如果某一级页表项无效则不需要分配下一级页表的空间。这利用了程序地址空间的稀疏性。TLBTranslation Lookaside Buffer作用MMU 内部的高速缓存缓存最近使用的 PTE。命中直接获取 PPN速度极快。缺失需要访问内存中的页表可能引发缺页异常。3. 缺页异常Page Faults当 CPU 访问一个 Valid0 的页面时会触发缺页异常Page Fault。这是 VM 魔法发生的地方。处理流程MMU 触发异常控制权交给内核的缺页异常处理程序。内核确定缺失的页面在磁盘上的位置交换区或可执行文件映射区。内核选择一个牺牲页Victim Page。如果牺牲页被修改过脏页需先写回磁盘。从磁盘读取缺失页到物理内存的一个空闲页框中。更新页表将该 PTE 标记为 Valid并指向新的物理页框。重新执行导致缺页的那条指令此时 TLB 和页表已更新访问成功。关键点对应用程序而言缺页处理是透明的只是感觉访问变慢了。4. 内存映射Memory MappingLinux 将虚拟存储器组织为一系列区域Area每个区域对应一个连续的虚拟地址区间具有特定的权限读/写/执行。mmap函数私有映射Private Mapping用于匿名内存如malloc分配的大块内存或复制写Copy-on-Write, COW的文件映射。修改不会写回文件而是创建新副本。共享映射Shared Mapping用于共享库.so/.dll或进程间通信。修改会反映到文件中其他映射该文件的进程可见。动态链接与 VM共享库通过 VM 映射到进程的地址空间。多个进程可以共享同一份物理内存中的库代码极大地节省了内存。5. 动态内存分配Dynamic Memory Allocation用户程序通过malloc和free管理堆Heap。堆的结构堆是一个运行时数据结构由一系列**块Block**组成。块可以是已分配Allocated或空闲Free。维护空闲块的链表隐式链表或显式链表。常见问题碎片化Fragmentation内部碎片块内未使用的空间由于对齐或最小块大小限制。外部碎片空闲块总和足够但没有单个连续的空闲块满足请求。内存泄漏Memory Leak分配了内存但忘记释放导致可用内存逐渐减少。悬垂指针Dangling Pointer释放了内存但仍保留指向它的指针再次访问会导致不可预测的行为通常通过填充毒值如0xDEADBEEF来调试。垃圾回收Garbage Collection, GC自动管理内存的技术。Mark-and-Sweep标记-清除基于根集合寄存器、全局变量、栈遍历可达对象标记后清除未标记对象。引用计数每个对象记录被引用的次数归零时释放无法处理循环引用。6. 综合示例fork和execve中的 VMfork()传统做法复制整个地址空间开销大。现代做法Copy-on-Write父子进程共享相同的物理页页表项标记为只读。只有当任一进程尝试写入时才触发缺页异常内核此时才复制该页。execve()删除当前进程的现有用户级 VM 区域。为新的可执行文件和共享库创建新的 VM 区域。初始化栈和堆。7. 本章核心实验Malloc Lab你需要实现自己的malloc,free, 和realloc。目标最大化吞吐量Throughput和空间利用率Utilization。挑战如何快速找到合适的空闲块最佳适配、首次适配、分离空闲链表等。如何合并相邻的空闲块以减少外部碎片。如何处理边界情况如请求大小为 0或释放空指针。总结虚拟存储器是计算机系统中最重要的抽象之一它统一了内存和磁盘的管理通过分页和缺页机制。简化了编程模型每个进程拥有独立的、连续的地址空间。提供了保护机制通过页表权限位。支持高效的共享通过内存映射和共享库。理解 VM 对于编写高性能、低内存占用且无内存错误的程序至关重要。