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

    http://codeforces.com/problemset/problem/23/E 题意:给一个树,求砍断某些边,使得所有联通块大小的乘积最大.思路:f[i][j]代表当前把j个贡献给i的父亲 ...

  2. Android隐藏标题栏

    打开程序,在onCreate()方法中添加如下代码: protected void onCreate(Bundle savedInstanceState) { super.onCreate(saved ...

  3. FE: Sass and Bootstrap 3 with Sass

    Sass简介 Sass是CSS的预处理语言:提供了变量定义.函数定义.函数调用.类继承.嵌套(CSS层级关系)及代码引入功能. Sass安装指南 MAC OS X 10.10.3   终端 -> ...

  4. crontab,at命令,常见问题

    crontab命令 前 一天学习了 at 命令是针对仅运行一次的任务,循环运行的例行性计划任务,linux系统则是由 cron (crond) 这个系统服务来控制的. Linux 系统上面原本就有非常 ...

  5. Android ImageView的scaletype属性

    ImageView的属性android:scaleType,即 ImageView.setScaleType(ImageView.ScaleType).android:scaleType是控制图片如何 ...

  6. java模拟http post

    我们将使用java.net.URLConnection来完成一次post请求,假设要post数据到http://localhost:8080/doSome上: URLConnection urlCon ...

  7. 【Python基础】计算项目代码行数

    统计代码行数 # coding: utf-8 import os import sys import time def get_line_count(file_path): ""& ...

  8. sql server 2008 在安装了活动目录以后无法启动服务了

    软件环境: windows server 2008 r2 ms sql server 2008 r2 在安装活动目录以前,数据库是正常运行的. 安装了活动目录以后,数据库启动时就提示无法启动.出错的信 ...

  9. VS2010旗舰版安装图解

    微软公布了最新的 Visual Studio 2010 软件开发编程平台及 .Net Framework 4 框架.这次 VisualStudio 2010 包含 Professional 专业版.P ...

  10. Cocos2D-x权威指南: CCNode类方法:

    5.1.4 画图节点CCNode和图层CCLayer CCNode中提供的方法,在public块中的方法主要有下面几个部分: 1.针对节点显示的属性信息读写 2.针对节点变换的属性信息读写 3.针对子 ...