[{"data":1,"prerenderedAt":392},["ShallowReactive",2],{"note:cs\u002Fos\u002Fnote\u002Fchap8":3,"site-search-catalogue":391},{"id":4,"title":5,"body":6,"description":364,"extension":383,"meta":384,"navigation":386,"path":387,"seo":388,"stem":389,"__hash__":390},"notes\u002Fsource\u002Fcs\u002Fos\u002Fnote\u002Fchap8.md","Chap. 8 Note",{"type":7,"value":8,"toc":363},"minimark",[9,14,17,22,26,31,73,77,107,109,113,116,119,122,188,191,205,209,247,249,253,256,260,263,289,293,307,311,346,348,352],[10,11,13],"h1",{"id":12},"chap8-虚拟内存-virtual-memory","Chap.8  虚拟内存 (Virtual Memory)",[15,16],"hr",{},[18,19,21],"h2",{"id":20},"_81-硬件和控制结构-hardware-and-control-structures","8.1 硬件和控制结构 (Hardware and Control Structures)",[23,24,25],"p",{},"虚拟内存的实现是硬件（如MMU）和操作系统软件共同配合的奇迹。",[27,28,30],"h3",{"id":29},"核心概念核对-concept-check","核心概念核对 (Concept Check)",[32,33,34,42,48],"ul",{},[35,36,37,41],"li",{},[38,39,40],"strong",{},"虚拟内存 (Virtual Memory):"," 一种存储分配方案，允许将辅助存储器（如磁盘）作为主存来寻址。虚拟大小受限于计算机的地址方案和磁盘空间，而非实际的物理内存。",[35,43,44,47],{},[38,45,46],{},"局部性原理 (Principle of Locality):"," 算法利用局部性原理，预测哪些驻留页面在不久的将来最不可能被访问，从而将它们换出。局部性分为空间局部性和时间局部性。",[35,49,50,53],{},[38,51,52],{},"页表项控制位 (Page Table Entry Bits):",[32,54,55,61,67],{},[35,56,57,60],{},[38,58,59],{},"页框号 (Frame number):"," 标识主存中页面的顺序编号。",[35,62,63,66],{},[38,64,65],{},"存在位 (Present\u002FValid bit):"," 指示该页当前是否在主存中。",[35,68,69,72],{},[38,70,71],{},"修改位 (Modify\u002FDirty bit):"," 指示该页自装入主存后是否被修改过。如果没有修改过，置换时就不需要将其写回磁盘。",[27,74,76],{"id":75},"底层逻辑剖析-the-why","底层逻辑剖析 (The 'Why')",[32,78,79,85,91,101],{},[35,80,81,84],{},[38,82,83],{},"为什么要用转换后备缓冲区 (TLB)?","\n每次虚拟地址转换都需要访问内存中的页表，导致访存时间翻倍。TLB 是一个专用的高速缓存，保存了最近使用的页表项。其目的是在绝大多数情况下，避免去磁盘或主存中检索页表项，极大提升地址转换速度。",[35,86,87,90],{},[38,88,89],{},"为什么要设计多级页表 (Multilevel Page Tables)?","\n对于巨大的虚拟地址空间（例如 32 位或 64 位），单级页表会占用极其庞大的连续物理内存。多级页表允许页表本身也被分页并存放在虚拟内存中，只将顶层目录（Root page table）常驻主存。",[35,92,93,96,97,100],{},[38,94,95],{},"反置页表 (Inverted Page Table) 的意义是什么?","\n传统页表大小与虚拟地址空间成正比，而反置页表的大小",[38,98,99],{},"与物理内存成正比","。它利用哈希表映射，每个物理页框只对应一个页表项。页表项通常包含：页号、进程标识符、控制位和用于解决哈希冲突的链指针。",[35,102,103,106],{},[38,104,105],{},"为什么要结合分页和分段 (Combined Paging and Segmentation)?","\n分页对程序员透明，消除了外部碎片；而分段对程序员可见，支持不断增长的数据结构、模块化、共享和保护。段页式结合方案中，进程拥有一个段表，而每个段拥有自己的页表。",[15,108],{},[18,110,112],{"id":111},"_82-操作系统软件-operating-system-software","8.2 操作系统软件 (Operating System Software)",[23,114,115],{},"操作系统需要制定一系列策略来管理虚拟内存，以最小化缺页中断（Page Fault）带来的巨大开销。",[27,117,30],{"id":118},"核心概念核对-concept-check-1",[23,120,121],{},"操作系统的虚拟内存策略主要包含以下六个方面：",[123,124,125,145,151,157,163,182],"ol",{},[35,126,127,130,131],{},[38,128,129],{},"读取策略 (Fetch Policy):"," 决定何时将页面调入主存。\n",[32,132,133,139],{},[35,134,135,138],{},[38,136,137],{},"请求分页 (Demand Paging):"," 只有当访问到该页某个位置而发生缺页时，才将其调入主存。",[35,140,141,144],{},[38,142,143],{},"预分页 (Prepaging):"," 除了引发缺页的页面，还会将预期可能用到的其他页面一并调入。",[35,146,147,150],{},[38,148,149],{},"放置策略 (Placement Policy):"," 决定页面放在哪个物理框（主要在NUMA架构中重要）。",[35,152,153,156],{},[38,154,155],{},"置换策略 (Replacement Policy):"," 决定淘汰哪个页面。常见算法包括 OPT, LRU, FIFO, Clock。",[35,158,159,162],{},[38,160,161],{},"驻留集管理 (Resident Set Management):"," 决定分配给进程多少个页框，以及置换范围。",[35,164,165,168],{},[38,166,167],{},"清除策略 (Cleaning Policy):",[32,169,170,176],{},[35,171,172,175],{},[38,173,174],{},"请求清除 (Demand Cleaning):"," 只有当页面被选中替换时才写回磁盘。",[35,177,178,181],{},[38,179,180],{},"预清除 (Precleaning):"," 在页面框被需要之前，将修改过的页面成批写回磁盘。",[35,183,184,187],{},[38,185,186],{},"负载控制 (Load Control):"," 决定系统多道程序度，防止抖动。",[27,189,76],{"id":190},"底层逻辑剖析-the-why-1",[32,192,193,199],{},[35,194,195,198],{},[38,196,197],{},"为什么 Clock 算法比 LRU 更实用？","\n真正的 LRU (最近最久未使用) 算法需要为每次内存访问记录时间戳或维护链表，硬件开销极大。Clock (时钟) 策略通过“使用位 (Use bit)”来近似 LRU：当发生置换时，指针扫描环形缓冲区，跳过使用位为 1 的页（将其置 0），替换掉遇到第一个使用位为 0 的页。",[35,200,201,204],{},[38,202,203],{},"局部置换与全局置换 (Local vs. Global Replacement):","\n固定分配策略要求分配给进程的页框数固定，因此发生缺页时，只能替换该进程自己的页面（局部置换）。",[27,206,208],{"id":207},"常见易错点-common-pitfalls","常见易错点 (Common Pitfalls)",[32,210,211,221,241],{},[35,212,213,216,217,220],{},[38,214,215],{},"Belady 异常 (Belady's Anomaly):"," 学生常认为分配给进程的物理页框越多，缺页率一定越低。但在 ",[38,218,219],{},"FIFO 置换算法"," 中，增加页框数有时反而会导致更多的缺页传输，这就是著名的 Belady 异常。",[35,222,223,226],{},[38,224,225],{},"驻留集 (Resident Set) vs 工作集 (Working Set):",[32,227,228,235],{},[35,229,230,234],{},[231,232,233],"em",{},"驻留集"," 指的是一个进程当前实际存在于主存中的页面集合。",[35,236,237,240],{},[231,238,239],{},"工作集"," 指的是一个进程在最近一段时间内被引用过的页面集合。系统应当试图让驻留集包含工作集，以降低缺页率。",[35,242,243,246],{},[38,244,245],{},"抖动 (Thrashing):"," 这不是硬件故障！抖动是指在虚拟内存机制中，处理器将大部分时间耗费在换入换出页面上，而不是执行指令上的系统过载现象。通常因为多道程序度过高、进程分配的页框不足以覆盖其局部性引发。",[15,248],{},[18,250,252],{"id":251},"_83-86-具体操作系统的内存管理","8.3 - 8.6 具体操作系统的内存管理",[23,254,255],{},"不同的操作系统在实现虚拟内存时有各自的特色结构。",[27,257,259],{"id":258},"_1-unix-和-solaris-内存管理","1. UNIX 和 Solaris 内存管理",[23,261,262],{},"UNIX SVR4 采用了四个关键数据结构来管理分页：",[32,264,265,271,277,283],{},[35,266,267,270],{},[38,268,269],{},"页表项 (Page Table Entry):"," 包含页框号、年龄、修改位、访问位、存在位等。",[35,272,273,276],{},[38,274,275],{},"磁盘块描述符 (Disk Block Descriptor):"," 记录页面在交换设备（Swap device）上的逻辑设备号和块号。",[35,278,279,282],{},[38,280,281],{},"页框数据表项 (Page Frame Data Table Entry):"," 描述物理页框的状态和引用计数。",[35,284,285,288],{},[38,286,287],{},"交换使用表项 (Swap-Use Table Entry):"," 记录交换设备页面的使用计数。",[27,290,292],{"id":291},"_2-linux-内存管理","2. Linux 内存管理",[32,294,295,301],{},[35,296,297,300],{},[38,298,299],{},"四级页表结构:"," 为了保持平台独立性并支持大地址空间，Linux 将虚拟地址分为四个字段：页目录 (Page Directory) 索引、页中间目录 (Page Middle Directory) 索引、页表 (Page Table) 索引，以及偏移量。",[35,302,303,306],{},[38,304,305],{},"页大小:"," 基础单位通常是 4KB，但也支持大页（Hugepages，如 2MB），后者可以显著减少 TLB 访问次数从而提高性能。",[27,308,310],{"id":309},"_3-windows-内存管理","3. Windows 内存管理",[32,312,313],{},[35,314,315,318,319],{},[38,316,317],{},"32位默认虚拟地址映射:"," Windows 为正常的 32 位用户进程提供了 4GB 的虚拟地址空间，默认划分为四个区域：\n",[123,320,321,328,334,340],{},[35,322,323,327],{},[324,325,326],"code",{},"0x00000000 - 0x0000FFFF"," (64KB): NULL 指针分配区，不可访问，用于捕获空指针错误。",[35,329,330,333],{},[324,331,332],{},"0x00010000 - 0x7FFEFFFF"," (~2GB): 用户可用地址空间。",[35,335,336,339],{},[324,337,338],{},"0x7FFF0000 - 0x7FFFFFFF"," (64KB): 保护页（Guard page），不可访问，用于检查指针越界。",[35,341,342,345],{},[324,343,344],{},"0x80000000 - 0xFFFFFFFF"," (2GB): 操作系统内核专属区域，用户态不可访问。",[15,347],{},[18,349,351],{"id":350},"总结-summary","总结 (Summary)",[23,353,354,355,358,359,362],{},"虚拟内存不仅让程序员摆脱了主存容量的物理限制，更通过分页、分段硬件与复杂的页面调度算法（置换策略、驻留集管理等），在**性能（时间和缺页率）",[38,356,357],{},"与","空间（内存利用率）**之间实现了极其微妙的平衡。理解本章的核心在于牢记 ",[38,360,361],{},"“局部性原理 (Locality)”"," 以及如何用最少的开销（如 TLB、Clock 算法）去逼近完美的预测。",{"title":364,"searchDepth":365,"depth":365,"links":366},"",2,[367,372,377,382],{"id":20,"depth":365,"text":21,"children":368},[369,371],{"id":29,"depth":370,"text":30},3,{"id":75,"depth":370,"text":76},{"id":111,"depth":365,"text":112,"children":373},[374,375,376],{"id":118,"depth":370,"text":30},{"id":190,"depth":370,"text":76},{"id":207,"depth":370,"text":208},{"id":251,"depth":365,"text":252,"children":378},[379,380,381],{"id":258,"depth":370,"text":259},{"id":291,"depth":370,"text":292},{"id":309,"depth":370,"text":310},{"id":350,"depth":365,"text":351},"md",{"order":385},8,true,"\u002Fsource\u002Fcs\u002Fos\u002Fnote\u002Fchap8",{"title":5,"description":364},"source\u002Fcs\u002Fos\u002Fnote\u002Fchap8","IaYgg7Ojwxeu_ckNyYAaeOawmi_eBUvIMIfRYbtlIyM",null,1784032891972]