cpu缓存与程序内存分布

今天看了一篇文章,关于CPU Cache的7个示例科普CPU Cache

突然发现原来自己不知道的东西有这么多,翻查了一些资料,学到了好多东西,所以赶紧记下来,以后忘了的时候翻出来看看

作为程序员,有必要知道cpu是怎么拿到数据然后处理数据的,优化程序很多都是从这一点做起,这也是我一直想知道的,之前学计算机组成原理和操作系统,没怎么认真学,现在才发现原来这些都是很重要的基础课,如果一个程序员连自己的代码是怎么在机器上运行的都不知道的话,那他就打不出好的代码。以前也只懵懵懂懂的知道,访问内存才会消耗cpu,但根本的都没去了解,今天算是一口气解决了自己的好多疑问

首先你得知道cache这个东西,非常有必要了解清楚,特别是概念和起执行的原理,网上搜一下,一大堆

cache里的基本存储单元是cacheline即缓存行,缓存通常分为一级缓存和二级缓存,有些还有三级缓存,通常数据传递路线是硬盘到内存到二级缓存到一级缓存再到cpu寄存器,cpu读取数据时,首先会先从一级缓存那里读取,如果该数据存在的话(即cache命中),直接取出数据,这里并没有访问内存,如果数据不在一级缓存,cpu就会到二级缓存那里寻找,同样,如果存在则直接取出数据,如果不存在,那就得从内存载入该数据了,这时就需要访问一次内存,缓存就是为了提高cpu的工作效率。

了解系统的内存管理机制也是很重要的,Windows系统为每个进程都分配了4g的虚拟内存地址,内核占了2g,剩余的空间有栈区、堆区、全局数据区和代码区等,中间还有其他的,总结起来就是动态数据区、代码区和静态数据区。C++中每个程序的内存分配为代码区、全局数据区、堆区和栈区

C++的内存分配方式有三种:

1、从静态存储区域分配

编译时就分配好,运行期间一直存在,如全局变量、静态变量

2、在栈上分配

函数内局部变量,函数执行完后自动释放,内置于处理器的指令集中,效率很高,内存容量有限

3、在堆上分配(动态内存分配)

malloc或new申请,free或delete释放

其实对于局部变量,为何效率快呢,比较准确的说法是,局部变量在函数体中被多次引用时,该变量会被放入到缓存里,所以每次读取数据,只要其存在在缓存中就不会去访问内存,但其实如果你在函数体中对局部变量和静态变量做同样次数的引用时,执行时间是一样长的,几行代码就可以测试出来了

所以程序设计要尽量满足局部性原理,局部性原理又分为时间局部性和空间局部性,时间局部性是指如果程序中的某条指令一旦执行,则不久之后该指令可能再次被执行;如果某数据被访问,则不久之后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久之后。其附近的存储单元也将被访问。附近即具有连续地址 。

关于内存管理的东西还有很多,每天累积一点点,学到了就记下来。


你可能感兴趣的:(C++,cache,内存)