作为一名程序员,你需要理解计算机存储系统的层次结构,他对应用程序的性能有着巨大的影响,如果程序所需要的数据存储在cpu的寄存器中,那么指令在执行期间,就可以花费零个周期来进行访问,而在Cache中则需要1~30个周期,主存中需要50~200周期,而在磁盘中则需要几千万个周期。

  我们需要能够了解系统如何将数据在存储器系统层次结构中上下移动的,这样编写应用程序时我们可以将数据项存储在层次结构较高的地方,那样cpu可以快速的访问到。

存储技术

  利用存储器的层次来介绍一下存储器概念。

  最高为CPU中的寄存器,由触发器构成,几乎不需要访问周期。其次是若干高速缓冲存储器Cache,有SRAM构成,用来解决主存访问速度慢的问题,可以是多级缓存。其次是DRAM构成主存,其中主存中也是包括ROM的,用来存储固件(比如BIOS,一个计算机系统通电以后首先 运行ROM中的固件)。再往下是磁盘,一般为传统的旋转磁盘,盘面上的磁性材料记录着数据信息。SSD是一种基于闪(EEPROM)的存储技术,在某些情况下是传统磁盘的极强的替代品。

主存访问

  数据流通过总线的共享电子电路在处理器和DRAM主存/输入输出设备之间来来回回。如图:

系统总线连接着I/O桥(将系统总线中的电子型号翻译成I/O总线的电子信号或者存储器总线的电子信号)。Intel系统中使用北桥和南桥的芯片组分别将cpu连接到存储器和输入输出设备。

局部性

  这种局部性包括时间局部性和空间局部性,良好的局部性也就是说CPU倾向于引用最近的或者临近的的数据项。这种倾向性成为局部性原理。

  现代的计算机中各个层次,从硬件到操作系统,再到应用程序,都利用到了局部性原理。

  • 硬件 高速缓冲存储器
  • 操作系统 用主存来缓存磁盘文件系统中最近被使用的磁盘块
  • web 浏览器也会将最近引用的文档放在本地磁盘上,这属于时间局部性

这里举一个例子,对于变量V,这里有很好的空间局部性,因为我们采用的是步长为1的引用模式,在主存中取块B放入到Cache中,步长为k的引用模式中平均每次循环迭代会有min(1,(wordsize*k)/B)次缓存不命中,k的增加,空间的局部性会降低。

int sumvec(int v[N])
{
int i, sum = ; for (i = ; i < N; i++)
sum += v[i];
return sum;
}

量化评价一个程序的局部性的简单原则:

  1.重复引用一个变量的程序有良好的时间局部性。

  2.对步长为k的引用模式,k越小,空间局部性越好。

  3.对取指令来说,循环有好的时间和空间局部性,循环体越小,迭代次数越多,局部性越好。

高速缓存存储器

  缓存的Cache和主存的三种映射方式:组相联映射,全相连映射,直接映射。

  实际上计算机组成原理课上已经了解来Cache的工作原理,利用局部性的思想编写高速缓存友好的代码的基本方法:

  • 让最常见的情况运行的更快,所以要把注意力集中在核心函数的循环上。
  • 让循环内部缓存不命中数量最小。

在上面的代码中,我们假定v是块对齐的,字为四个字节,高速缓存块为四个字。

  1.对局部变量的反复引用是好的,因为编译器能够将他们还存在寄存器文件中(时间局部性)。

  2.步长为1的引用模式是好的。

而在这个多位数组中我们这样访问:

交换i,j的次序使得每次都不命中。

缓存不命中种类

  • 冷不命中/强制不命中:此时k层是一个空的缓存,所有访问都会不命中
  • 冲突不命中:对象映射到了同一个缓存块,导致缓存无法命中
  • 容量不命中: 数据量太大,无法保存在缓存中导致。

个人总结

编写程序可以考虑到高速缓存友好和局部性原理,当然最后的这些优化的前提是你使用的高效的算法。

