在学习java或C等语言时,我们会学习静态和动态内存分配。给出的定义有点像下面
Static memory allocation - memory is allocated in stack during compile time.
Dynamic memory allocation - memory is allocated in heap during run time.
在考虑计算机体系结构时,据说如果变量的大小超过L1缓存,则需要从L2缓存或主内存加载,并且会发生大量替换。根据我的理解,L1缓存通常只有几千字节,所以如果程序有大变量(如1000万像素的数组),那么在编译时如何分配那么多的内存呢?
请深入了解如何在物理级别和程序级别分配的内存之间进行映射?
答案 0 :(得分:0)
我认为在这里分离两个概念很重要......内存分配和内存访问。
内存分配是一个软件,它与架构中的任何东西都没什么关系。当通过静态或动态分配为程序分配内存时,操作系统会留出一些内存页供程序使用。这可以是任意数量(当然在体系结构的范围内),并且操作系统甚至可以将页面交换进出物理内存,以防程序需要更多的内存。
然而,内存访问是体系结构和缓存的物理方面发挥作用的地方。假设,根据您的场景,程序的大小为1000万。物理计算机体系结构不知道有一个1000万的数组。它只知道当前正在运行的线程可以访问sizeof(1000万个数组)字节。 L1和L2高速缓存不在编程语言级别上运行,因此它们不知道数组或数据类型或任何此类相关事物。它所知道的是程序正在访问的内存部分。该体系结构将根据内存的访问方式缓存这些内存访问并将数据输入和输出缓存,而不是根据分配方式。因此,对于该体系结构,1000万个元素的数组与占据相同空间的任何类型的对象和基元的集合之间没有区别。它只是将所有内容视为字节和访问。