存储器结构围绕着局部性:具有良好局部性的程序倾向于访问邻近的数据项集合。


随机访问存储器(Random-Access-Memory)


静态RAM

  1. 只要有电就保持不变无需刷新。
  2. 读取速度快。
  3. 对干扰不敏感。
  4. 造价贵,主要用于高速缓存存储器。

动态RAM

  1. 对干扰敏感,由于会漏电而需要周期性的刷新。
  2. 读取速度较慢。
  3. 造价便宜,可用作主存和帧缓冲区。

为何将DRAM设计成二维矩阵而非线性数组:减少芯片地址上的引脚数。

增强的DRAM

基于传统DRAM,进行优化,改进访问速度。

  1. 快页模式DRAM(Fast Page Mode DRAM,FPM DRAM)。

传统的DRAM将超单元的一整行拷贝到它的内部缓冲区,使用一个,然后丢弃剩余的。

FPM DRAM允许对同一行连续地访问可以直接从行缓冲区获得服务。

  1. 扩展输出DRAM(Extended Data Out DRAM,EDO DRAM)

FPM DRAM的一个增强形式,它允许单独的CAS信号在时间上靠的紧密一些。

  1. 同步DRAM(Synchronous DRAM,SDRAM)

就它们与存储控制器通信使用一组显示的控制信号来说,常规的,FPM,EDO都是异步的。

最终效果就是SDRAM能够比那些异步的存储器更快输出超单元内容。

  1. 双倍数据速率同步DRAM(Double Date-rate Synchronous DRAM,DDR SDRAM)

DDR SDRAM是对SDRAM的一种增强。

通过使用两个时钟沿作为控制信号,从而使DRAM 速度翻倍。。

  1. 视频RAM

主要用在图形系统的帧缓冲区中。

非易失性存储器

DRAM和SRAM断电后会丢失信息,是易失的。

由于历史原因,虽然ROM有的类型既可以读也可以写,但是它们整体被称为只读存储器(Read-Only Memory,ROM)。

  1. PROM (Programmable ROM,可编程ROM)

只能够被编程一次。PROM的每个存储器有一个熔丝,它只能用高电流熔断一次。

  1. 可擦写可编程ROM(Erasable Programmable ROM,EPROM)

EPROM能够被擦除和重编程的次数数量级可达1000次,电子可擦除PROM(EEPROM)类似EPROM,能编程的次数的数量级达到10^5级别

  1. 闪存(Flash Memory)

闪存也是一类非易失性存储器,基于EEPROM,已经成为一种重要的存储设备。

固态硬盘(Solid State Disk,SSD):基于闪存的磁盘驱动器。

固件(firework):存储在ROM设备中的程序,系统通电后会运行储存在ROM中的固件。


磁盘存储


从磁盘上读信息的时间为毫秒级,比从DRAM读慢了10w倍,比从SRAM读慢了100w倍。

磁盘构成

磁盘容量

对于与DRAM和SRAM容量相关的计量单位,1K=210,M=220,G=230;对于与像磁盘和网络一样的I/O设备容量相关的计量单位,通常1K=103,M=106,G=109。

磁盘操作

逻辑磁盘块

访问磁盘和连接I/O设备


固态硬盘


局部性


局部性分为时间局部性和空间局部性,在具有良好的时间局部性的程序中,被引用过的的一次内存位置很可能在不久的将来再次被引用,在具有良好的空间局部性的程序中,如果一个内存位置被引用过一次,那么程序很可能在不久的将来引用附近的一个内存位置。

for(int i=0;i<N;i++)
sum+=nums[i];/*对sum而言有良好时间局部性,对nums而言有良好空间局部性*/

像上面这样访问nums,成为步长为1的引用模式/顺序引用模式,一个连续向量中,每隔k个元素进行访问,称为步长为k的引用模式。一般而言,随步长增加,空间局部性下降。


存储器层次结构


速度较快的技术每字节的成本要比速度较慢的高,而且容量较小。对于一个典型的存储器层次结构,一般而言从底层往高层走,存储设备变得更大、更慢、更便宜。

缓存

高速缓存(cache) 是一个小而快速的存储设备。

缓存(caching):使用高速缓存的过程。

第k+1层存储器被划分为来纳许的数据对象组块,即块(block),块可以是固定大小也可以是可变大小,数据总以块的大小来传输数据。

  • 缓存命中

程序需要第k+1层数据,在第k层中的块查找,若该数据刚好存在于第k层,则称为缓存命中。

  • 缓存不命中

强制性不命中/冷不命中:即k层缓存为空,又叫冷缓存,这种不命中是短暂事件,不会重复执行。

冲突不命中:某些对象映射到同一个缓存块,导致缓存一直不命中。

容量不命中: 缓存太小而无法处理工作集。

一旦发生不命中,就要驱逐/替换某个牺牲块


高速缓存存储器


S:2^s组数

E:每组的行数

B=2^b:块大小(字节)

m=log2(M):物理地址位数

C=SxExB:容量大小

抖动(thrash):高速缓存反复地加载和驱逐相同的高速缓存块的组。

采用中间的位做索引: 相邻的块能够映射到不同的高速缓存行中,使得对高速缓冲使用效率提高。


如何编写高速缓存友好的代码


  • 让最常见的情况运行得快

将注意力放在核心函数的循环中

  • 尽量减少每个循环内部的缓存不命中数量

1.对局部变量反复引用

2.使用步长为1的引用方式

