Operating system 按需分页的内存访问数

Operating system 按需分页的内存访问数,operating-system,paging,memory-access,demand-paging,Operating System,Paging,Memory Access,Demand Paging,我一直在学习操作系统概念,我指的是彼得·高尔文(Peter B.Galvin)、格雷格·加涅(Greg Gagne)和亚伯拉罕·西尔伯沙茨(Abraham Silberschatz)的《操作系统概念》 在虚拟内存一章中,本书开始讨论分页和系统读取给定逻辑地址的内存中特定帧中存储的数据所需的内存访问次数。作者指出,当主存中存在页表时,系统需要两次内存访问才能读取存储在一个帧中的数据。第一次访问页表是为了读取正确的帧号,下一次访问是为了从帧中读取字节/字 在几节之后,本书讨论了请求分页和页面错误。作

我一直在学习操作系统概念,我指的是彼得·高尔文(Peter B.Galvin)、格雷格·加涅(Greg Gagne)和亚伯拉罕·西尔伯沙茨(Abraham Silberschatz)的《操作系统概念》

在虚拟内存一章中,本书开始讨论分页和系统读取给定逻辑地址的内存中特定帧中存储的数据所需的内存访问次数。作者指出,当主存中存在页表时,系统需要两次内存访问才能读取存储在一个帧中的数据。第一次访问页表是为了读取正确的帧号,下一次访问是为了从帧中读取字节/字

在几节之后,本书讨论了请求分页和页面错误。作者指出,在没有页面错误的情况下,需要一个内存访问,并且在页面错误的情况下,我们将考虑页面故障服务时间(包括时间交换、交换时间、一个内存访问等),并向读者提供公式

。 有效访问时间=(1-p)x一次内存访问时间+p x页面故障服务时间

其中p=页面错误率

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


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

注:我还没有读/看过这本书

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

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

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

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

一个现实是(对于长模式下的一个实际80x86 CPU,但不是所有长模式下的80x86 CPU,也不是其他模式下的任何80x86 CPU,如果未使用虚拟化),如果访问未跨页面边界对齐/拆分,则从虚拟内存读取不会导致页面错误(其中CPU必须全部执行两次才能从两个不同的页面获取字节并合并字节):

对于这种情况(考虑到提到的限制),从RAM获取的数量可以是从0到5的任何数字


您能理解为什么作者(在试图解释页面错误而不试图解释翻译成本时)可能希望避免显示类似的内容,并且可能会简化(假设只需要一次获取,因为翻译在TLB中)相反?

你的问题的根本原因是你正在读一本只适合放在猫盒子里的书。你所描述的是教科书用来在学生中制造混乱的无意义的胡言乱语。这不是一个过度简化的例子,因为作者显然提出了一个无意义的访问时间公式

像这样的公式

有效访问时间=(1-p)x一次内存访问时间+p x页面故障服务时间

是指牛粪便中的废物总量,实际上没有任何依据

作者指出,当主存中存在页表时,系统需要两次内存访问才能读取存储在一个帧中的数据

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

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

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

如果您的CPU具有单独的线性系统表和用户页表,并且用户表位于逻辑地址中,则每次访问系统空间都需要一次内存读取,每次访问用户空间都需要至少两次内存访问,并且实际上可能会触发页面错误。第一次读取是
    * 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)