long pointer
假设我的程序的物理内存中的内存位置有 8 个字节。我的程序很小,可以完全放入缓存中。程序很简单。它只是映射(通过 mmap() 调用)从物理内存 in 的任意内存位置/dev/mem
,通过该 8 字节长的指针读取和写入该位置。但是,该位置离我的程序在物理内存中的位置非常远,因此,L1/L2 缓存无法覆盖该地址。
根据文章 Getting Physical With Memory(由 Gustavo Duarte 撰写,我无法链接),仅当具有该内存位置的缓存线准备好写入 RAM 时才会发生内存写入:
通常,内核将所有 RAM 内存视为回写,这会产生最佳性能。在回写模式下,内存访问的单位是高速缓存行,在核心 2 中为 64 字节。如果程序读取内存中的单个字节,处理器会将包含该字节的整个高速缓存行加载到 L2 和 L1 高速缓存中。当程序写入内存时,处理器只修改缓存中的行,而不更新主存。稍后,当需要将修改后的行发布到总线时,会立即写入整个缓存行
但是如果目标内存位置不在缓存中(如上所述),它会立即被写入吗?