内存屏障和 TLB

2024-01-18

内存屏障保证数据缓存的一致性。但是,它能保证TLB的一致性吗?

我发现一个问题:在线程之间传递 MappedByteBuffer 时,JVM(java 7 update 1)有时会因内存错误(SIGBUS、SIGSEG)而崩溃。

e.g.

final AtomicReference<MappedByteBuffer> mbbQueue = new AtomicReference<>();

// in a background thread.
MappedByteBuffer map = raf.map(MapMode.READ_WRITE, offset, allocationSize);
Thread.yield();
while (!inQueue.compareAndSet(null, map));


// the main thread. (more than 10x faster than using map() in the same thread)
MappedByteBuffer mbb = inQueue.getAndSet(null);

如果没有 Thread.yield(),我偶尔会在 force()、put() 和 C 的 memcpy() 中崩溃,所有这些都表明我试图非法访问内存。使用 Thread.yield() 我没有遇到问题,但这听起来不像是一个可靠的解决方案。

有人遇到过这个问题吗? TLB 和内存屏障有任何保证吗?


编辑:操作系统是 Centos 5.7,我已经看到了 i7 和双 Xeon 机器上的行为。

我为什么要这样做?因为写入消息的平均时间为 35-100 ns,具体取决于长度,并且使用普通 write() 的速度没有那么快。如果我在当前线程中进行内存映射和清理,则需要 50-130 微秒,而使用后台线程来执行此操作,主线程交换缓冲区大约需要 3-5 微秒。为什么我需要交换缓冲区?因为我正在写入许多 GB 的数据,而 ByteBuffer 的大小不能为 2+ GB。


映射是通过 mmap64 (FileChannel.map) 完成的。当访问该地址时,将出现页面错误,内核将为您读取/写入该地址。 mmap期间不需要更新TLB。

TLB(所有 cpu 的)在 munmap 期间未验证,这是通过 MappedByteBuffer 的最终确定来处理的,因此 munmap 的成本很高。

映射涉及大量同步,因此地址值不应被破坏。

您有机会通过 Unsafe 尝试一些奇特的东西吗?

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

