非连续内存分配的需求
- 有可能找不到连续的一块内存空间满足进程需求
- 连续分配存在内碎片,外碎片,内存利用率比较低
- 非连续内存分配目标:提高内存利用效率以及管理灵活性
- 于是由于非连续内存块的大小分成了:段式,页式,页表,段页式
段式存储管理
- 实现更灵活的分离与共享
- 进程分成多个段后映射到物理地址空间就是不连续的了,其中每个段的逻辑地址都由段号s和段内偏移addr构成
- 段内要求连续,段间不一定连续,故整个进程的地址空间是二维的
- 首先用段号查段表,里面有它的起始地址和长度,由操作系统控制
- MMU检查addr偏移是否大于段的长度,合法就用段基址+偏移得到实际的物理地址
页式存储管理
页帧(Page Frame,页框)
- 针对物理空间的划分,分成2的n次幂大小的基本单位
页面
- 针对逻辑地址空间的划分,大小和页帧一样
- 页内偏移W=帧内偏移
- 通过内存中的页表将页号转换成页帧
- 页表里存储了每个页号P对应的帧号,找到后通过左移页帧大小的2进制的位数得到
页表
- 每个进程都有一个页表
- 页表里面的内容是动态变化的
- 要实现动态变化故加入存在位(检查页号对应的页帧是否存在)、引用位、修改位
页表中存在的问题
- 找特定页帧号,内存需要两次访问
- 页表可能会特别大
- 处理方式使用缓存:快表;间接访问:多级页表
快表+多级页表
- 快表放在高速缓存里,快表满时会根据一定的算法对旧页表项做替换
- 快表命中率可达90%,这是基于著名的局部性原理的原因
- cpu会缓存近期访问的页表项作为快表(又称,相联存储器)
- 多级页表后一级页表大小对应前一级需要存储的地址大小
- 由于进程不会使用到所有的页表,故可以减小页表大小
- 后一级的页表号会作为页内偏移加上前一级的页表号构成实际物理地址
段页式存储管理
- 系统会给每个进程建立一个段表,每个分段有一张页表,故每个进程只有一个段表,可能有多个页表
- 分成段号S,页号P,页内偏移W
- 利用段号S找到该段对应的页表号,将该页表号加页号P作为页内偏移得到真正页号,再加页内偏移W得到物理地址
段页式存储管理的内存共享
- 将共享段使用同一个页表