段式分块大,页式分块小。
1. 段式存储
由
- 主代码段
- 子模块、公用库
- 堆栈段 stack
- 堆数据 heap
- 初始化数据段
- 符号表等
几个部分组成(1-4由下到上)
目的:更细粒度和灵活的分离与共享
逻辑上连续,物理上可以不连续
每一个段是访问方式或储存数据等属性相同的一段地址空间
1.1 段访问
逻辑地址由二元祖(s, addr)表示
s - 段号
addr - 段内偏移
段基址 + 段内偏移
2. 页式存储
页帧(物理页面)Frame:把物理地址空间分为大小相同的基本分配单位
页面(逻辑页面)Page:把逻辑地址空间分为大小相同的基本分配单位
帧和页的大小必须是相同的
页面 ——> 页帧 ?
MMU/TLB(快表)
2.1 帧
内存物理地址的表示:二元组(f, o)
页内偏移 = 帧内偏移
但通常 号大小不同(因为页连续,帧不连续)
逻辑地址表示:二元组(p, o)
3. 页表(实现页面 ——> 页帧)
读页表可以实现页号变帧号
3.1 页表结构
每个进程都有一个页表
每个页面对应一个页面项
组成:
1. 存在位
2. 修改位
3. 引用位
存在页表基址寄存器中
3.2 页式存储的性能问题
访问一个内存单元需要2次内存访问(先页面,再页帧)
- 获取页表项
- 访问数据
页表大小问题
页表可能非常大
如何处理?
- 缓存 ——> 快表
- 间接访问 ——> 多级页表
3.3 快表和多级页表
快表 TLB :把近期访问的页表项存储在cpu里(使用关联存储实现)
多级页表:通过间接引用将页号分为k级
利用多级页表减少整个页表的长度
3.4 反置页表
对于大地址空间(64 bit),多级页表变得繁琐
原因:逻辑地址空间增长速度 > 物理地址
反置页表: 让页表和物理地址空间大小相对应
页寄存器:
- 使用位:帧是否被进程占用
- 占用页号:对应页号P
- 保护位
每一个物理页面和一个页寄存器对应
优点:
页表大小相比物理内存很小
与逻辑地址无关
缺点:
需要帧号找页号
搜索逻辑地址麻烦
方法:逻辑 ——> 物理 ?
- Hash映射
- 快表查找页表项
- 冲突时遍历
- 失败产生异常
举例子:反置页表的hash冲突解决
快表限制:
- 容量
- 功耗
反置基于Hash映射来查找页表的帧号
4. 段页式存储管理
结合的思路
段:内存保护优势
页:内存利用率和外存后备优化有优势
做法
- 在段式存储上,给每个段加一级页表