第三章 内存管理 - 第二节 内存分配与管理技术详解
概述
内存管理是操作系统中极其重要的组成部分,直接关系到计算机系统的运行效率和稳定性。本节内容主要讲解内存分配的基本策略与技术,包括连续内存分配、分段管理、分页管理以及现代内存管理的相关机制。通过本节的学习,考生能够系统掌握不同内存分配方法的工作原理、优缺点及应用场景,并能够结合实例理解内存管理在实际操作系统中的实现方式。
学习目标:
- 理解内存分配的基本概念及其重要性
- 掌握连续分配、分段和分页三种主要分配方式
- 了解内存碎片及其产生原因,学习解决方案
- 通过案例分析,加深对内存管理技术的理解和应用
核心概念
内存分配
内存分配是操作系统为进程分配物理内存空间的过程,确保进程能够正常执行并有效使用内存资源。
连续内存分配
将一块连续的内存空间分配给一个进程,简单但容易产生碎片。
分段管理
将程序逻辑划分成若干段(如代码段、数据段、堆栈段),每段连续分配,方便共享和保护。
分页管理
将内存划分为固定大小的页框,进程地址空间划分为页,实现非连续分配,解决碎片问题。
内存碎片
- 外部碎片:可用内存空间被分割成小块,无法满足较大内存请求。
- 内部碎片:由于分配的内存块大于实际需求,多余部分未被利用。
页表
用于记录虚拟页面与物理页面的对应关系,是分页管理的核心数据结构。
地址转换
将虚拟地址转换为物理地址的过程,包括段表和页表的查找。
原理分析
连续内存分配原理
连续内存分配要求为每个进程分配一块连续的物理内存空间。操作系统维护一个空闲内存链表或位图,寻找合适大小的连续空闲块。分配后,更新空闲列表。该方法简单,但当多次分配和释放后,会产生外部碎片,导致内存利用率降低。
分段管理原理
分段管理根据程序的逻辑结构,把程序分为若干段。每段有基址和长度,存放于段表中。程序访问时,先通过段号查段表,获得基址和界限,完成地址转换。分段实现了逻辑上的分离,方便保护和共享,但仍可能产生外部碎片。
分页管理原理
分页将内存划分为固定大小的页框,避免了外部碎片。虚拟地址分为页号和页内偏移,通过页表映射到物理内存。分页支持非连续分配,内存利用率高。缺点是页表管理复杂,且存在一定的内部碎片。
地址转换机制
虚拟地址转换为物理地址的过程包括:
- 取得虚拟地址的页号和页内偏移。
- 查找页表获得相应的物理页框号。
- 将页框号与页内偏移组合形成物理地址。
现代操作系统利用**快表(TLB)**来缓存页表条目,加快地址转换速度。
详细内容
1. 连续内存分配策略
连续分配是操作系统最早采用的内存管理方式,其核心思想是将一块连续的内存分配给进程。常见分配算法包括:
- 首次适应算法(First Fit):从头开始搜索空闲链表,找到第一个足够大的空闲块分配。
- 最佳适应算法(Best Fit):搜索整个空闲链表,找到最小的足够大块分配,减少浪费。
- 最差适应算法(Worst Fit):分配最大空闲块,意图留下较大空闲块,延缓碎片形成。
优缺点分析:
- 优点:实现简单,寻址方便。
- 缺点:易产生外部碎片,影响内存利用率。
2. 分段管理技术
分段管理将程序划分为多个逻辑段,例如代码段、数据段、堆和栈。每个段拥有独立的基址和长度,操作系统维护一个段表记录这些信息。
具体机制:
- 虚拟地址由段号和段内偏移组成。
- 访问时,通过段号查段表,获得基址和段长。
- 检查段内偏移是否越界。
- 若合法,物理地址 = 基址 + 偏移。
优势:
- 符合程序结构,方便保护和共享。
- 可以动态扩展段。
不足:
- 仍存在外部碎片。
- 管理复杂。
3. 分页管理技术
分页通过将内存和程序地址空间划分为固定大小的页和页框,完全消除外部碎片。
详细过程:
- 虚拟地址分为页号和页内偏移。
- 页号用作索引查找页表。
- 页表中存放页框号和状态位。
- 物理地址由页框号和页内偏移组成。
优化措施:
- 多级页表:减少页表大小,节省内存。
- 快表(TLB):缓存最近使用的页表条目,提升访问速度。
分页的缺点:
- 内部碎片问题。
- 额外的页表开销。
4. 内存碎片及其解决方案
- 外部碎片:通过内存重定位、紧缩(compact)等方式解决,但开销较大。
- 内部碎片:分页管理能有效避免外部碎片,但存在内部碎片。
操作系统设计时需权衡碎片问题和管理复杂性,采用合适的内存分配策略。
实例分析
实例一:首次适应算法的连续内存分配
背景:系统中有若干空闲内存块,进程请求100KB内存。
分析:操作系统从空闲链表头开始查找,找到第一个大于等于100KB的空闲块。假设找到150KB块,分配100KB,剩余50KB重新挂入空闲链表。
结论:首次适应算法简单,但可能导致碎片分布不均。
实例二:分段管理中的地址转换
背景:进程A有代码段基址2000,长度1000;数据段基址4000,长度500。访问虚拟地址(代码段,偏移300)。
分析:
- 查找段表,代码段基址2000。
- 偏移300未越界。
- 物理地址 = 2000 + 300 = 2300。
结论:分段管理将逻辑地址转换为物理地址,实现内存保护。
实例三:分页管理中页表查找
背景:虚拟地址32位,页大小4KB,页号20位,页内偏移12位。某进程访问虚拟地址0x00023004。
分析:
- 页号 = 0x00023 = 35。
- 页内偏移 = 0x004 = 4。
- 通过页表找到页框号为100。
- 物理地址 = (100 * 4KB) + 4。
结论:分页管理实现非连续内存分配,提高内存利用率。
常见误区
认为连续内存分配没有碎片问题
- 正确:连续分配经常产生外部碎片,影响分配效率。
分段和分页是同一内存管理方式
- 正确:分段和分页是两种不同的机制,前者按逻辑划分,后者按固定大小划分。
页表中的所有页表项都常驻内存
- 正确:大多数操作系统采用多级页表或按需加载,部分页表项存储在磁盘。
内部碎片只存在于连续分配中
- 正确:内部碎片主要存在于分页管理中,因为页大小固定。
分页能完全解决内存碎片问题
- 正确:分页消除了外部碎片,但仍存在内部碎片。
应用场景
- 多道程序设计:通过内存管理合理分配内存,提高CPU利用率。
- 虚拟内存实现:基于分页技术,实现大于物理内存的虚拟地址空间。
- 操作系统内存保护:利用分段和分页实现进程间内存隔离,保证安全。
- 嵌入式系统内存管理:根据系统特点选择合适的内存分配策略。
- 云计算资源调度:动态分配和回收内存资源,保证多租户性能。
知识拓展
- 虚拟内存机制:分页结合换页技术,实现按需调入内存,扩展可用内存。
- 多级页表结构:减少页表占用内存,提高效率。
- 段页式管理:结合分段和分页优点,提升灵活性和效率。
- 内存保护和权限管理:通过段表和页表的权限位实现访问控制。
- 内存紧缩技术:减少外部碎片的技术手段及其实现。
总结回顾
本节介绍了操作系统内存管理中的核心技术——内存分配策略。首先,连续内存分配方法简单易实现,但易产生外部碎片。分段管理按程序逻辑划分内存,方便保护和共享,但仍有外部碎片问题。分页管理通过固定大小的页框实现非连续分配,极大提高内存利用率,消除外部碎片,但带来内部碎片和页表管理开销。
理解内存碎片的产生及解决方案,有助于掌握内存管理的设计权衡。典型实例加深了对各策略工作原理的理解。掌握这些内容,对通过考试和实际系统设计均有重要意义。