作为一名程序员,你需要理解计算机存储系统的层次结构,他对应用程序的性能有着巨大的影响,如果程序所需要的数据存储在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. Web Server PROPFIND Method internal IP Discosure

    Title:Web Server PROPFIND Method internal IP Discosure  --2012-11-09 09:47 Nessus扫描出来一个安全缺陷,Web Serv ...

  2. hdu 1543 Paint the Wall

    http://acm.hdu.edu.cn/showproblem.php?pid=1543 #include <cstdio> #include <cstring> #inc ...

  3. 分布式文件系统 FastDFS Ceph

    分布式文件系统 FastDFS Cephhttp://www.oschina.net/p/fastdfshttp://www.oschina.net/p/ceph FastDFS 的 Go 客户端 f ...

  4. python 发邮件

    http://www.cnblogs.com/xiaowuyi/archive/2012/03/17/2404015.html http://my.oschina.net/lenglingx/blog ...

  5. 安卓,分享到facebook的若干种方法汇总

    近期做了facebook的分享功能,遇到了很多问题,这里总结一下,供大家参考,不足之处还请大家指正. facebook分享方式: 1.通过intent调用调用本地facebook应用方式 支持单独分享 ...

  6. storm高级原语-Transactional topology

    参考: http://xumingming.sinaapp.com/736/twitter-storm-transactional-topolgoy/ http://xumingming.sinaap ...

  7. Shell中变量的使用

    1.变量的声明 name="blacksonny" 注意://变量定义时不加$,变量与等号之间不能有空格 变量命名规则: 首个字符必须为字母(a-z,A-Z). 中间不能有空格,可 ...

  8. wpf在异步中给前台赋值

    wpf,新建异步方法: Thread newThread = new Thread(new ParameterizedThreadStart(GetResult)); newThread.Start( ...

  9. openwrt上网配置的一些理解(四)

    这次要解决的问题是3g上网和wan口上往可以随意切换,当然能够叠加也是好事,不过这不是我关心的.下面还是修改3个文件network,firewall,multiwan.首先在network中加入界面配 ...

  10. Linux下Weblogic域的创建过程

    环境介绍:操作系统 :Redhat 5.5Weblogic :英文版 8.1.6 Weblogic安装目录 :/weblogic 一.域的建立执行下面语句进入weblogic的bin目录: cd /w ...