分页

Tuesday, October 29, 2019

分页

分页不是将一个进程的地址分割成几个不同长度的逻辑段(代码,堆,栈),而是分割成固定大小的单元,每个单元称为一页。

一个简单的分页地址空间如下图所示:

OS18.1

通过完善的分页方法,操作系统能够高效地提供地址空间的抽象,不管进程如何使用地址空间。另外就是分页提供的空间管理的简单性,只要在空闲列表,找到足够满足使用的空闲页即可。

为了记录每个虚拟页保存在物理内存的位置,需要为每个进程保存一个页表。页表提供了虚拟内存的地址转换。

OS18.2

为了转换生成的虚拟地址,我们要将其分成两个组件,虚拟页面号(VPN)和偏移量(offset)

我们假设一个64字节的地址空间,所以我们的虚拟地址需要6位(2的6次方等于64),又因为页的大小是16。我们就可以把前两位做为页面号,后面四位做为偏移量。

OS18.3

那么假如我们要加载21的虚拟地址,我们很容易可以得知,二进制可以形式为01 0101,01号的虚拟页,0101的偏移量,然后我们就可以检索页表(第二张图),页号1对应的物理页帧7,也就是二进制的111,那加上0101的偏移量,地址就是1110101

OS18.4

页表存在哪里

一个典型的32位地址空间,假如是4kb 的页,那就需要20位虚拟页和12位偏移量。 20位的 VPN 意味着需要管理大约一百万个地址,假设每个地址位4字节,那么每个页表就需要4MB,那100个进程就需要400MB,这显然是不合理的,更别说还有64位的地址空间。

列表中有什么

页表就是一种数据结构,将虚拟页号转换到物理帧号,最简单就是用数组的结构。至于每个页表项(PTE)的内容,里面有许多不同功能的位。

  • 有效位通常是指示特定地址转换是否有效。比如程序开始运行时,代码和堆在一头,栈在另一头,中间的空间都将被标记为无效,如果访问这种内存,就会陷入操作系统,导致进程终止。

  • 有效位对于稀疏地址空间非常重要,通过无效位,我们就可以不为这些页面分配物理帧,从而节省了内存。

  • 保护位表明页是否可读取写入执行

  • 存在位表明该页在内存还是在磁盘中

  • 参考位用于追踪页面是否经常被访问

OS18.5

分页:也很慢

通过前面的说明我们知道,比如获取进程地址21的实际地址,系统必须先将虚拟地址转换为正确的物理地址(117),在获取到117之前,系统必须从进程的页表提取适当的页表项,执行转换,然后从物理内存中加载数据。

对于每一个内存引用,分页都需要我们执行一次额外的引用,以便从页表中获取地址转换。额外的内存引用开销是非常大的。

所以现在有两个问题,一个是内存占用过大,一个是运行速度过慢。

OS

分页:快速地址转换(TLB)

空闲空间管理