我想知道内核如何详细地将数据放入 LLC 或 L3 缓存中。我一直在搜索有关在内核中使用缓存的信息,但许多结果都谈到页面缓存或缓冲缓存,但在这个问题中,它仅与主内存上方的缓存有关。
假设我通过使用 或其他方式在内核上下文中创建了一个工作集或数据结构(30MB kmalloc
)vmalloc
。我的想法是,可能有不同的过程,例如保护或额外的优化,以防止内核中的任何内存违规,这与使用malloc
或mmap
用户上下文不同。
因此,如果我在用户模式下使用用户库()创建相同大小的工作集(30MB)malloc
,我预计当我访问工作集中的这些数据时可能会获得不同的性能。
问题
1. 内核如何使用LLC缓存?
2. 使用malloc分配内存时是否会获得不同的性能?
答案1
LLC仅意味着“最后一级缓存”。它与架构密切相关,确切地说是哪个级别的缓存。在最近的 x86/amd64 架构中,它通常是 L3 缓存。
缓存主要独立于内核进行。即使在 asm 级别,也没有或很少有功能可以操作 CPU 内存缓存,包括 L3 缓存。如果甚至是内核的任务来处理它,那么它可能是值得怀疑的。
在 Intel (AMD) CPU 上,有地铁寄存器可以影响内核如何查看内存范围的缓存能力。在较新的英特尔 CPU 上,还有一项功能分割L3缓存,可以通过以下方式调整工具(从内核 4.10 开始)。1
内核API没有malloc()
函数。它有kmalloc()
,本质上是一个malloc()
.它还具有vmalloc()
,它始终分配页面而不是字节。请注意,内核虚拟机主要处理页面,kmalloc()
本质上只是一个包装器,vmalloc()
以获得更有效的、类似 malloc 的功能。
内核算法中有各种优化,可以使其在缓存环境中更好地调整,尽管它们主要处理较低的缓存级别(例如,如果并发进程/内核线程在同一页面或缓存行上工作的可能性最小,那就更好) 。使用它vmalloc()
对于处理多CPU环境中的缓存有很大帮助。
内核主要用C编写,它处理内存地址,并且缓存由CPU内存处理机制透明地处理。
1 谢谢斯蒂芬·基特提出宝贵意见。