为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

2024-03-24

当我们有一个支持某种形式的多线程的 CPU 时,每个逻辑 CPU 都有它自己的一组寄存器(至少),包括 CR3 寄存器。

由于我们在执行不同线程时正在处理同一进程的虚拟地址空间,并且永远不会发生上下文切换(切换同一进程的线程时TLB缓存也不会失效),为什么我们需要一个CR3寄存器来指向逻辑CPU中的页表和页目录?

该值不是总是与物理CPU的CR3中的值相同吗?


由于我们在执行不同线程时正在处理同一进程的虚拟地址空间

这并不是 HT 的全部能力。我认为您将“硬件线程”(执行上下文/逻辑核心)与“软件线程”混淆了。

两个逻辑核心运行在一个物理核心上,具有一个物理 iTLB / dTLB / L2TLB。逻辑核心非常独立,不必从同一进程运行线程。

这是一个令人向往的房产SMT https://en.wikipedia.org/wiki/Simultaneous_multithreading像Intel的HT这样的设计:如果操作系统必须小心避免将具有不同页表的线程调度到同一物理内核的不同逻辑内核上,则需要内核之间更多的同步。


不同进程(具有单独的 CR3 页表)的两个线程可以共享一个 TLB,因为这些条目都标有 PCID(进程上下文 ID)。 IIRC,硬件虚拟化也使用类似(或相同?)的标记来避免在 VM 退出或在来宾之间切换时需要 TLB 刷新。

操作系统可以设置 PCID(CR3 的低 12 位)以避免在上下文切换时需要 TLB 刷新,并且作为奖励可以让 2 个进程同时使用 TLB。Linux 是否使用 x86 CPU 的 PCID 功能进行 TLB?如果没有,为什么? https://stackoverflow.com/questions/20155304/does-linux-use-x86-cpus-pcid-feature-for-tlb-if-not-why(据此,Linux 一般不使用 PCID,但我认为 HT 会使用。)

嗯,我不确定我的详细信息是否正确,但实际上,即使两个逻辑核心具有不同的 CR3,TLB 条目也有某种标记可以将它们分开。


根据英特尔论坛主题 https://software.intel.com/en-us/forums/intel-moderncode-for-parallel-architectures/topic/281287, SnB 系列 CPU 对 iTLB 进行静态分区(因此每个逻辑核心获得一半的条目)。这会自动解决任何共享问题。