csapp第六章笔记-存储器结构的更多相关文章

  1. 《HALCON数字图像处理》第六章笔记

    目录 第六章 图像增强 图像增强的概念和分类 灰度变换 直方图处理 图像的平滑 图像的锐化 图像的彩色增强 我在Gitee上建了个仓库,会将学习书本的时候打的一些代码上传上去,笔记中所有代码都在仓库里 ...

  2. unix环境高级编程第六章笔记

    口令文件 阴影口令 组文件 附属组ID 登录账户记录 系统标识 口令文件<\h2> /etc/passwd文件是UNIX安全的关键文件之一.该文件用于用户登录时校验用户的口令,文件中每行的 ...

  3. 《Javascript高级程序设计》第六章笔记整理

    一.创建对象的方法(6种) 1.工厂模式 即用函数来封装以特定接口创建对象的细节. function createPerson(name,age,job){ var o = new Object(); ...

  4. 鸟哥的Linux私房菜:基础学习篇 —— 第六章笔记

    1.下面这些就是比较特殊的目录,得要用力的记下来才行: . 代表此层目录 .. 代表上一层目录 - 代表前一个工作目录 ~ 代表“目前使用者身份”所在的主文件夹 ~account 代表 account ...

  5. 第六章.MyBatis缓存结构

    一级缓存 测试案例: MyBatisTest.java //缓存 @Test public void testFindCustomerCache1() throws Exception{ SqlSes ...

  6. 《python编程从入门到实践》第六章笔记

    1.字典 字典:一系列键-值对,每一个键都与每一个值相关联.与键相关联的值可以是数字.字符串.列表和字典. 最简单的字典只有一个键值对. eg: alien = {'color':'green','p ...

  7. [CSAPP笔记][第六章存储器层次结构]

    第六章 存储器层次结构 在简单模型中,存储器系统是一个线性的字节数组,CPU能够在一个常数访问每个存储器位置. 虽然是一个行之有效的模型,但没有反应现代系统实际工作方式. 实际上,存储器系统(memo ...

  8. 韩松毕业论文笔记-第六章-EFFICIENT METHODS AND HARDWARE FOR DEEP LEARNING

    难得跟了一次热点,从看到论文到现在已经过了快三周了,又安排了其他方向,觉得再不写又像之前读过的N多篇一样被遗忘在角落,还是先写吧,虽然有些地方还没琢磨透,但是paper总是这样吧,毕竟没有亲手实现一下 ...

  9. Java 接口与继承 道至简第六章发表阅读笔记

    一.继承条件下的构造方法调用 class Grandparent { public Grandparent() { System.out.println("GrandParent Creat ...

随机推荐

  1. Mybatis执行流程浅析(附深度文章推荐&面试题集锦)

    首先推荐一个简单的Mybatis原理视频教程,可以作为入门教程进行学习:点我 (该教程讲解的是如何手写简易版Mybatis) 执行流程的理解 理解Mybatis的简单流程后自己手写一个,可以解决百分之 ...

  2. [Qt2D绘图]-03坐标系统之坐标变换

    大纲:     基本变换         介绍和常用API     窗口-视口转换         窗口         视口         让窗口和视口维持相同宽高比来防止变形   基本变换 默认 ...

  3. 题解 洛谷 P4547 【[THUWC2017]随机二分图】

    根据题意,题目中所求的即为所有\(n!\)种完美匹配的各自的出现概率之和再乘上\(2^n\)的值. 发现\(n\)很小,考虑状压\(DP\).设\(f_{S,T}\)为左部图匹配情况为\(S\),右部 ...

  4. linux nginx 部署多套服务(以react包为例)

    前言 今天我特地写下笔记,希望可以完全掌握这个东西,也希望可以帮助到任何想对学习这个东西的同学. 本文用nginx部署服务为主要内容,基于CentOs 7.8系统. 文档版本:1.0.1 更新时间:2 ...

  5. 面试题五十七:和为s的数字

    题目一:和为s的数字,在一个递增数组中寻找两个数字的和等于s 方法:双指针法,一个在头一个在尾:如果两个指针指向的和小于,那么be++:大于end--: 题目二:打印所有和为s的连续正数序列 方法:双 ...

  6. 羞羞的Python模块包

    目录 一.pip 二.pip常用命令 三.No module 'xxxxx' 四.写在最后   前言 写Python代码的时候,经常会遇到包的问题,但是都是遇到一次,搜索一次,解决了.下一次还是同样的 ...

  7. 第三节:Centos下安装Mysql5.6数据库

    1.下载mysql5.6版本 [官网-需要什么版本自己去找]https://dev.mysql.com/downloads/mysql/5.6.html [版本]linux通用 cd /usr/loc ...

  8. eclipse IDE usage of my own and tutorials link list

    设置 字符集 Eclipse 修改字符集 默认情况下 Eclipse 字符集为 GBK,但现在很多项目采用的是 UTF-8,这是我们就需要设置我们的 Eclipse 开发环境字符集为 UTF-8, 设 ...

  9. 了不起的Node.js 5/16

    Chapter 1 安装 1.Node.js的设计理念之一,只维护较少量的依赖,这使得安装node.js变得非常简单. 2.执行文件console.log没问题,但是node执行http静态服务器的时 ...

  10. Python匿名函数_return语句

    Python匿名函数: 使用 lambda 关键字创建匿名函数: lambda 定义的函数只是一个表达式,而不是代码块 lambda 函数拥有自己的命名空间,不能够访问参数列表之外的 或 全局命名空间 ...