现代操作系统:内存管理(三)

Paging 分页

分页是最简单的移除由他引起的连续的物理内存请求和潜在的大量外部碎片的一种方案。

  • 程序被按逻辑的切分为固定大小的块称之为virtual pages(虚拟页面),这种分块对用户是不可见的;
  • 这种对虚拟内存空间的划分被展示在下方中间的图片中;
  • 物理内存类似的被划分为固定大小的块并称之为physical pages(物理页面)
  • 这种对物理内存空间的划分被展示在下方右侧的图片中;
  • 虚拟页面通常被称之为简单页面(Simply Page页面);
  • 物理页面通常被称之为简单框架(Simply Frame页框);
  • 页面的大小等同于页框的大小;
  • 将所有的页面放置在页框中,当所有的页面和所有的页框具有相同的大小,所有的东西都完美适配并且没有任何的外部碎片;
  • 更多的是,当页框都具有相同的大小,那么就根本不存在布置/分配问题,所有的页框都很好,事实上它们是完美的;
  • 需要注意的是,程序在物理内存中并不是连续的,举个例子:在图中Page 0在物理内存中被放置在Page 1的后面,Frame 6和8 是某个进程的一部分,但是Frame 7并不属于该进程。

Why is Paging Useful?为什么分页是有效的?

这个问题也就变成了将虚拟内存和物理内存切分为多大的块是合适的?

考虑一下之前的一些系统(MVT)和一个将页面大小设置为10kb的新系统,如果一个任务需要500KB大小的内存然后内存中存在两个300KB的空洞,这个任务是无法在MVT系统中被执行的,因为这个任务需要500KB连续的内存块;

但是在新系统中这两个空洞会被划分成60个10KB大小的页框,这个任务就可以使用其中的50个页框的空间用于执行。

 

How Can Paging Possibly Work?分页可能是怎么工作的?

特别的是我们如何才能在物理内存中找到而定的虚拟地址?

解决这个问题的核心是OS维护了一张表,这张表被称之为Page Table页表,其中存储了每个页面的实体,这张表呈现在上图中的左侧。页面p的Page Table Entry(页表条目)或简写为PTE包含了包含这个页面p的页框f的编号。

 

Virtual to Physical Address Translation虚拟地址向物理地址的转换

下方图的右侧阐明了如何将一个虚拟地址转换到与之对应的物理地址,也就是如何找到给定虚拟地址在物理内存中的位置;

  1. 虚拟地址被划分为两个部分:页码和偏移量。页码等同于虚拟地址除以页面大小;偏移量等于虚拟地址对页面大小的取余;另一种描述将虚拟地址分解为页码和偏移量的方法是用虚拟地址除以页面大小,那么商就是页码,余数就是偏移量;但是实际上并不需要做这样的划分,因为页面的大小通常是2的倍数,如果我们需要商和余数这两个值,例如354897除以1000我们通常画一条垂直线就可以而不需要使用计算器;
  2. 页码通常作为页表的索引;
  3. 页表中的实体存储了每个页面对应的页框;
  4. 页框号和偏移量相加从而获得物理地址,计算方式为:页框号*页框大小+偏移量;

示例:有一台计算机的页面大小和页框大小都是1000,请问虚拟地址3372对应的物理地址是多少?

  1. 首先将虚拟地址划分为页码p和偏移量offset, ;
  2. 幸运的是上述计算你根本不需要用到计算器,只需要画一条竖线…… 3 | 372;
  3. 显而易见此时你需要在页表Page Table对应的Index = 3的位置找到页框的框码,但是这个题目啥也没给,所以我们假设PTE[3]=459;
  4. 如果PTE[3]=459那么框码就是459,所以物理地址就是 ;
  5. 然后就变成了把459写在了372左边,emmm,我不知道要怎么吐槽,如果页框和页面大小不是1000这种值还是不好算,不过我相信你们的老师是善良的。

 

例子:考虑一个页面大小为1000的简单分页系统,这个某个进程的页表显示在右侧,那么下面每个虚拟地址对应的物理地址是什么?0?1000?3500?4321

 

问题:

  1. 如果页面的大小是2000是难了一点还是难了很多?
  2. 页面大小是 呢?
  3. 然后如果是1872呢?
  4. 对于计算机而言,哪种页面大小是最适合它的?

回答:

1000对我们来说是最快乐的,但是对于计算机来说2的整数次幂的计算速度是最快的,也就是2048,其他的数值其实对计算机来说都差不多。

 

Properties of paging分页的特性

  • 整个进程必须在内存中运行;
  • 物理地址空间并不是连续的,即程序的内存映像由若干块构成;
  • 虚拟地址空间保持连续;
  • 不会有空洞,外部不会有碎片;
  • 如果由500个页框,每个页框/面的大小为4KB则任何一个内存需求小于2MB的进程都可以运行,因为可用页框完全分散在内存中,不需要保证连续;
  • 所以简单的分页是有用的,虽然现在不用了;
  • 每个进程引入大约等于页面大小的1/2的内部碎片;
  • 由于内存不足,作业还是会无法运行的,例如作业需要50个页框但是只有40个可用。但是这并不称之为外部碎片,因为他并不是由于内存被碎片化导致的;
  • 没有布置问题,所有的页框都一样好,因为它们具有相同的大小;
  • 仍然存在替换问题,如果一份工作不适合,那么另一份工作可以与之交换,但是需要决定将哪个工作替换下去。

 

Cost of Address Translation in Paging分页中进行地址转换的代价

似乎有一堆算术和额外的内存引用(对页表)需要,这将使方案完全不可行。不需要算术,实际上,你和我都可以除以1000(页面大小),或者通过将最右边的三位数字与其余的数字分开来计算mod 1000。这是因为1000是10^3,我们把数字写成小数。

计算机使用二进制,所以设计人员选择页面大小为2的幂,然后再除以页面大小,计算mod页面大小只需要将最左边的位和最右边的位分开。

似乎每个内存引用都会转变成两个内存引用:引用页表和引用中央内存。这将是一场灾难(速度直接砍半)!但是事实并非如此,相反MMU会缓存一些页码到框码的转换,并且这些缓存保存在处理器附近,可以被快速访问。这样做是因为在实际情况下大多数程序都只会对少量的页面进行多次的访问,因此只有很少的页表项会被反复读取。

这个缓存被称为Translation Lookaside Buffer(TLB)或者Translation Buffer(TB)。对于上面的一个示例而言,在完成一次虚拟地址向物理地址的转换后,TLB中就存储了P#3至F#459的缓存,因此对位于3000-4000之间的任何一个虚拟地址都可以快速转换为物理地址459XXX,而不需要额外的内存引用,当然位置459XXX本身的内存引用是必须的。这个方案即为计算机设置一个小型的硬件设备,通常放置于MMU中,包含少量的表项,通常不超过256个,每个表项中会包含一个页面的相关信息,包括虚拟页号、页面的修改位、保护码和对应的物理页框。

 

Homework 24

7. Using the page table of Fig. 3.9, give the physical address corresponding to each of the following virtual addresses.

 

 

posted on 2022-01-06 15:41  ThomasZhong  阅读(101)  评论(0编辑  收藏  举报

导航