【操作系统笔记】OS_内存管理_非连续内存分配(04)
Page content
这一篇整理了操作系统的内存管理_非连续内存分配
相关的内容。
1.非连续内存的分配方式
- 分段(Segmentation)
- 分页(Paging)
- 分表(Page Table)
2.使用非连续内存分配的原因
2.1 连续分配的缺点
- 分配给程序的物理内存必须连续
- 内存利用率较低
- 有外碎片,内碎片的问题
2.2 非连续分配的优点
- 一个程序的物理地址空间是非连续的
- 更好的内存利用和管理
- 允许共享代码与数据(共享库等…)
- 支持动态加载和动态链接
2.3 非连续分配的缺点
- 如何建立虚拟地址和物理地址之间的转换:软件方案和硬件方案
2.4 两种硬件方案
- 分段
- 分页
3.分段
为了更好的分离和共享
- 程序的分段地址空间
- 分段寻址方案
段访问机制
一个段表示一个内存“快”:一个逻辑地址空间
段访问:逻辑地址由二元组(s,addr)表示
- s – 段号
- addr – 段内偏移
4.分页
页帧(帧,物理页面,Frame, Page Frame)
把物理地址空间划分为大小相同的基本分配单位
大小是2的n次方, 如512,4096, 8192
页面(页,逻辑页面,Page)
把逻辑地址空间也划分为相同大小的基本分配单位
大小是2的n次方, 如512,4096, 8192
帧和页的大小必须是相同的
页面到叶帧
逻辑地址到物理地址的转换
- 页表
- MMU/TLB
4.1 帧(Frame)
- 物理内存被划分成大小相同的帧内存物理地址的表示:二元组(f,o)
- f – 帧号(F位,共有2^f个帧)
- o – 帧内偏移(S位,每帧有2^s字节)
物理地址 = f * 2^s + o
基于页帧的物理地址计算实例
16-bit的地址空间
9-bit(512byte)大小的页帧
物理地址计算
物理地址表示 = (3, 6)
物理地址 = 2^s*f + o
F = 7 S = 9 f = 3 o = 6
实际物理地址 = 2^9 * 3 = 6 = 1536 + 6 = 1542
4.2 页
一个程序的逻辑地址空间被划分为大小相等的页
页内偏移大小 = 帧内偏移大小
页号大小 != 帧号大小
一个逻辑地址是一个二元组(P, O)
P – 页号(P位, 2^p个页) O – 页内偏移(S位,每页有2^S字节)
虚拟地址 = P * 2^s + O
页的寻址机制
- 页映射到帧
- 页是连续的虚拟内存
- 帧是非连续的物理内存
- 不是所有的页都有对应的帧
5.页表
5.1 页表概述
分页机制的性能问题
- 访问一个内存单元需要2次内存访问
- 一次用于获取页表项
- 一次用于访问数据
- 页表可能非常大
- 如何处理?
- 缓存(Caching)
- 间接(Indirection)访问
5.2 转换后备缓冲区(TLB)
5.3 二级/多级 页表
5.4 反向页表
5.4.1 大地址空间问题
对于大地址空间 (64-bits)系统,多级页表变得繁琐
- 比如:5级页表
不是让页表与逻辑地址空间的大小相对应,而是让页表与物理地址空间的大小相对应
- 逻辑(虚拟)地址空间增长速度快于物理地址空间
5.4.2 页寄存器
优点
- 转换表的大小相对于物理内存来说很小
- 转换表的大小跟逻辑地址空间大小无关
缺点
- 需要的信息对调了,即根据帧号可找到页号
- 如何转换回来?即根据页号找到帧号
- 在需要再反向页表中搜索想要的页号
5.4.3 基于关联内存方案
在反向页表中搜索一个页对应的帧号
- 如果帧数较少,页寄存器可以被防止在关联内存中
- 在关联内存中查找逻辑页号
成功:帧号被读取, 失败:页错误异常(page fault) - 限制因素
大量的关联内存非常昂贵(难以在单个时钟周次内完成,耗电)
5.4.4 基于哈希查找方案
- 进程标识与页号的Hash值可能有冲突
- 页表项中包括保护位、修改位、访问位和存在位等标识
欢迎大家的意见和交流
email: li_mingxie@163.com