非连续内存分配

非连续分配:

  • 允许程序使用非连续的的地址空间
  • 允许共享代码和数据
  • 支持动态加载和动态链接 实现物理地址和虚拟地址的转换

段式存储管理

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

程序:

堆栈

数据段

代码段

: -

  • 表示访问方式和存储数据属性相同的一段地址空间
  • 每个段对应一个连续的内存”块”
  • 进程的地址空间由若干个段组成 段地址空间 :段地址+段地址偏移

    image
    访问

  • 先查询段表 存储了基址和长度
  • MMU 会根据页表查询是否越界

    页式存储管理

    页帧 (将物理页面 基本单位) 大小为2的n次方 页面(将逻辑地址划分为逻辑页面 )帧与页大小相同

    页面到页帧的转换

    假定
    16位地址空间 9bit(512b)大小的帧

    页帧 > 帧号 + 帧内偏移

    页 >页号 +页内偏移

    页内偏移 = 页帧偏移

    页号与帧号一般不相同
    image

页表的转换(每一个进程有一个页表)

  • 每个页面对应一个页表项
  • 随程序运行动态变化
  • 存在页表基址寄存器中 页表项组成
    image
  1. 帧号:f
  2. 页表项标志
    • 存在位:逻辑页号是否有物理帧对应
    • 修改位:页面是否被修改
    • 引用位:是否访问过页面的存储单元
      存在问题
  • 内存访问性能问题:访问一次内存单元需要两次内存访问 解决方法:使用快表,在CPU中的cache中存储页表,命中直接访问内存

    第一次访问页表项 第二次访问数据

  • 页表大小问题:页表可能很大 解决方法:

    建立多级页表,减少每级页表的长,但是又增加了访存次数
    image

    页寄存器与反置页表:

  • 不让页表与逻辑地址空间相对应
  • 让页表与物理地址空间的大小相对应
    页寄存器
  • 每个帧与一个页寄存器关联 寄存器内容:

使用位:此帧是否被进程占用

占用页号:对应的儿页号p

保护位:读写控制

页寄存器中的地址转换

  • 对逻辑地址进行Hash映射,以减少搜索范围
  • 需要解决可能的冲突 用快表缓存页表项的页寄存器搜索步骤
  1. 对逻辑地址进行Hash变换
  2. 在快表中查找对应页表项
  3. 有冲突是遍历冲突项列表
  4. 查找失败,产生异常

    反置页表

    在进行Hash时,将进程标识和页号一同进行Hash
    image

    页表项包括:

  • 页号:虚拟地址页号
  • 进程标志符:使用该页的进程号(页号和进程标志符结合起来标志一个特定进程的虚拟地址空间的一页
  • 标志位:有效、引用、修改、保护和锁定等标志信息
  • 哈希链指针 详解一次冲突

首先将pid和页号进行Hash,得到一个索引值,

然后在反置页表中查找索引值那一行,看pid和页号是否和Hash之前一样

如果不一样,说明发生了冲突,然后访问这一项的哈希链指针指向的下一项

然后再进行判断pid和页号

段页式存储管理

段式存储在内存保护方面有优势,也是存储在内存利用和优化到后背存储方面有优势
image

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

在段页式存储管理中的内存共享

  • 通过指向相同的页表基址,实现进程间的段共享
  • image