- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
所以calloc()
通过向操作系统询问一些虚拟内存来工作。操作系统与 MMU 协同工作,并巧妙地以虚拟内存地址进行响应,该地址实际上映射到 copy-on-write, read-only page full of zeroes .当程序尝试写入该页面的任何位置时,就会发生页面错误(因为您无法写入只读页面),会创建该页面的副本,并且您的程序的虚拟内存被映射到这些全新的副本零。
既然 Meltdown 是一回事,操作系统已被修补,因此不再可能跨内核用户边界进行推测性执行。这意味着每当用户代码调用内核代码时,它都会有效地导致管道停顿。通常,当管道在循环中停滞时,对性能来说是毁灭性的,因为 CPU 最终会浪费时间等待数据,无论是来自缓存还是主内存。
鉴于此,我想知道的是:
calloc()
,并且重新映射到新的 CoW 页面,这是在执行内核代码吗? calloc()
分配 4GiB 的内存,然后在一个紧密的循环中用一些任意值(比如 0xFF
而不是 0x00
)初始化它,我的(Intel)CPU 每次写入新的内存时都会达到推测边界吗?页? 最佳答案
你的前提是错误的。页面错误从来没有流水线化/ super 便宜。但是,随着系统调用和所有其他用户-> 内核转换,Meltdown(和 Spectre)缓解确实使它们变得更加昂贵。
跨内核/用户边界的推测执行是不可能的 ; Intel CPU 不会重命名权限级别,即内核/用户转换始终需要完整的管道刷新。我认为您误解了 Meltdown:这纯粹是由用户空间和 delayed handling of the privilege checks on TLB hits 中的推测执行引起的。 .
这在 CPU 设计中是通用的,AFAIK。我不知道任何重命名特权级别或以其他方式推测内核代码、x86 或其他方式的微体系结构。
Meltdown 缓解增加的成本是进入内核会刷新 TLB。 (或者在具有 TLB 进程上下文 ID 支持的 CPU 上,内核可以使用 PCID 来使内核与用户空间使用单独的页表便宜得多)。
内核入口点(在 Linux 上)变成了一个蹦床,它交换页表并跳转到真正的内核入口点,以避免将内核 ASLR 偏移量暴露给用户空间。但除此之外还有一个额外的 mov cr3, reg
在进入和退出内核时(设置一个新的页表),没有其他任何改变。
(Spectre 缓解也很棘手,需要更多的更改,例如 retpolines ......并且还可能显着增加 user->kernel->user 的成本。关于页面错误成本的 IDK。)
@BeeOnRope 报告(见评论和他的完整细节回答)没有 Spectre 补丁,只应用了 Meltdown 补丁,但 nopti
“禁用”它的启动选项,增加了 Skylake CPU 上内核的往返成本(使用 syscall
和伪造的 RAX,立即返回 -ENOSYS
)从 ~100 到 ~300 个周期。所以这可能是蹦床的成本? 启用实际的页表隔离后,它上升到约 700 个周期 .那根本就没有 Spectre 缓解补丁。 (此外,这是 x86-64 syscall
入口点,而不是页面错误。不过它们可能很相似。)
缺页异常 :
CPU 不会预测页面错误,因此无论如何它们都无法推测性地执行处理程序 .页面错误入口点的预取或解码可能会在管道刷新时发生,但该过程在页面错误指令试图退出之前不会启动。错误的加载/存储被标记为在退出时生效,并且不会重新引导前端; Meltdown 的整个关键是在故障负载达到退役之前缺乏对它的操作。
相关:When an interrupt occurs, what happens to instructions in the pipeline?
另外:Out-of-order execution vs. speculative execution有一些关于哪种推测真正导致 Meltdown 以及 CPU 如何处理故障的详细信息。
When a program writes to a never-before-accessed page which was allocated with
calloc()
, and the remapping to the new CoW page occurs, is this executing kernel code?
If I call calloc() to allocate 4GiB of memory, then initialize it with some arbitrary value (say, 0xFF instead of 0x00) in a tight loop, is my (Intel) CPU going to be hitting a speculation boundary every time it writes to a new page?
mmap(MAP_POPULATE)
进行分配在 Linux 系统上将所有页面预置到硬件页表中。我不确定
madvise
可以为您预置页面,例如
madvise(MADV_WILLNEED)
在已经映射的区域上。但是
madvise(MADV_HUGEPAGE)
将鼓励内核使用匿名大页面(并且可能对物理内存进行碎片整理以释放连续的 2M 块以启用该功能,如果您没有将其配置为在没有
madvise
的情况下执行此操作)。
perf
在带有 KPTI 补丁的 Linux 内核上的结果。
关于performance - Meltdown 缓解与 `calloc()` s CoW "lazy allocation"相结合,是否意味着 calloc() 分配的内存会受到性能影响?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50191769/
真实世界Haskell的第8章 globToRegex' (c:cs) = escape c ++ globToRegex' cs 这个函数不是尾递归的,它说答案依赖于 Haskell 非严格(惰性)
documentation for gather/take mentions Binding to a scalar or sigilless container will also force la
Lazy 模块中有两种力量: val force : 'a t -> 'a force x forces the suspension x and returns its result. If x h
在 Lazy.Force 的 MSDN 文档中扩展方法说: Forces the execution of this value and returns its result. Same as Val
我正在编写一个 MVC 5 互联网应用程序,我有一个关于使用 interface 的问题与 Lazy initialization . 这里是有问题的类定义: public class WebAPIT
我对 real world haskell 中的代码有点困惑 import qualified Data.ByteString.Lazy.Char8 as L8 import qualified Da
我从 Hibernate 迁移到 EclipseLink,因为我们需要 EclipseLink 可以很好地处理复合主键,而 Hibernate 则不能(确实不能!)。现在我正在修复我们的 JUnit
我正在观看 Java 内存模型视频演示,作者说与 Lazy Initialization 相比,使用 Static Lazy Initialization 更好,我不清楚他说的是什么想说。 我想接触社
我想使用 Rust 和 once_cell实现一些静态常量结构实例,一个静态常量向量包含这些静态结构实例。 示例代码如下: use once_cell::sync::Lazy; pub struct
首先我必须承认:我对 Haskell 完全陌生。我已经练习了一些,现在在字符串操作方面遇到了一些麻烦: 我需要删除/删除从字符串末尾开始的字符。我期望函数 dropWhileEnd 执行此操作,但是当
我想使用 Rust 和 once_cell实现一些静态常量结构实例,一个静态常量向量包含这些静态结构实例。 示例代码如下: use once_cell::sync::Lazy; pub struct
我有一个 Lazy>其中 T 是一个类,它有一个巨大的字符串和关于文件的元数据。我们称它们为属性 HugeString和属性(property)Metadata 我有这个 U 类,它具有相同的属性 H
下面的代码是使用 str1 替换字符串的三种不同方式( str2 、 str3 和 Data.Text.Lazy.replace ) .他们应该给出相同的输出。 import Data.Text.La
我有一个表 Image 保存图像信息。我还想存储图像本身。我也应该 1.将 Blob 存储在同一个图像表中,然后像下面这样延迟获取它 @Basic(optional = false, fetch =
在这篇快速文章中,我们将通过一个例子来讨论Spring的@Lazy注解。 默认情况下,Spring IoC容器会在应用程序启动时创建并初始化所有单体Bean。我们可以通过使用@Lazy注解来阻止单体B
我有一个 viewController,因为我使用了 Page 控件。每个页面有 4 个 ImageView 。 我已经通过了 Xml 并根据其中的图像数量得到了 pageControl 的页数,即
我使用了一个名为 blazy 的 js,当我向下滚动页面到它时,图像会加载。 图像显示在 pingdom 速度测试中,如果延迟加载适用于图像,它是否应该显示在速度测试树中? 最佳答案 根据我的经验,我
浏览器级别的 Lazyload 是几乎所有浏览器的新功能( https://developer.mozilla.org/en-US/docs/Web/Performance/Lazy_loading
我想尝试惰性表达式评估,但我现在不想深入研究 Haskel。拜托,你能帮忙找出其他语言有这个功能吗? 最佳答案 你可以用多种语言模拟它。 this例如,是 C++ 的通用惰性求值器。正如文章所说,它也
关注,据说foldl'是 foldl 的严格版本. 但是我很难理解,strict 是什么意思?意思是?? foldl f z0 xs0 = lgo z0 xs0 where
我是一名优秀的程序员,十分优秀!