[{"data":1,"prerenderedAt":345},["ShallowReactive",2],{"note:cs\u002Fos\u002Fnote\u002Fchap7":3,"site-search-catalogue":344},{"id":4,"title":5,"body":6,"description":320,"extension":336,"meta":337,"navigation":339,"path":340,"seo":341,"stem":342,"__hash__":343},"notes\u002Fsource\u002Fcs\u002Fos\u002Fnote\u002Fchap7.md","Chap. 7 Note",{"type":7,"value":8,"toc":319},"minimark",[9,14,19,23,52,56,59,79,83,86,91,94,108,112,115,137,141,144,195,199,207,211,226,230,233,276,280,283],[10,11,13],"h1",{"id":12},"chap7-内存管理-memory-management","Chap7. 内存管理 (Memory Management)",[15,16,18],"h2",{"id":17},"_1-内存管理的核心基础","1. 内存管理的核心基础",[20,21,22],"p",{},"在多道程序设计系统（Multiprogramming system）中，主内存（Main memory）必须被合理地划分和管理。",[24,25,26,34,40,46],"ul",{},[27,28,29,33],"li",{},[30,31,32],"strong",{},"内存管理 (Memory Management) 的定义","：由操作系统自动完成的、在操作系统与用户进程之间划分和分配内存空间的任务被称为内存管理。",[27,35,36,39],{},[30,37,38],{},"内存管理满足的系统需求","：内存管理机制需要满足多种系统层面的需求，主要包括保护（Protection）、重定位（Relocation）以及物理组织（Physical organization）等。",[27,41,42,45],{},[30,43,44],{},"重定位 (Relocation)","：这是内存管理中的一项重要任务，指的是为了支持交换（Swapping）操作，将进程映像（Process image）在内存的不同区域之间进行移动的过程。",[27,47,48,51],{},[30,49,50],{},"覆盖技术 (Overlaying)","：这是一种程序和数据的组织实践，通过这种方式，可以将程序的不同模块分配到内存的同一个区域中，从而节省空间。",[15,53,55],{"id":54},"_2-内存地址的分类","2. 内存地址的分类",[20,57,58],{},"理解内存地址的区别是学习内存管理的关键前提。",[24,60,61,67,73],{},[27,62,63,66],{},[30,64,65],{},"逻辑地址 (Logical Address)","：指对内存位置的引用，这种引用是独立于当前数据在内存中的实际物理分配的。物理内存地址绝不能与逻辑地址混淆。",[27,68,69,72],{},[30,70,71],{},"绝对地址 (Absolute Address)","：指代主内存中真实存在的、实际的物理存储位置。",[27,74,75,78],{},[30,76,77],{},"相对地址 (Relative Address)","：使用相对地址的程序通常是通过动态运行时加载（Dynamic run-time loading）机制被加载到内存中的。",[15,80,82],{"id":81},"_3-内存分区技术-partitioning-techniques","3. 内存分区技术 (Partitioning Techniques)",[20,84,85],{},"早期的内存管理主要通过对内存进行分区来实现。了解它们的缺陷（尤其是“碎片”问题）有助于理解现代内存管理技术的演进。",[87,88,90],"h3",{"id":89},"_31-碎片化问题-fragmentation","3.1 碎片化问题 (Fragmentation)",[20,92,93],{},"在讲解具体技术前，必须先理清两种“内存浪费”的现象：",[24,95,96,102],{},[27,97,98,101],{},[30,99,100],{},"内部碎片 (Internal Fragmentation)","：当加载到分区中的数据块小于该分区的大小时，分区内部会产生未被使用的浪费空间，这种现象称为内部碎片。",[27,103,104,107],{},[30,105,106],{},"外部碎片 (External Fragmentation)","：在内存分配过程中，现有分区之外产生的、由于太小而无法被利用的空闲内存块，这种现象称为外部碎片。",[87,109,111],{"id":110},"_32-固定分区-fixed-partitioning","3.2 固定分区 (Fixed Partitioning)",[20,113,114],{},"这是一种很大程度上已经被淘汰的早期技术。",[24,116,117,127],{},[27,118,119,122,123,126],{},[30,120,121],{},"主要问题","：固定分区面临着三大问题：只允许固定数量的进程运行、内存使用效率低下，以及严重的",[30,124,125],{},"内部碎片","问题。固定分区的主要问题并非外部碎片。",[27,128,129,132,133,136],{},[30,130,131],{},"优化方案","：为了减轻固定分区带来的内部碎片问题，系统可以采用",[30,134,135],{},"大小不等的分区 (Unequal size partitions)"," 策略。",[87,138,140],{"id":139},"_33-动态分区-dynamic-partitioning","3.3 动态分区 (Dynamic Partitioning)",[20,142,143],{},"动态分区根据进程的实际需要为其分配确切大小的内存。",[24,145,146,155,165],{},[27,147,148,150,151,154],{},[30,149,121],{},"：动态分区技术会导致",[30,152,153],{},"外部碎片","的产生。",[27,156,157,160,161,164],{},[30,158,159],{},"解决方案","：使用",[30,162,163],{},"压缩技术 (Compaction)","。压缩是指将所有进程移动到连续的内存块中，从而将所有空闲的内存聚合汇总成一个单一的大空闲块。",[27,166,167,170,171],{},[30,168,169],{},"放置算法 (Placement Algorithms)","：当有新进程需要载入时，系统需要决定将其放入哪个空闲块中。\n",[24,172,173,183,189],{},[27,174,175,178,179,182],{},[30,176,177],{},"最佳适应算法 (Best-fit)","：选择大小最接近请求大小的空闲块。注意：最佳适应算法通常",[30,180,181],{},"不是","可用算法中性能最好的，因为它会产生大量微小的外部碎片。",[27,184,185,188],{},[30,186,187],{},"首次适应算法 (First-fit)","：该算法并非从上一次放置的位置开始扫描，而是通常从头开始扫描内存，寻找第一个足够大的空闲块。",[27,190,191,194],{},[30,192,193],{},"下次适应算法 (Next-fit)","：从上一次放置发生的位置开始扫描内存，并选择下一个足够满足请求的可用空闲块。",[87,196,198],{"id":197},"_34-伙伴系统-buddy-system","3.4 伙伴系统 (Buddy System)",[24,200,201],{},[27,202,203,206],{},[30,204,205],{},"概念","：伙伴系统是一种结合了固定分区和动态分区（可变分区）两者特点的方案，它是克服这两种方案各自缺点的合理折中选择。",[15,208,210],{"id":209},"_4-现代内存管理技术分页与分段-paging-segmentation","4. 现代内存管理技术：分页与分段 (Paging & Segmentation)",[20,212,213,214,217,218,221,222,225],{},"在几乎所有现代的多道程序设计系统中，内存都是通过一种极其复杂的、被称为",[30,215,216],{},"虚拟内存 (Virtual Memory)"," 的技术来进行管理的。虚拟内存的概念建立在两种基本技术的基础之上（或二者兼有）：",[30,219,220],{},"分段 (Segmentation)"," 和 ",[30,223,224],{},"分页 (Paging)","。",[87,227,229],{"id":228},"_41-分页系统-paging","4.1 分页系统 (Paging)",[20,231,232],{},"分页系统将进程和内存都划分为大小固定且相等的块。",[24,234,235,249,263],{},[27,236,237,240,241,244,245,248],{},[30,238,239],{},"核心概念","：进程的块被称为",[30,242,243],{},"页 (Pages)","，而可用内存的块被称为",[30,246,247],{},"帧 (Frames)","。在分配时，进程的页会被分配到主存中可用的帧里。",[27,250,251,254,255,258,259,262],{},[30,252,253],{},"页表 (Page Table)","：系统会为每个进程维护一个页表。页表的作用是记录进程中每一个",[30,256,257],{},"页 (Page)"," 所对应的物理",[30,260,261],{},"帧 (Frame)"," 的位置。",[27,264,265,268,269,271,272,275],{},[30,266,267],{},"碎片情况","：采用分页策略的系统会遭受轻微的",[30,270,125],{},"（通常发生在进程的最后一页），但",[30,273,274],{},"完全没有外部碎片","。系统浪费的空间主要是由内部碎片引起的。",[87,277,279],{"id":278},"_42-分段系统-segmentation","4.2 分段系统 (Segmentation)",[20,281,282],{},"分段系统根据程序的逻辑结构（如函数、对象等）将其划分为不同的部分。",[24,284,285,298,307],{},[27,286,287,289,290,293,294,297],{},[30,288,239],{},"：在分段系统中，程序及其相关数据被划分为若干个",[30,291,292],{},"段 (Segments)","。关键点在于，这些段的长度",[30,295,296],{},"不需要","相等（即不必大小一致）。",[27,299,300,303,304,225],{},[30,301,302],{},"段表 (Segment Table)","：分段系统利用段表来工作，段表提供了每个对应段在主内存中的",[30,305,306],{},"起始地址 (Starting address)",[27,308,309,311,312,314,315,318],{},[30,310,267],{},"：与分页系统相反，采用分段策略的系统会遭受轻微的",[30,313,153],{},"，但",[30,316,317],{},"完全没有内部碎片","。在分段系统中，被浪费的内存空间主要是由于外部碎片导致的。",{"title":320,"searchDepth":321,"depth":321,"links":322},"",2,[323,324,325,332],{"id":17,"depth":321,"text":18},{"id":54,"depth":321,"text":55},{"id":81,"depth":321,"text":82,"children":326},[327,329,330,331],{"id":89,"depth":328,"text":90},3,{"id":110,"depth":328,"text":111},{"id":139,"depth":328,"text":140},{"id":197,"depth":328,"text":198},{"id":209,"depth":321,"text":210,"children":333},[334,335],{"id":228,"depth":328,"text":229},{"id":278,"depth":328,"text":279},"md",{"order":338},7,true,"\u002Fsource\u002Fcs\u002Fos\u002Fnote\u002Fchap7",{"title":5,"description":320},"source\u002Fcs\u002Fos\u002Fnote\u002Fchap7","xqSIws7O7fOO_SWWI7GQjqlzqv1bSxRqzOqFtiODuSo",null,1784032891963]