连续分配的缺点
非连续分配的设计目标
提高内存利用效率和管理灵活性
非连续分配需要解决的问题:如何实现虚拟地址和物理地址的转换
非连续分配的硬件辅助机制:如何选择非连续分配中的内存分块大小
进程的段地址空间由多个段组成
段式存储管理的目的:更细粒度和灵活的分离与共享
段地址空间是不连续的二维结构
段的概念
段访问:逻辑地址由二元组(s, addr)表示
段访问的硬件实现
段表的每个条目都有段基地址(该段在内存中开始的内存地址)和段界限(长度)
页帧
页面
页面到页帧
物理内存被划分成大小相等的帧
内存物理地址的表示:二元组 (f, o)
f: 帧号 (F位, 共有 \(2^F\) 个帧)
o:帧内偏移(S位,每帧有 \(2^S\)字节)
物理地址 = f * \(2^S\) + o
基于页帧的物理地址计算实例
在16-bit的地址空间,9-bit大小的页帧下
物理地址表示 = (3,6)
物理地址 = f * \(2^S\) + o
实际物理地址 = 512 * 3 + 6 = 1542
进程的逻辑地址空间被划分为大小相当的页
页内偏移 = 帧内偏移
通常 页号大小 \(\neq\) 帧号大小
进程逻辑地址的表示:二元组 (p, o)
p: 页号 (P位,代表共有 \(2^P\)个页)
o: 页内偏移 (S位,每页有 \(2^S\)字节)
虚拟地址 = p * \(2^S\) + o
页式存储中的地址映射
页表保存了逻辑地址——物理地址之间的映射关系
每个进程都有一个页表
页表项组成:
页表地址转换示例
可见,4是没有放入内存中,3已放入内存了。
内存访问性能问题
页表大小问题:
如何处理?
缓存近期访问的页表项。
如果TLB命中,物理页号可以很快被获取
如果TLB未命中,对应的表项被更新到TLB中。
通过间接引用将页号分成k级
两级页表实例
大地址空间问题
对于大地址空间系统,多级页表变得繁琐。
比如5级页表,逻辑(虚拟)地址空间的增长速度快于物理地址空间。
因此,有一种新的思路: 页寄存器和反置页表
每一个帧与一个页寄存器关联,寄存器内容包括:
使用位:此帧是否被进程占用
占用页号:对应的页号p
保护位
页寄存器示例
物理内存大小:4096 * 4096 = 4K * 4KB = 16MB
页面大小:4096 bytes = 4KB
页帧数:4096 = 4K
页寄存器使用的空间(假设每个页寄存器占8字节):
8 * 4096 = 32KB
页寄存器带来的额外开销:
32K/16M = 0.2%
虚拟内存的大小:任意
页寄存器方案的特征
优点
缺点
CPU生成的逻辑地址如何找对应的物理地址?
用快表缓存页表项后的页寄存器搜索步骤
快表的限制
基于Hash映射值查找对应页表项中的帧号
每个元素有三个域:pid、页号、指向下一项的指针
反置页表的Hash冲突
在段式存储管理的基础上,给每个段加一级页表。
段页式存储管理中的内存共享
通过指向相同的页表基址,实现进程间的段共享。
原文:https://www.cnblogs.com/QingYuAn-Wayne/p/14077659.html