CSAPP--存储器及程序的局部性的更多相关文章

  1. CSAPP 5 - 优化程序性能

    CSAPP 5 - 优化程序性能 1. 概述 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构 其次才是编写出能让编译器 易优化的,高效的可执行代码.这点在特定的机器上可能有着特定的不同的优化 ...

  2. CSAPP(2):程序的汇编表示(Linux版)

    程序员学习汇编代码的需求随着时间的推移发生了变化,开始时只要求程序员能直接用汇编语言编写程序,现在则要求他们能够阅读和理解编译器产生的代码. 下面是针对32位机器 数据格式 Intel用术语“字”(w ...

  3. CUDA Texture纹理存储器 示例程序

    原文链接 /* * Copyright 徐洪志(西北农林科技大学.信息工程学院). All rights reserved. * Data: 2012-4-20 */ // // 此程序是演示了1D和 ...

  4. 【CSAPP笔记】11. 存储器层次结构

    在没有专门研究存储器系统之前,我们依赖的存储器模型是一个很简单的概念,也就是把它看成一个线性数组,CPU 能在一个常数时间内访问任何一个存储器位置.虽然在研究别的问题时,这是一个有效的模型,但是它不能 ...

  5. csapp第六章笔记-存储器结构

    目录 随机访问存储器(Random-Access-Memory) 静态RAM 动态RAM 增强的DRAM 非易失性存储器 磁盘存储 磁盘构成 磁盘容量 磁盘操作 逻辑磁盘块 访问磁盘和连接I/O设备 ...

  6. 【深入理解计算机系统CSAPP】第六章 存储器层次结构

    6 存储器层次结构 存储器系统(memory system)是一个具有不同容量.成本和访问时间的存储设备的层次结构.CPU 寄存器保存着最常用的数据.靠近 CPU 的小的.快速的高速缓存存储器(cac ...

  7. 系统级编程(csapp)

    系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用 ...

  8. ****** 三十四 ******、软设笔记【存储器系统】-Cache存储器

    Cache存储器 Cache(高速缓冲存储器) 高速缓冲存储器是位于主存与CPU之间的一级存储器,有静态存储芯片(SRAM)组成,容量比较小,速度比主存高得多,接近于CPU的速度,单位成本比内存高.C ...

  9. 基于《CSAPP第九章 虚拟内存》的思考和总结

    在csapp的描述中,虚拟内存的形象更加具化,虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组,内存充当了磁盘的缓存,粗呢内存的许多概念与SRAM缓存是相似的.虚拟页面有以下三种 ...

随机推荐

  1. [JavaScript] JavaScript作用域深度解析

    JavaScript作用域 JavaScript中的函数运行在它们被定义的作用域里,而不是它们被执行的作用域里. -- JS权威指南 在JS里,一切皆对象,函数也是. 一.有什么用 什么时候会用到它? ...

  2. Update主循环、状态机的实现

    从写一段程序,到写一个app,写一个游戏,到底其中有什么不同呢?一段程序的执行时间很短,一个应用的执行时间很长,仅此而已. 游戏中存在一个帧的概念.   这个概念大家都知道,类比的话,它就是电影胶卷的 ...

  3. 一句话输出网站404页面,REFER及相关排序

    cat www.log|awk '$9~/404/ {print $7"," $11}'|sort|uniq -c|sort -nr > ./www404.csv

  4. City Tour

    Description Alice想要从城市A出发到城市B,由于Alice最近比较穷(不像集训队陈兴老师是个rich second),所以只能选择做火车从A到B.不过Alice很讨厌坐火车,火车上人比 ...

  5. Remote Desktop Connection Manager 多个远程管理

    http://www.microsoft.com/en-us/download/details.aspx?id=21101 Remote Desktop Connection Manager 多个远程 ...

  6. HDU_2044——蜜蜂走蜂房,递推

    Problem Description 有一只经过训练的蜜蜂只能爬向右侧相邻的蜂房,不能反向爬行.请编程计算蜜蜂从蜂房a爬到蜂房b的可能路线数. 其中,蜂房的结构如下所示.   Input 输入数据的 ...

  7. C++豆知识索引

    C++Memset误区 C++ 哈希表 C++类型转换[转] C++ sizeof C++ 路径中\\与/

  8. java中文乱码解决之道(六)—–javaWeb中的编码解码

    在上篇博客中LZ介绍了前面两种场景(IO.内存)中的java编码解码操作,其实在这两种场景中我们只需要在编码解码过程中设置正确的编码解码方式一般而言是不会出现乱码的.对于我们从事java开发的人而言, ...

  9. servletContext百科

    servletContext 编辑   servletContext接口是Servlet中最大的一个接口,呈现了web应用的Servlet视图.ServletContext实例是通过 getServl ...

  10. Java里的接口

    Java里面由于不允许多重继承,所以如果要实现多个类的功能,则可以通过实现多个接口来实现. Java接口和Java抽象类代表的就是抽象类型,就是我们需要提出的抽象层的具体表现.OOP面向对象的编程,如 ...