段式分块大,页式分块小。

1. 段式存储

  1. 主代码段
  2. 子模块、公用库
  3. 堆栈段 stack
  4. 堆数据 heap
  5. 初始化数据段
  6. 符号表等

几个部分组成(1-4由下到上)

目的:更细粒度和灵活的分离与共享

逻辑上连续,物理上可以不连续

每一个段是访问方式或储存数据等属性相同的一段地址空间

1.1 段访问

逻辑地址由二元祖(s, addr)表示

s - 段号
addr - 段内偏移

段基址 + 段内偏移

1

2. 页式存储

页帧(物理页面)Frame:把物理地址空间分为大小相同的基本分配单位

页面(逻辑页面)Page:把逻辑地址空间分为大小相同的基本分配单位

帧和页的大小必须是相同的

页面 ——> 页帧 ?

MMU/TLB(快表)

2.1 帧

内存物理地址的表示:二元组(f, o)

2

3

页内偏移 = 帧内偏移

但通常 号大小不同(因为页连续,帧不连续)

逻辑地址表示:二元组(p, o)

4

3. 页表(实现页面 ——> 页帧)

读页表可以实现页号变帧号

5

3.1 页表结构

每个进程都有一个页表

每个页面对应一个页面项

组成:
1. 存在位
2. 修改位
3. 引用位

存在页表基址寄存器中

3.2 页式存储的性能问题

  • 访问一个内存单元需要2次内存访问(先页面,再页帧)

    1. 获取页表项
    2. 访问数据
  • 页表大小问题

    页表可能非常大

如何处理?

  1. 缓存 ——> 快表
  2. 间接访问 ——> 多级页表

3.3 快表和多级页表

快表 TLB :把近期访问的页表项存储在cpu里(使用关联存储实现)

6

多级页表:通过间接引用将页号分为k级

7

利用多级页表减少整个页表的长度

3.4 反置页表

对于大地址空间(64 bit),多级页表变得繁琐

原因:逻辑地址空间增长速度 > 物理地址

反置页表: 让页表和物理地址空间大小相对应

页寄存器:

  1. 使用位:帧是否被进程占用
  2. 占用页号:对应页号P
  3. 保护位

8

每一个物理页面和一个页寄存器对应

优点:
页表大小相比物理内存很小
与逻辑地址无关

缺点:
需要帧号找页号
搜索逻辑地址麻烦

方法:逻辑 ——> 物理 ?

  1. Hash映射
  2. 快表查找页表项
  3. 冲突时遍历
  4. 失败产生异常

举例子:反置页表的hash冲突解决
9

快表限制:

  1. 容量
  2. 功耗

反置基于Hash映射来查找页表的帧号

4. 段页式存储管理

结合的思路

段:内存保护优势
页:内存利用率和外存后备优化有优势

做法

  • 在段式存储上,给每个段加一级页表

4.1 段页式中的内存共享

10

评论