通过按需分页

时间:2018-12-01 14:58:20

标签: operating-system paging memory-access demand-paging

我一直在研究操作系统概念,我所指的书是彼得·B·加尔文(Peter B. Galvin),格雷格·加涅(Greg Gagne)和亚伯拉罕·席尔伯沙茨(Abraham Silberschatz)编写的《操作系统概念》。

在“虚拟内存”一章中,这本书开始讨论分页和内存访问次数,这对于系统读取给定逻辑地址的内存中特定帧中的数据将是必需的。作者指出,当页表存在于主内存中时,系统将需要两次内存访问才能读取存储在框架中的数据。第一次访问页表是为了读取正确的帧号,然后是访问以读取帧中的字节/字。

在几节之后,本书讨论了需求分页和页面错误。作者声明,在没有页面错误的情况下,需要一次内存访问;在出现页面错误的情况下,我们将考虑页面错误服务时间(包括交换时间,交换时间,一次内存访问等)并显示公式的读者

有效访问时间=(1-p)x一个内存访问时间+ p x页面错误服务时间

其中p =页面错误率

我无法确定为什么作者建议在没有页面错误的情况下只需要一次内存访问。运用同一作者先前介绍的标准分页方案所使用的思路,我们应该需要一种内存访问来读取页表,而另一种需要从帧中读取数据。

是因为我们正在谈论的是访问页表之后的时间范围吗?那么为什么相同的计算标准不适用于分页的标准版本?

2 个答案:

答案 0 :(得分:1)

注意:我还没有看过这本书。

用于教学材料;如果作者用所有细节准确地描述了现实,那么读者只会感到困惑,无法学习。为了解决这个问题,作者在引入不同概念的同时进行了简化(忽略细节并忽略了现实),以便读者能够一次学习每个概念,同时积累了理解现实复杂性所需的知识。

问题在于,不同的简化在不同的阶段有意义,并且作者是人的(不完美的),因此有时在某一点(在一章中)有用的简化与在稍后一点(在一章中有益)的简化相冲突。另一章)。

例如,我可能(最初)告诉某人“从虚拟内存进行的每次访问都涉及从RAM提取第二个内存以确定转换”,以帮助他们了解页表的工作方式以及所涉及的(潜在)性能问题(两倍的内存访问)。然后,我可能会介绍“转换后备缓冲区”的概念(在读者了解页表的工作原理并了解TLB设计要解决的问题之后)。然后,我可能会解释说,实际系统通常具有多个级别的页表(例如,在64位80x86上为四个级别,可能涉及4个内存访问来确定转换),并且可能涉及更高级别的缓存/缓冲区(而不仅仅是缓存最终翻译的TLB)。在这种情况下,我的原始语句(“从虚拟内存进行的每次访问都涉及从RAM提取第二个内存以确定转换”)是故意说谎(简化),以避免诸如“从虚拟内存进行的每次访问可能或可能不涉及从某些或所有级别的页表中进行的一次或多次其他提取”(对于初学者来说,这太令人困惑了,因为它会产生很多他们尚无答案的问题)。

  

我无法确定为什么作者建议在没有页面错误的情况下只需要一次内存访问。

一个现实是(对于未使用虚拟化的长时模式下的一个真正的80x86 CPU,但如果不使用虚拟化,则不是所有长时模式下的所有80x86 CPU,也不是其他模式下的任何80x86),这是从虚拟内存中进行读取而不会导致的页面错误,如果访问没有错位/跨越页面边界(在这种情况下,CPU必须执行两次以从2个不同页面中提取字节并合并字节):

    * if the translation is not in the TLB, then:
        * if the area is not in the "page directory cache"
            * fetch the PML4 entry to determine address of PDPT (try L1 cache, then L2 cache, then L3 cache, then RAM)
            * do access checks based on flags in PML4 entry
            * fetch the PDPT entry to determine address of PD (try L1 cache, then L2 cache, then L3 cache, then RAM)
            * do access checks based on flags in PDPT entry
            * insert data into "page directory cache"
        * if the area is in the "page directory cache"
            * do access checks based on flags in "page directory cache entry"
        * fetch the PD entry to determine address of PT (try L1 cache, then L2 cache, then L3 cache, then RAM)
        * do access checks based on flags in PD entry
        * fetch the PT entry to determine address of page (try L1 cache, then L2 cache, then L3 cache, then RAM)
        * do access checks based on flags in PT entry
        * insert data into TLB (including setting the "accessed" flag in the page table entry)
    * if the translation is in the TLB, then:
        * do access checks based on flags in "TLB entry"
    * do the "physical address = physical address of page + offset in page" calculation
    * read the data for the physical address (try L1 cache, then L2 cache, then L3 cache, then RAM)

为此现实(提到了限制);从RAM提取的次数可以是0到5之间的任何值。

您能看到为什么作者(在试图解释页面错误而不是在解释翻译成本时)为什么想要避免显示这样的内容并可能简化(通过假设只需要一次获取,因为翻译在TLB)代替?

答案 1 :(得分:0)

问题的根本根源在于您正在阅读的书只适合用来装猫的盒子。您所描述的是教科书用来在学生之间造成混乱的荒谬胡言乱语。这不是过度简化的情况,因为作者显然为访问时间抛出了一个荒谬的公式。

这样的公式

  

有效访问时间=(1-p)x一个内存访问时间+ p x页面错误服务时间

是牛粪总废物,没有现实依据。

  

作者指出,当主存储器中存在页表时,系统将需要两次内存访问才能读取存储在框架中的数据。

处理器必须使用页表将逻辑地址转换为物理地址。假定CPU中没有缓存,则CPU已读取每个内存访问的页表。

读取的数字取决于CPU使用的页表格式。

让我们假设您的进程具有一个多级页面表。在这种情况下,CPU必须读取表的每个级别。

如果您的CPU具有单独的线性系统表和用户页表,并且用户表位于逻辑地址中,则对系统空间的每次访问都需要读取一次内存,而对用户空间的每次访问都至少需要两次内存访问,并且实际上可能会触发页面错误。首先读取系统页表以查找用户页表项。第二次读到用户页表。第三是数据。

实际上,地球上的每个CPU都进行页表缓存,因此不需要(始终)单独读取。

  

我无法确定为什么作者建议在没有页面错误的情况下只需要一次内存访问。

听起来这本书的BS不一致。

现实是逻辑存储器转换需要许多步骤。但是,这些步骤是什么取决于处理器的状态,这是无法预料的。这些步骤在后台透明地进行,您甚至无需掌握所有步骤即可了解操作系统。

在现实世界中,您需要知道的是CPU将逻辑地址转换为物理地址。如果CPU无法进行翻译,则会触发页面错误。