操作系统笔记(6)-分页
操作系统笔记(6)-分页
简介
将空间切成不同长度的分片以后,空间本身会
碎片化(fragmented)
,随着时间推移,分配内存会变得比较困难因此,出现了另一种叫作
分页
思想: 将空间分割成固定
长度的分片,每个单元称为一页相应地,把物理内存看成是定长槽块的阵列,叫做
页帧(page frame)
,每个这样的页帧
包含一个虚拟内存页
如何映射到真实的物理地址
- 接下来,我们关心如何将虚拟页映射到物理页,首先为了记录地址空间的每个虚拟页放在物理内存中的位置,操作系统通常为每个进程保存了一个数据结构,称为
页表(page table)
页表
的主要作用是为地址空间的每个虚拟页面保存地址转换
,从而让我们知道每个页在物理内存中的位置
- 假设单页的大小为
16B
,以一个64B
的虚拟地址和一个128B
的物理地址为例,它们的页表
和页帧
分布如下图:
- 我们可以用一个
6
位的二进制数来表示虚拟地址(2^6 = 64),由于分为了4
页,我们可以用高两位来表示地址属于哪一页,也叫虚拟页面号
,然后用剩余四位来表示当先页的偏移量(offset)
- 如图中的第 0 页对应的
物理帧号(PFN)
为3,那么我们只需要将虚拟页面号
替换成物理帧即可,而偏移量
不用改变
页表中究竟有什么
- 页表就是一种数据结构,用于将虚拟地址映射到物理地址,因此任何数据结构都可以采用,以最简单的
线性页表(linear page table)
为例,它就是一个数组
- 操作系统通过虚拟页号检索该数组,找到
页表项(PTE)
,然后找到期望的物理帧号
PTE
中除了物理帧号外,还有一些额外的位来表示相关信息,以x86
架构的页表项
为例,其结构如下图:
- 存在位(P) :表示该页是在物理存储器还是磁盘上
- 读写位(R/W) :确定是否允许写入该页面
- 用户/超级用户位(U/S) :确定用户模式进程是否可以访问该页面
- (PWT、PCD、PAT 和 G) :确定硬件缓存如何为这些页面工作
- 访问位(A) :确定是否可以访问
- 脏位(D) :表明页面被带入内存后是否被修改过
- 页帧号(PFN)
小结
- 与以前的方法(如
分段
)相比,分页有许多优点。首先,它不会导致外部碎片,因为分页将内存划分为固定大小的单元。其次,它非常灵活,支持稀疏虚拟地址空间
- 但是它会导致较慢的机器和内存浪费(内存被页表塞满而不是有用的应用程序数据),因此后面有一些更好的做法,比如
多级页表
,它将页号不断细分为多级,高层的页表放在内存中,低层的放在硬盘里,然后查找的时候调入内存中即可
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.