内存屏障和 TLB 的相关文章

  • 如何创建一个在给定范围内随机打乱数字的 int 数组[重复]

    这个问题在这里已经有答案了 基本上 假设我有一个可以容纳 10 个数字的 int 数组 这意味着我可以在每个索引中存储 0 9 每个数字只能存储一次 如果我运行下面的代码 int num new int 10 for int i 0 i l
  • null != Something 和 Something != null 之间的区别

    之间有区别吗null something and something null在爪哇 如果有区别 那么我应该使用哪一个 为什么 之间没有区别null something and something null 你一定在想person getN
  • Android Canvas.DrawBitmap 没有模糊/抗锯齿?

    我正在尝试使用精灵 或非常像素化的角色 背景等 制作一个Android游戏 我把它们画在画布上 就像这样 matrix preScale xrat yrat canvas drawBitmap img matrix null 其中 img
  • 使用java进行JSON模式验证[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在为返回 JSON 对象的 java webapp 编写一些验收测试 我想验证返回的 JSON 是否针对架构进行验证 任何人都可以建议
  • 格式化 XmlGregorianCalendar 时区问题

    我需要将 java XmlGregorianCalendar 格式化为 yyMMdd 字符串 我的实现 XMLGregorianCalendar date getDate getting the date if date null Simp
  • Spring - 是否可以获取所有使用@ComponentScan注册的包?

    是否可以获取使用 ComponentScan 注册的所有包的列表 我需要知道 我的 Spring Boot 应用程序中已经注册了哪些 root 包 可能的解决方案 在运行时扫描Java注释 https stackoverflow com q
  • 良好的客户端套接字池

    我需要管理从我的 Java 应用程序到外部服务器的长时间运行的 TCP 套接字连接 我正在寻找一个好的套接字池 这样我就可以重复使用套接字 有什么建议吗 你可以看看在上面建立一个套接字池公共池 http commons apache org
  • 使用Optional验证输入

    我有一个 CreateOrder 实例 其中包含一些 String Integer 和 Double 状态 当我在 JUnit 测试中为 CreateOrder 创建一个对象并将其发送出去时 我可以使用可选 API 验证 String 属性
  • 如何在 Intellij IDEA 中为 Apache Tomcat 指定自定义 JRE 路径?

    问题是如何指定自定义JRE路径为Apache tomcat in Intellij IDEA 当从以下位置启动应用程序时IDEA 看来 只需配置它的路径 路径jvm dll in Apache Tomcat监视器没有帮助 还有其他想法或方法
  • “赠送”应用内购买 Android

    有没有办法将 Google Billing 中的应用内购买 赠送 给特定帐户 我把这个问题放在这里是因为如果有一种方法可以以编程方式完成它 那很好 但不是必须的 在官方文档中找不到任何相关内容 我想要这个的原因是因为我的一个应用程序目前处于
  • 在 Maven 中解决或编译循环依赖关系 [重复]

    这个问题在这里已经有答案了 我有一个有趣的问题 而不是寻找a解决方案 我正在寻找解决方案s Alice 项目有一个 pom xml 在其中 pom 说她被包装成一个罐子 虽然她是一个坚强的女人 但她依赖鲍勃 鲍勃项目是一个互补主义者 他说他
  • 将两个表视图绑定在一起,以便它们同步滚动

    我想将两个表视图绑定在一起 以便它们同步滚动 我怎么做 我无法找到如何访问表格视图的滚动条 我做了一个CSS hack来将Tableview与外部滚动条绑定 一个滚动条控制两个表格视图 我的想法的概述 创建两个表视图 制作一个垂直滚动条 在
  • 如何在活动之间传递大型集合(主从流)

    背景 我正在实现一个从网络服务读取有关电影信息的应用程序 该网络服务返回有关每部电影的一些信息 标题 日期 海报网址 导演 演员等 该 Web 服务支持分页 因此电影以 100 部为一组加载 执行 这个想法是显示一个包含所有海报的网格 当用
  • Android 设计导航抽屉 - 如何在 nav xml 中添加开关?

    我正在使用新的 Android 设计导航抽屉 我想在抽屉里加一个开关 有办法实现这个吗 这是菜单 xml menu menu
  • 在 LINUX 上测量 TLB 未命中的命令

    有人可以指导我使用一个命令来测量 LINUX 上的 TLB 未命中吗 是否可以将轻微页面错误视为 TLB 未命中 您可以使用perf去做这个 前提是你的CPU支持 Use perf list了解可用的计数器 当我拿到这个列表并查找 TLB
  • @Where 子句在 hibernate join 查询中不起作用

    我有 2 个带有 Where 注释的实体 第一个是类别 Where clause DELETED 0 public class Category extends AbstractEntity 且有如下关系 OneToMany fetch F
  • 使用 lambda 或 Stream API 合并流以生成交替序列

    我有一些按预期返回 Stream 的代码 但也许可以用某种类型的 lambda 或 stream 操作替换它 而不是耗尽 a 中的迭代器while loop 它只是一种交替流中元素的方法first and second当其中一个元素耗尽时停
  • 错误:升级到 lombok 1.16.2 后包 javax.annotation 不存在

    我的 android 项目使用 lombok 1 16 0 构建得很好 但是一旦我将依赖项更改为目标 1 16 2 我在使用 lombok 注释的任何地方都会收到以下错误 Error 20 1 error package javax ann
  • 使用 Java Swing 平均成绩 [关闭]

    很难说出这里问的是什么 这个问题是含糊的 模糊的 不完整的 过于宽泛的或修辞性的 无法以目前的形式得到合理的回答 如需帮助澄清此问题以便重新打开 访问帮助中心 help reopen questions 我有一个家庭作业 我一直在编码 我以
  • 尝试从输入流检索文本时应用程序挂起

    情况 我确实查看了您的代码 正如我怀疑的那样 您的问题与您发布的代码完全无关 您的 GUI 完全忽略 Swing 线程规则 并在主 Swing 事件线程 称为Event Dispatch T螺纹或EDT 由于该线程负责所有 Swing 绘图

随机推荐

  • MySQL 性能:多表与单表和分区上的索引

    我想知道什么在性能上更高效 更快 在一张大表上有一个索引 还是在多个没有索引的小表上有索引 由于这是一个非常抽象的问题 让我把它变得更实际 我有一张表 其中包含有关用户的统计信息 20 000 个用户 总共约 3000 万行 该表大约有 1
  • Hazelcast 专用节点

    在专用服务器上运行 Hazelcast 节点的最简单方法是什么 我们有一个使用 Hazelcast 分布式地图的 Web 应用程序 目前 Hazelcast 节点配置为在 Servlet 容器节点中运行 随着规模的扩大 我们希望添加专用硬件
  • AngularJS $timeout 函数未在我的 Jasmine 规范中执行

    我正在尝试使用 Karma 与 Jasmine 测试我的 AngularJS 控制器 但一个 timeout这在现实生活中运行良好 但却使我的测试崩溃 控制器 var Ctrl function scope timeout scope do
  • 在网站上查找一个单词并获取其页面链接

    我想抓取一些网站 看看那里是否存在 katalog 一词 如果是 我想检索该单词所在的所有选项卡 子页面的链接 可以这样做吗 我尝试按照本教程进行操作 但最终得到的 wordlist csv 是空的 即使网站上确实存在单词目录 https
  • 如何将图像裁剪为圆形且圆形内有网格

    In my Social media app i want image Cropping Functionality that Crop image in Circle shape plus have Grid inside Circle
  • 如何在 Rails 中以简单形式添加开关切换按钮

    我正在使用 Rails 4 和 Simple Form with Bootstrap 我希望我的复选框不会那样 但类似的东西 我有CSS
  • 使用 #include 和包含防护在单独文件中进行 C++ 继承

    我是 Stack Overflow 的新手 正在自学 C 但我仍然是一个初学者 在完成了我正在使用的书中的大部分内容 可能被认为是过时的和 或不是一本好书 后 我决定通过自己尝试来重新强化一些概念 仅在需要时参考这本书 但我似乎被卡住了 我
  • 如何在 Python 中正确使用 re.sub() 进行迭代

    我想制作一个创建脚注的 Python 脚本 这个想法是找到该排序的所有字符串 Some body text Some footnote text 并将它们替换为 Some body text where 是正确的脚注编号 我的脚本的另一个部
  • 将 Quick BASIC 转换为 VB.Net - 随机访问文件

    我正在尝试将旧的 Quick BASIC 程序转换为 VB Net 旧文件语句似乎没有任何直接替代 对于我的简单需求来说 构建数据库似乎有点大材小用 如何在 VB Net 中执行以下操作 OPEN test dat FOR RANDOM A
  • 如何引用数组列表中的数组元素?

    我创建了一个LinkedList of String arrays public static void main String args String one new String 10 String two new String 10
  • 在 JTextPane 中显示乌尔都语字符

    如何显示单个Urdu http en wikipedia org wiki Urdu中的字符JTextPane http docs oracle com javase 6 docs api javax swing JTextPane htm
  • 如何将 QProcess 的输出定向到文件?

    我想要的输出qconf重定向到test settings txt在我的 tmp 文件夹中 我想到了两种可能性 QProcess procWriteProject procWriteProject start qconf QStringLis
  • JQuery 将克隆输入更改为空

    我试图克隆一个包含输入和文本区域的类 并将它们的值变为空 var current item last current clone insertAfter current current find input textarea val 问题在
  • 从 Visual Studio Code 将 Vue.js 应用程序部署为 Azure 应用程序服务

    我有一个 Vue js 应用程序 这个应用程序是使用创建的Vue Cli https cli vuejs org 此时 这是一个基本的 hello world 应用程序 我的本地计算机上运行着这个应用程序 我通过使用运行它npm run s
  • 如何将数据点与理论联系起来?

    DataPoints public static final Integer input1 1 2 Theory Test public void test1 int input1 DataPoints public static fina
  • 重构这个基本代码,确定数字是否为数十、数百、数千等

    if n lt 100 x 10 else if n lt 1000 x 100 else if n lt 10000 x 1000 else if n 等等等等 对于此类问题 是否有一种简洁 可扩展的方法 我的大脑决定停止工作 var x
  • 挂钩容器请求 LDAP 用户角色的进程

    在我的应用程序中 我使用带有 LDAP 领域的基于表单的身份验证 对于授权 我使用数据库 据我了解 其工作原理如下 App gt user pass gt LDAP lt OK user exists gt ask for security
  • Ruby 检查可读性?

    有没有办法使检查的输出更具可读性 在 Perl 中 有Data Dumper这使得输出更容易阅读 ruby 标准库包含 PP Pretty Print 的缩写 它比标准检查更好地格式化结构 http www ruby doc org std
  • 如何确定目标MAC地址

    我的应用程序在 CentOS 5 5 上运行 我需要使用 libpcap API 发送原始数据包 pcap inject or pcap sendpacket 到特定的IP地址 如何确定 MAC 地址属于特定目标 看起来你想要的是ioctl
  • 内存屏障和 TLB

    内存屏障保证数据缓存的一致性 但是 它能保证TLB的一致性吗 我发现一个问题 在线程之间传递 MappedByteBuffer 时 JVM java 7 update 1 有时会因内存错误 SIGBUS SIGSEG 而崩溃 e g fin