- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我听说 TLB 是由 MMU 维护的,而不是 CPU 缓存。
那么CPU上是否存在一个TLB并在所有处理器之间共享,或者每个处理器都有自己的TLB缓存?
谁能解释一下MMU和L1、L2 Cache之间的关系吗?
最佳答案
TLB 缓存页表中列出的转换。每个CPU核心可以在不同的上下文中运行,具有不同的页表。每个内核都有自己的 MMU,尽管实际上它根本不是一个单独的单元,但它是内核的一部分(加载/存储端口、TLB 和页遍历器的一部分)。任何共享缓存始终都是物理索引/物理标记的,因此它们基于后 MMU 物理地址进行缓存。
TLB 是一个实现细节(只是 PTE、页表条目的缓存),可能会因微体系结构而异;例如386没有,每次加载都会多次访问内存。实际上,真正不同的是大小。它始终是针对每个核心的。 2 级 TLB 现在很常见,可以将完整的 TLB 缺失保持在最低限度,但仍然足够小且足够快,允许每个时钟周期进行 3 次转换(用于数据加载/存储,与 iTLB 并行。)
仅重新遍历页表(在本地 L1 数据或 L2 缓存中可能很热)来重建 TLB 条目比尝试跨内核共享 TLB 条目要快得多。是为避免 TLB 未命中而值得采取的极端情况设定下限的因素,这与数据缓存不同,数据缓存是您必须从核心转到共享 L3 缓存或从片外转到 DRAM 之前的最后一道防线。 L3 未命中。
例如,Skylake 添加了第二个页面遍历单元(对于每个核心)。良好的页面遍历对于逻辑核心无法有效共享 TLB 条目(来自不同进程的线程,或不接触许多共享虚拟页面)的工作负载至关重要。
共享 TLB 意味着当您确实更改页表时,invlpg
使缓存的翻译无效,总是必须离开核心。 (尽管在实践中,操作系统需要确保运行多线程进程的其他线程的其他核心在诸如 munmap
之类的过程中使用软件方法进行核心间通信,将其私有(private) TLB 条目“击落”就像 IPI(处理器间中断)。)
但是使用私有(private) TLB,到新进程的上下文切换只需设置一个新的 CR3(顶级页目录指针)并使该核心的整个 TLB 无效,而无需打扰其他核心或全局跟踪任何内容。
有一个 PCID(进程上下文 ID)功能,可以让 TLB 条目用 16 个左右的 ID 之一进行标记,这样来自不同进程页表的条目可以在 TLB 中成为热门条目,而不需要在上下文切换时刷新。对于共享 TLB,您需要加强这一点。 (PCID 是针对每个核心的,因此可以为每个核心单独跟踪最近运行的任务。)
另一个复杂之处是 TLB 条目需要跟踪 PTE 中的“脏”和“已访问”位。它们通常是 PTE 的直写式缓存。
<小时/>有关各个部分如何在真实 CPU 中组合在一起的示例,see David Kanter's writeup of Intel's Sandybridge design 。请注意,这些图适用于单个 SnB 内核。 大多数 CPU 中唯一在核心之间共享的缓存是最后一级数据缓存。
英特尔的 SnB 系列设计均在环形总线上使用每核 2MiB 的模块化 L3 缓存。因此,添加更多核心会向总池中添加更多 L3,并添加新核心(每个核心都有自己的 L2/L1D/L1I/uop 缓存和两级 TLB。)
关于caching - TLB 是否在多个内核之间共享?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34437371/
我有一个 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 如
我是一名优秀的程序员,十分优秀!