malloc/new 是不是从缓存或 RAM 返回内存块?
Posted
技术标签:
【中文标题】malloc/new 是不是从缓存或 RAM 返回内存块?【英文标题】:Does malloc/new return memory blocks from Cache or RAM?malloc/new 是否从缓存或 RAM 返回内存块? 【发布时间】:2009-09-24 11:31:46 【问题描述】:我想知道 malloc/new 是从 Cache 还是从 RAM 返回内存块。
提前致谢。
【问题讨论】:
缓存是什么意思?如果您的意思是处理器的内存缓存,那么我非常怀疑。如果您的意思是从目前被分页出来的内存中,我想这很可能是特定于实现的。 【参考方案1】:当你在操作系统中作为一个进程生活时,你被抽象出来了,你只能获得内存。
您不必为此担心,操作系统会为您管理所有这些,而内存单元会将事物从一个转移到另一个。但是您仍然会看到一个单一的虚拟内存布局。
【讨论】:
话虽如此,如果您需要精确控制内存的分配位置以及操作系统将如何处理它(例如将其标记为“永远不要分页”),那么您需要使用操作系统的原生 API。 嗯,内存分页涉及硬盘RAM,我认为您不能向操作系统发出信号以将某些内容始终保存在缓存中而不是内存中。不过,您可以表示不缓存它。 @Arkaitz,“您可以发出信号表示不缓存它”:您能告诉我该怎么做吗?如果你能告诉我会很高兴:)。 @mahesh - 你有 2 个我知道的选项(在 x86 上,我对其他平台无能为力,遗憾的是)。首先,您可以完全关闭缓存,查看有关如何执行此操作的 x86 控制寄存器的详细信息。其次,您可以在 SSE 指令集扩展中使用“非临时”内存指令,这些指令绕过正常内存操作的高速缓存行提取。您可以在 SSE 指令集上查找非临时内存指令的参考。 @luizleroy,但这只是一个提示,大多数编译器可能会忽略它,因为他们自己猜测寄存器变量。【参考方案2】:来自虚拟内存。当进程需要时,操作系统会负责将所需的页面放入 RAM。
【讨论】:
【参考方案3】:malloc
和operator new
会给你一大块地址空间。
操作系统将使用一些物理存储来支持这块地址空间。存储可以是系统内存或页面文件的块,实际存储位置可以在各种物理存储设备之间移动,从应用程序的角度来看,这是透明的处理。此外,CPU 和内存控制器(板载或其他)可能会缓存系统内存,但这通常(很大程度上)对操作系统是透明的。
【讨论】:
【参考方案4】:如前所述,你不知道。缓存/RAM/硬盘被抽象为虚拟内存。但我认为,如果您可以测量访问时间,您可能会了解是否正在访问 RAM 或缓存。但是在第一次访问 RAM 之后,内存块将被复制到缓存中,随后的访问将从缓存中提供。
【讨论】:
【参考方案5】:这在很大程度上取决于。在您的程序开始时,操作系统提供给您的内存可能不会被分页(至少在 Linux 上不会)。然而,如果你释放一些东西,然后获得一个新的分配,内存可能在缓存中。
里面有一个构造函数会触及内存,那么构造之后肯定会在缓存中。
如果您使用 Java 编程,那么您可能会拥有一个非常酷的内存分配器,并且更有可能获得缓存中的内存。
(当我说缓存时,我指的是 L2。L1 不太可能,但你可能会很幸运,尤其是对于小程序)。
【讨论】:
【参考方案6】:您不能直接寻址 处理器缓存,处理器(几乎)透明地管理它...您最多可以使缓存行无效或预取;但是您访问内存地址(如果您不在实模式下通常是虚拟的),并且处理器将始终从其内部存储器中获取数据和指令(如果数据尚不存在,则需要获取它)。
阅读本文了解更多信息:http://en.wikipedia.org/wiki/Memory_hierarchy
【讨论】:
【参考方案7】:首先,分配给应用程序的内存是虚拟内存,其地址位于虚拟空间中。其次,比如L1和L2缓存不会为你分配,由系统管理。事实上,如果为你分配了缓存,系统很难调度任务。
【讨论】:
以上是关于malloc/new 是不是从缓存或 RAM 返回内存块?的主要内容,如果未能解决你的问题,请参考以下文章
虚拟内存(VirtualAlloc),堆(HeapAlloc/malloc/new)和Memory Mapped File