CSAPP--存储器及程序的局部性
作为一名程序员,你需要理解计算机存储系统的层次结构,他对应用程序的性能有着巨大的影响,如果程序所需要的数据存储在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--存储器及程序的局部性的更多相关文章
- CSAPP 5 - 优化程序性能
CSAPP 5 - 优化程序性能 1. 概述 首当其冲的,还是要编写出好的算法和数据结构,优化内部结构 其次才是编写出能让编译器 易优化的,高效的可执行代码.这点在特定的机器上可能有着特定的不同的优化 ...
- CSAPP(2):程序的汇编表示(Linux版)
程序员学习汇编代码的需求随着时间的推移发生了变化,开始时只要求程序员能直接用汇编语言编写程序,现在则要求他们能够阅读和理解编译器产生的代码. 下面是针对32位机器 数据格式 Intel用术语“字”(w ...
- CUDA Texture纹理存储器 示例程序
原文链接 /* * Copyright 徐洪志(西北农林科技大学.信息工程学院). All rights reserved. * Data: 2012-4-20 */ // // 此程序是演示了1D和 ...
- 【CSAPP笔记】11. 存储器层次结构
在没有专门研究存储器系统之前,我们依赖的存储器模型是一个很简单的概念,也就是把它看成一个线性数组,CPU 能在一个常数时间内访问任何一个存储器位置.虽然在研究别的问题时,这是一个有效的模型,但是它不能 ...
- csapp第六章笔记-存储器结构
目录 随机访问存储器(Random-Access-Memory) 静态RAM 动态RAM 增强的DRAM 非易失性存储器 磁盘存储 磁盘构成 磁盘容量 磁盘操作 逻辑磁盘块 访问磁盘和连接I/O设备 ...
- 【深入理解计算机系统CSAPP】第六章 存储器层次结构
6 存储器层次结构 存储器系统(memory system)是一个具有不同容量.成本和访问时间的存储设备的层次结构.CPU 寄存器保存着最常用的数据.靠近 CPU 的小的.快速的高速缓存存储器(cac ...
- 系统级编程(csapp)
系统级编程漫游 系统级编程提供学生从用户级.程序员的视角认识处理器.网络和操作系统,通过对汇编器和汇编代码.程序性能评测和优化.内存组织层次.网络协议和操作以及并行编程的学习,理解底层计算机系统对应用 ...
- ****** 三十四 ******、软设笔记【存储器系统】-Cache存储器
Cache存储器 Cache(高速缓冲存储器) 高速缓冲存储器是位于主存与CPU之间的一级存储器,有静态存储芯片(SRAM)组成,容量比较小,速度比主存高得多,接近于CPU的速度,单位成本比内存高.C ...
- 基于《CSAPP第九章 虚拟内存》的思考和总结
在csapp的描述中,虚拟内存的形象更加具化,虚拟内存被组织为一个由存放在磁盘上的N个连续的字节大小的单元组成的数组,内存充当了磁盘的缓存,粗呢内存的许多概念与SRAM缓存是相似的.虚拟页面有以下三种 ...
随机推荐
- 安卓各文件存储路径汇总(Android file path)
写下来,省得以后不记得到处翻: Environment.getDataDirectory() = /data Environment.getDownloadCacheDirectory() = /ca ...
- Android进阶2之PopupWindow弹窗(有点悬浮窗的感觉)
PopupWindow是一个可以用来显示一个任意的视图的弹出窗口,他需要完全依赖layout布局. 它没什么界面,在弹出的窗口中完全显示布局中的控件. 上面两个美女头就是弹窗PopupWindow显示 ...
- MySQL中的concat函数
select concat('数据库',cast('aa' as char),'查询') as str
- Altium Designer规划电路板
所谓规划电路板就是根据电路的规模以及用户的需求,确定所要制作电路板的物理外形尺寸和电气边界.电路板规划的原则是在满足用户要求的前提下,使板面美观而且利于后面的布线工作. 1. 定义板的外 ...
- android merge 标签的使用
<merge xmlns:android="http://schemas.android.com/apk/res/android"> <ToggleButton ...
- Linux read语法及浅析
read命令 -n(不换行) -p(提示语句) -n(字符个数) -t(等待时间) -s(不回显) 1.基本读取read命令接收标准输入(键盘)的输入,或其他文件描述符的输入(后面在说).得到输入后, ...
- rcp命令
rcp命令 rcp代表“remote file copy”(远程文件拷贝).该命令用于在计算机之间拷贝文件.rcp命令有两种格式.第一种格式用于文件到文件的拷贝:第二种格式用于把文件或目录拷贝到另一个 ...
- sdl2.0示例
// gcc -o testDrone2_video testDrone2_video.c -lavcodec -lavformat -lswscale -lSDL2// g++ -o testDro ...
- 判断UserAgent是否为手机
, ))) { return true; } return false; }
- android TextView 添加下划线
android Textview加下划线 由于新做的一个项目要求有字体带下划线效果,当时看了下其实可以通过图片伪造出那种视觉效果.但是为了体现点技术含量,于是我想用Textview带下划线的效果.方法 ...