虚拟内存中的分页
- 每个进程都有一个页表,
- 每个进程可以占据大量的虚存空间
概念:
- 页表项 : 页表中的每个项记录了每个页对应的页框号
- 不带单位默认为字节
Byte
问题
假设进程的虚存空间为 2 G B = 2 31 2GB=2^{31} 2GB=231,若使用 2 9 = 512 2^9 = 512 29=512个字节的页,那么进程需要 2 31 / 2 9 = 2 22 2^{31}/2^9 = 2^{22} 231/29=222个页表项.
导致进程加载到内存时,创建的页表占用的内存空间太大.
- 大多数虚拟内存方案都在虚存中保存页表, 那么说明页表也能像页一样能够被分开,(分页技术)
- 分页技术 同样来 分页表 : 将1个大页表分成多个页表
- 使得当一个进程正在运行时,页表至少有一个部分在内存中,且该部分包含正在运行的页 的页表项
使用二级方案来组织大型页表
- 分页技术 同样来 分页表 : 将1个大页表分成多个页表
原理:
-
有一个页目录,每一项指向一个页表,
若页目录长度为
x
,且页表最大长度为y
,则一个进程可以有x*y
页 -
典型情况下: 页目录的一个页表的最大长度被限制为
1
页 (重要限制),
32位地址的两级方案:
采用字节级寻址,因为是
32
位一个地址,等价4Byte
一个地址,
- 不带单位默认为字节
Byte
规定页的大小为 4 K B = 2 12 4KB = 2^{12} 4KB=212, 因为页表只包含1个页,下面简称此类 页表 为 页,
则 4 G B = 2 32 4GB=2^{32} 4GB=232虚拟地址空间需要 2 32 / 2 12 = 2 20 2^{32}/2^{12}=2^{20} 232/212=220个页(页表)组成 (称为第三层)
- 如何优化查询页表?
-
若上面的每个页(页表)都由
4
个字节的地址映射可以找到,- 则创建一个新页表,每个页表项是
4
个字节的地址,指向该 2 20 2^{20} 220个页(页表), - 新页表的大小为 2 20 ∗ 4 = 2 22 = 4 M B 2^{20}*4=2^{22}=4MB 220∗4=222=4MB的内存空间, (称为第二次)
- 又因为规定了页的大小 2 12 2^{12} 212,则该新页表有 2 22 / 2 12 = 2 10 2^{22}/2^{12}=2^{10} 222/212=210个页(页表),每个页(页表)含有 2 10 2^{10} 210个 4 4 4字节地址
总结:
第二层( 4 M B 4MB 4MB) = 2 10 2^{10} 210个页(页表) = 2 20 2^{20} 220 个
4
字节地址 - 则创建一个新页表,每个页表项是
-
因为每个页(页表)都由
4
个字节的地址映射可以找到, 则第二层的页(页表)又可以由 2 10 2^{10} 210个 4 4 4字节地址组成- 这个 2 10 2^{10} 210个 4 4 4字节地址 2 10 ∗ 4 = 2 12 2^{10}*4=2^{12} 210∗4=212组成根页表,占据内存 2 12 = 4 K B 2^{12}=4KB 212=4KB (称为第一层)
虚拟地址如何通过第一层的根页表找到在内存中的地址
32位虚拟地址结构
- [ 10 位 ] [ 10 位 ] [ 12 位 ] [10位][10位][12位] [10位][10位][12位]
-
第一个10位有 2 10 2^{10} 210个选择,则通过第一层 2 10 2^{10} 210个选择找到了第二层中 2 10 2^{10} 210个页(页表)中的一个
- 现在位于第二层中的任意一个页(页表)
-
此时同样仍有 2 10 2^{10} 210个选择
-
来到了第三层,因为页表长度为1,找到的页表恰好有页的页框号
-
最后 页框号+12位偏移量 得到在内存中的地址
后记
- 重要是理解页 页表 页表项 的区别和联系