今天看了一篇文章,关于CPU Cache的7个示例科普CPU Cache html
忽然发现原来本身不知道的东西有这么多,翻查了一些资料,学到了好多东西,因此赶忙记下来,之后忘了的时候翻出来看看 程序员
做为程序员,有必要知道cpu是怎么拿到数据而后处理数据的,优化程序不少都是从这一点作起,这也是我一直想知道的,以前学计算机组成原理和操做系统,没怎么认真学,如今才发现原来这些都是很重要的基础课,若是一个程序员连本身的代码是怎么在机器上运行的都不知道的话,那他就打不出好的代码。之前也只懵懵懂懂的知道,访问内存才会消耗cpu,但根本的都没去了解,今天算是一口气解决了本身的好多疑问 shell
首先你得知道cache这个东西,很是有必要了解清楚,特别是概念和起执行的原理,网上搜一下,一大堆 缓存
cache里的基本存储单元是cacheline即缓存行,缓存一般分为一级缓存和二级缓存,有些还有三级缓存,一般数据传递路线是硬盘到内存到二级缓存到一级缓存再到cpu寄存器,cpu读取数据时,首先会先从一级缓存那里读取,若是该数据存在的话(即cache命中),直接取出数据,这里并无访问内存,若是数据不在一级缓存,cpu就会到二级缓存那里寻找,一样,若是存在则直接取出数据,若是不存在,那就得从内存载入该数据了,这时就须要访问一次内存,缓存就是为了提升cpu的工做效率。 函数
了解系统的内存管理机制也是很重要的,Windows系统为每一个进程都分配了4g的虚拟内存地址,内核占了2g,剩余的空间有栈区、堆区、全局数据区和代码区等,中间还有其余的,总结起来就是动态数据区、代码区和静态数据区。C++中每一个程序的内存分配为代码区、全局数据区、堆区和栈区 测试
C++的内存分配方式有三种: 优化
一、从静态存储区域分配 spa
编译时就分配好,运行期间一直存在,如全局变量、静态变量 操作系统
二、在栈上分配 设计
函数内局部变量,函数执行完后自动释放,内置于处理器的指令集中,效率很高,内存容量有限
三、在堆上分配(动态内存分配)
malloc或new申请,free或delete释放
其实对于局部变量,为什么效率快呢,比较准确的说法是,局部变量在函数体中被屡次引用时,该变量会被放入到缓存里,因此每次读取数据,只要其存在在缓存中就不会去访问内存,但其实若是你在函数体中对局部变量和静态变量作一样次数的引用时,执行时间是同样长的,几行代码就能够测试出来了
因此程序设计要尽可能知足局部性原理,局部性原理又分为时间局部性和空间局部性,时间局部性是指若是程序中的某条指令一旦执行,则不久以后该指令可能再次被执行;若是某数据被访问,则不久以后该数据可能再次被访问。空间局部性是指一旦程序访问了某个存储单元,则不久以后。其附近的存储单元也将被访问。附近即具备连续地址 。
关于内存管理的东西还有不少,天天累积一点点,学到了就记下来。