- r - 以节省内存的方式增长 data.frame
- ruby-on-rails - ruby/ruby on rails 内存泄漏检测
- android - 无法解析导入android.support.v7.app
- UNIX 域套接字与共享内存(映射文件)
有人可以清楚地解释我缓存未命中,tlb未命中和页面错误之间的区别,它们如何影响有效的内存访问时间?
最佳答案
让我逐步解释所有这些事情。
CPU生成逻辑地址,该逻辑地址包含page number
和page offset
。page number
用于索引page table
,以获得相应的page frame number
,一旦我们有了physical memory
的页面框架(也称为主内存),就可以应用page offset
来获取正确的内存字。
为什么选择TLB(翻译后备缓冲区)
事实是,页表存储在physical memory
中,有时可以很大,为,因此为了加快逻辑地址到物理地址的转换,我们有时使用TLB
,,它由昂贵且更快的关联内存组成,因此,与其先进入页面表,不如进入TLB
并使用page number
索引到TLB
,并获取对应的page frame number
,如果找到了,我们完全避免使用page table
(因为我们同时拥有page frame number
和page offset
)和形成physical address
。
TLB 小姐
如果我们在page frame number
中找不到TLB
,则仅将其称为TLB miss
,然后转到page table
查找相应的page frame number
。
TLB热门
如果我们在page frame number
中找到了TLB
,即TLB hit
,则无需转到页表。
Page Fault
当物理内存中不存在正在运行的程序访问的页面时发生。这意味着页面存在于辅助存储器中,但尚未加载到物理存储器的框架中。
缓存命中
高速缓存内存是一种小型内存,其运行速度比物理内存快,并且我们总是在进入物理内存之前先进入高速缓存。如果我们能够在高速缓存内部的高速缓存存储器中找到相应的单词,则将其称为cache hit
,我们甚至不需要去物理内存。
缓存小姐
只有当映射到cache memory
不能找到缓存内的内存(称为block
)的对应的block
(类似于物理内存page frame
的cache miss
)之后,我们转到physical memory
并完成所有通过page table
或TLB
的过程。
所以流程基本上是这样
1 。首先转到cache memory
,如果它是cache hit
,那么我们就完成了。
2 。如果它是cache miss
,请转到步骤3。
3 。首先进入TLB
,如果它是TLB hit
,则使用形成的physical address
进入物理内存,我们完成了。
4 。如果它是TLB miss
,则转到page table
以获取用于形成physical address
的页面的帧号。
5 。如果未找到page
,则为page fault
。如果所有帧都被某个页面占用,则使用page replacement algorithms
之一,否则只需将所需页面从secondary memory
加载到physical memory
帧即可。
尾注
我讨论的流程与虚拟缓存(进程之间更快但不可共享)有关,在物理缓存(进程较慢但可以在进程之间共享)的情况下,该流程肯定会改变。缓存可以通过多种方式解决。如果您愿意深入学习,请看看this和this。
关于caching - 高速缓存未命中,TLB未命中和页面错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37825859/
我有一个 C# dll 并使用 regasm 生成了一个 tlb。我已经为使用此 tlb 的用户提供了一个实用程序电子表格。每次发布我们的应用程序的新版本时,tlb 都会取消注册和注册(使用 rega
我编写了一个简单的 C++ 程序,使用 for 循环打印从 1 到 100 的数字。我想找出特定程序在运行时发生的 TLB 命中数和未命中数。有没有可能得到这些数据? 我正在使用 Ubuntu。我用过
谁能解释一下“Register for COM Interop”与 “regasm.exe xxxx.dll/tlb:xxxx.tlb” 之间的区别。 根据我的理解,“Register for COM
有人可以解释一下 TLB(翻译后备缓冲区)未命中和缓存未命中之间的区别吗? 我相信我发现 TLB 指的是某种虚拟内存地址,但我并不太清楚这实际上意味着什么? 我理解当一块内存(缓存线的大小)加载到(L
TLB 层次结构是否包含在现代 x86 CPU 上(例如 Skylake,或者其他 Lake)? 例如,prefetchtn将数据带到一级缓存n + 1以及DTLB中相应的TLB条目。它也会包含在 S
所以我正在研究这个执行一些页表操作的内核模块,我注意到刷新 TLB 条目很慢。你问多慢?每次调用 invlpg 的时间超过 100 ns!即 280 个周期或更多。我愿意接受这一点......但是对于
我听说 TLB 是由 MMU 维护的,而不是 CPU 缓存。 那么CPU上是否存在一个TLB并在所有处理器之间共享,或者每个处理器都有自己的TLB缓存? 谁能解释一下MMU和L1、L2 Cache之间
我正在开发一个通过 COM 互操作公开一些 .NET API 的产品。作为构建的一部分,我们为所有此类程序集生成 *.tlb 文件,并将它们作为单独 SDK 包的一部分提供。我们的客户可以在我们的产品
假设我们有意破坏 DTLB,并希望在(很可能)与地址不相交的内存区域上使用 clflush 继续刷新 L1-3 的特定缓存行由 TLB 条目指向;这实际上会将我们正在刷新的缓存行的页面基地址带回 TL
我在 VxWorks 中遇到 TLB(加载字或指令获取)异常。当我进一步分析时,我了解到所引用的内存地址并未指向有效的内存位置。 据我了解,此问题可能是由于某些内存损坏(可能是内存覆盖)而发生的。但是
我对操作系统中的内存管理有疑问。我知道缓存是用于加速内存访问的临时存储位置,而 TLB 用于加速从虚拟地址到物理地址的转换。 现在如果生成一个虚拟内存地址,第一步是什么? 如果第一步是引用 TLB 并
我有一个 32 位 DLL,旨在通过 com 模型和关联的 tlb 文件进行访问。 DLL 似乎是 x86。 有什么方法可以从 x64 程序访问这种 DLL 吗? tlb 文件是否与 x86/x64
我有一个 .tlb 文件,它通过 COM 公开了 C# DLL 的函数。我希望在运行时加载此 .tlb 并在我的 native 项目中使用这些函数。 虽然我可以使用 LoadTypeLib 函数加载库
页表将每个虚拟页面与其关联的物理框架相关联。TLB 的作用相同,只是它只包含页表的一个子集。 如果页表做同样的事情并且有更多的数据,TLB的目的是什么? 最佳答案 速度。 TLB 是保存(可能)最近使
内存屏障保证数据缓存是一致的。但是,它是否保证 TLB 是一致的? 我看到一个问题,即在线程之间传递 MappedByteBuffer 时,JVM(java 7 update 1)有时会因内存错误(S
我遇到了以下问题,我不确定如何解决它: Consider a virtual memory system with the following properties: · 35-bit virtual
我有一个非常简单的问题,QEMU 是否模拟 TLB?当 guest linux 系统执行“invlpg”指令时会发生什么,因为它是为了使 TLB 条目无效。我知道 QEMU 有 softmmu lin
我正在努力解决这个问题(好吧,在考试前一个晚上塞满了:)但我无法弄清楚(也无法在网上找到一个很好的高级概述): '页表条目可以映射到多个 TLB 条目。例如,如果每个页表条目都映射到两个 TLB 条目
假设页面大小为 1KB,如何计算类似以下代码片段的代码中的 TLB 未命中数: int i; int p[1024]; for (i=0; i<1024; i++) p[i]=0; 除了知道#
我目前的工作需要在 Intel Core 系列的 CPU 上生成指定数量的 TLB 未命中,但进展并不顺利。我尝试了很多方法,但所有方法的 TLB 命中率都非常高。有谁知道一些关于 x86 TLB 如
我是一名优秀的程序员,十分优秀!