dTLB 和 L2TLB 是竞争性共享的,因此它们确实需要标记。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器? 的相关文章

  • 何时应该处理 ManualResetEvent?

    我正在使用一个使用 ManualResetEvent 同步线程的应用程序 FxCop 让我处理掉这些物品 我发现以下讨论告诉我同样的事情 我需要 Dispose 或 Close EventWaitHandle 吗 https stackov
  • 早期的BIOS怎么能使用CALL呢?

    我纯粹是出于爱好原因 试图理解 PC 中的一些低级代码 我为随机的旧千兆字节 MB 下载了一个过时的 BIOS ROM 映像 https www gigabyte com Motherboard GA 8I845GE775 G rev 10
  • 理解 scala 中参与者的线程性

    有人告诉我 Scala Actors 实际上从来不会同时执行两个操作 这表明 act 或 React 或 receive 方法本质上是同步的 我知道 act 方法中的长操作可能会导致阻塞问题 并且我假设对消息队列的访问必须以某种方式同步 但
  • Java 中的 ArrayList 和多线程

    在什么情况下 不同步的集合 例如 ArrayList 会导致问题 我想不出任何问题 有人可以给我一个 ArrayList 导致问题而 Vector 解决问题的例子吗 我编写了一个程序 有 2 个线程都修改一个包含一个元素的数组列表 一个线程
  • QList、QVector 或 std::vector 多线程使用

    我希望两个线程像这样工作 第一个线程会将值附加到向量 第二个线程将通过索引对元素进行只读访问 我可以在第二个线程开始读取之前创建互斥体并进行深度复制 但是这种方式真的很慢 如何在没有互斥体的情况下进行此操作 这里 STL向量和线程安全 ht
  • Linux 内核线程没有地址空间

    为什么Linux内核线程没有地址空间 对于任何要执行的任务 它都应该有一个内存区域 对吗 内核线程的文本和数据去了哪里 内核线程确实有一个地址空间 只是他们都有同一个 这并不妨碍它们各自拥有不同的堆栈 文本和数据放置在内核地址空间 由所有线
  • “未捕获的引用错误:窗口未定义”p5.js Web Worker

    我有一个 javascript 代码 我将网络工作者与 p5 js 库一起使用 它不允许我使用 p5 的任何功能 所以我必须使用importScripts p5 js 在使用 p5 的任何函数之前导入 p5 js 库的函数 onmessag
  • 如何在屏障处正确同步线程

    我遇到一个问题 我很难判断应该使用哪个同步原语 我正在创建 n 个在内存区域上工作的并行线程 每个线程都分配给该区域的特定部分 并且可以独立于其他线程完成其任务 在某些时候 我需要收集所有线程的工作结果 这是使用屏障的一个很好的例子 这就是
  • Robot.delay(int) 与 Thread.sleep(long)

    我有一个程序 其唯一目的是驱动java awt Robot无限循环 直到满足退出条件 机器人快速连续执行多个动作 这需要它们之间有标准的 UI 延迟 为此 我使用java awt Robot setAutoDelay int ms 这似乎正
  • 哪种架构称为非均匀内存访问(NUMA)?

    根据wiki http en wikipedia org wiki Non uniform memory access 非均匀内存访问 NUMA 是一种用于多处理的计算机内存设计 其中内存访问时间取决于相对于处理器的内存位置 但尚不清楚它是
  • 如何在 Scrapy/Twisted 中使用线程,即如何在响应回调中对阻塞代码进行异步调用?

    我需要在Scrapy中运行一些多线程 多处理工作 因为我有一些使用阻塞调用的库 并在完成后将请求放回Scrapy引擎 我需要这样的东西 def blocking call self html do some work in blocking
  • Java 多线程 int 操作做得正确

    这里的代码是一个更大项目的工作原型 但只是为了展示这个想法 我需要对 int 执行很多操作 对每个 int 执行很多操作 我决定将所有操作存储在列表中 所有整数都将存储在列表中 每个线程将执行 1 个操作并将在所有列表上运行 但在结果int
  • 重写线程池中线程的中断方法

    假设我有这个 class Queue private static ExecutorService executor Executors newFixedThreadPool 1 public void use Runnable r Que
  • 基于程序描述的多线程推荐

    我想描述我的程序的一些细节 并获得有关最适用的最佳多线程模型的反馈 我现在花了很多时间阅读有关 ThreadPool Threads Producer Consumer 等的内容 但尚未得出可靠的结论 我有一个文件列表 格式相同 但内容不同
  • 如何执行更新UI视图Android的后台作业[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在我的 Android 应用程序中 我有一个带有视图的活动 例如 在活动开始或创建主布局时 我想启动一个后台作业 每 5 秒从主布局更
  • 如何同时(并行)调用远程计算机上的相同功能

    我正在编写一个脚本 该脚本具有多个需要时间在不同远程计算机上执行的函数 有什么方法可以以并行方式同时调用命令它们吗 举个例子将不胜感激 谢谢 Invoke Command已经对每台计算机并行执行调用 作为内置功能的一部分 https tec
  • 使用线程或异步任务的位图工厂动画

    这个问题是我在这个论坛上提出的多个问题的后续问题 这些问题涉及为什么我一直在尝试的动画不起作用 简单回答一下之前的问题 我的动画作为 2 个班级的单独项目工作 但无法工作 当包含在我的包含多个类的项目中时 使用 finish 类关闭了导致我
  • 在 C++ 中使用哪些字符串类?

    我们有一个用 C MFC 编写的多线程桌面应用程序 目前开发人员使用 CString 或 std string 可能取决于他们的心情 所以我们想选择一个实现 可能不是这两个 MFC 的 CString 基于写时复制 COW 习惯用法 有些人
  • 如何显示由 setTimeout/setInterval 生成的每个正在运行的线程的列表

    我想通过纯 javascript 或浏览器中的任何类型的控制台或其他方式来完成此操作 是否可以 Thanks 进一步说明 我想调试一个执行动画的库 我想知道如果有多个对象被动画化 是否会创建多个计时器 注意setTimeout 不会产生新线
  • 线程忙等待

    基本上 我需要忙着等待一些 html 出现在网页上 我创建了以下代码来忙等我 public void ExecuteBusyWaitThreads foreach Canidate canidate in allCanidates Thre

随机推荐

  • 如何允许或阻止 Headless chrome 上的通知警报

    我正在运行我的量角器测试headlesschrome 我不确定无头chrome是否会弹出通知警报 如果弹出 如何允许和阻止它们 对于非无头 Chrome 我添加了此中给出的解决方法post https github com angular
  • ERP 的最佳默认事务隔离级别是多少(如果有)?

    简短背景 我们刚刚开始使用 Hibernate 将 ERP 系统迁移 重新实现到 Java 目标是使用该系统的并发用户数为 50 100 个 我们使用 MS SQL Server 作为数据库服务器 这足以满足此负载 现在 旧系统根本不使用任
  • 如何使用SQL Server数据库项目

    我正在运行安装了 SSDT SQL Server Data Tools 的 SQL Server 2012 和 VS 2010 我的开发数据库使用存储过程 函数 CLR 对象等 它有大约 500GB 的生产数据快照 我创建了 SQL Ser
  • 如何正确处理我的 WebGL 上下文以避免 16 WebGL 上下文错误? [复制]

    这个问题在这里已经有答案了 这是此问题的后续问题 该主体的实时 WebGL 上下文超过 16 个 丢失了最近最少使用的一个 https stackoverflow com q 33800600 2715716 在该问题中 我们发现当您刷新
  • 如何使用 NSJSONSerialization

    我有一个 JSON 字符串 来自 PHP 的json encode 看起来像这样 id 1 name Aaa id 2 name Bbb 我想将其解析为我的 iPhone 应用程序的某种数据结构 我想对我来说最好的事情就是拥有一个字典数组
  • 如何使用 HTML5 音频标签创建自动播放列表?

    如何使用 HTML5 的音频标签创建自动播放列表 我想要实现的是一个只有播放 暂停按钮大 30x25 px 的播放器 播放器在页面加载时自动播放 当歌曲结束时 它会自动播放下一首歌曲 尝试在播放列表中包含 3 4 首歌曲 查看这篇文章 使用
  • ng-select 中的对象及其属性

    我一直在试图弄清楚如何使用数组 if 对象作为 ng select 指令的键值 这是我想使用的数据 scope selectValues name Options 1 value 11 name Options 2 value 22 nam
  • 如何从 key.pk8 和certificate.pem 生成 Android 密钥库?

    所以今天我终于将我的 SDK 更新到 22 0 0 但这会在 AndroidManifest xml 中创建一个错误android debuggable false 这意味着我无法再从外部签名和压缩我自己的 APK 我一直使用自己的 key
  • scanf 格式说明符从一组字符中读取零个或多个字符

    我需要对读取字符串中可以包含的字符非常严格 我有一系列空格 后面跟着一个字符 后面跟着一系列空格 例子 c c 我需要找到一个格式说明符 它允许我忽略该字符 但前提是它是这个特定字符而不是任何其他字符 这个序列 e 应该被中止 I trie
  • Azure ARM 模板(取决于)

    寻求一些指导和解释dependsOn 我在模板中看到有两种在模板中提供依赖项的方法 一种方法是提供resourceId另一种方法是使用提供字符串值concat 我试图理解两者之间的区别 Example concat Microsoft Ne
  • 错误:指针和整数之间的比较

    我正在尝试编写一个可以处理重定向的简单 shell 但是 我得到 错误 指针和整数之间的比较 我明白为什么会出现错误 但我不确定如何修复它 args 声明为 static char args 512 这是我收到错误的代码 if args l
  • Visual Studio上的Nuget包推送403错误

    我创建了一个视觉工作室类库 我想将其作为一个包发送给 Nuget 我用了视觉工作室包管理器安慰 命令如下 nuget spac 你好nuget nuget 包 hellonuget nuspec nuget 推送 hellonuget 1
  • 如何在“表格列表”中仅显示一次表格标题,以便将表格拆分为多个页面

    我正在使用 R 包 xtable and knitr 和乳胶包 longtable and hyperref 准备一份文件 我的一张桌子很长并且分成多页 事实证明 表列表 显示了该表出现的每个页码 但所有超链接都将我带到了该表的开头 我的问
  • CSS Sprites 在 IE 中不起作用[8/7/6]

    我正在尝试 CSS 使用精灵来动画我的风险矩阵 它在 Firefox 和 Chrome 中工作得很好 但图像不会显示在 IE 中 代码如下 不想将整个内容粘贴到此处 但摘录显示了模式 dl dd a a dd dd a a dd dl
  • 隐藏文件夹 C# [重复]

    这个问题在这里已经有答案了 可能的重复 C 获取不包括隐藏文件的文件列表 https stackoverflow com questions 2418270 c get a list of files excluding those tha
  • android 背景重复-y

    我有一个图像 我想将其放置在右侧并在 y 轴上重复它 HTML 中类似于 背景 url img png 右重复 y 在android中可以做到这一点吗 当我将此位图设置为背景时 它不在右侧
  • 检查 FTP 服务器上的可用空间

    我正在运行一个构建脚本 其中三个可执行文件 每个 100mb 被上传到 FTP 服务器 由于 FTP 服务器空间问题 第一次上传可能会失败 因此我们的构建过程会失败 这意味着我必须从服务器释放一些空间并再次运行构建脚本 这是浪费时间 我想在
  • Python 子模块在 python 3.7 中正确导入,但在 3.6 中则不然

    我的目录结构如下 test init py m1 init py f1 py f2 py test init py是空的 test m1 init py包含一行import test m1 f1 test m1 f1 py包含一行impor
  • 如何将复杂对象传递到 ASP.NET MVC 中的另一个视图?

    我正在尝试将一个复杂的对象 可以序列化 如果有帮助的话 传递给另一个视图 目前 这是我在某些控制器方法中拥有的代码 User user New User Name Fred Email xxxx return RedirectToActio
  • 为什么每个逻辑 CPU 在多线程情况下都有自己的 CR3 寄存器?

    当我们有一个支持某种形式的多线程的 CPU 时 每个逻辑 CPU 都有它自己的一组寄存器 至少 包括 CR3 寄存器 由于我们在执行不同线程时正在处理同一进程的虚拟地址空间 并且永远不会发生上下文切换 切换同一进程的线程时TLB缓存也不会失