【第 5 周】深入理解计算机系统共读心得体会

所在小组

第七组

组内昵称

吴奇驴

你的心得体会

  1. cpu读取数据速度: 寄存器 > L1高速缓存(SRAM) > L2高速缓存(SRAM) > L3高速缓存 (SRAM)> 主存(DRAM) > 本地磁盘 > 分布式文件系统、Web服务器;
  2. 固态硬盘和机械硬盘各有利弊,固态硬盘正常使用寿命也是相当长的了;
  3. 缓存不命中:访问冷缓存时的不命中称为强制性不命中或冷不命中,通常是短暂事件,不会在访问存储器使得缓存暖身之后的稳定状态中出现;当某个阶段的工作集大小超过缓存大小的时候,缓存就会经历容量不命中。
  4. 存储器山:一个程序从存储系统中读数据的速率称为读吞吐量,或者有时称为读带宽;如果编写以恶搞程序从紧密程序循环中发出一系列读请求,那么测量出的读吞吐量能让我们看到对于这个读序列来说的存储系统的性能;我们可以通过不同的size(时间局部性)和stride(空间局部性)的值来调用run函数,产生某台计算机的存储器山;

所在小组
第一组

组内昵称
盆栽Charming

心得体会
这里

所在小组
第一组

组内昵称
成都-张仁杰

心得体会

主存读事务 :

首先总线接口在总线上发起读事务;读事务分为三个部分:

首先CPU将地址A放在内存总线上。

主存感觉到了总线的地址信号,从内存总线中读取地址,从DRAM中取出数据字。

CPU感觉到总线上的数据,将数据从总线上读取,并将数据复制到寄存器中。

主内存写事务:

CPU将地址A放到系统总线上,内存从内存总线中读出地址,等待数据到达。

CPU将寄存器中的数据字复制到系统总线上。

主存从系统总线上读取出数据字,并将此存储在DRAM中。

SSD的特点:

  1. 读要比写快(原因有2:①写之前擦除块需要相对来说比较长的时间②如果写操作试图修改一个包含已有数据的页,那么这个快所带有的数据也需要复制到一个新的块中)
  2. 能耗更低
  3. 因为闪存块会磨损,所以SSD也容易磨损。
    ssd

所在小组

第六组

组内昵称

慎思明辨笃行

你的心得体会

存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速的高速缓存(SRAM)作为一部分存储在相对慢速的主存储器(DRAM)中数据和指令的缓冲区域。主存储器(DRAM)缓存存储在容量较大的、慢速磁盘(本地磁盘)上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带(分布式文件系统,Web服务器)上的数据的缓存区域。

局部性是计算机程序的一个基本属性。具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合,或是倾向于访问邻近的数据项集合。具有良好局部性的程序比局部性差的程序更多地倾向于从存储器层次结构中较高层次处访问数据项,因此运行得更快。

一、存储技术

1.1、随机访问存储器

随机访问存储器(RAM)分为两类:静态RAM(SRAM)和动态RAM(DRAM)。

1、静态RAM

SRAM将每个位存储在一个双稳态的存储器单元里,每个单元用六个晶体管电路实现(成本相对高)。双稳态就是电路可以无限期地保持在两个不同的电压配置或状态之一。其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速地转移到两个稳定状态中的一个。

由于双稳态特性,SRAM只要有电,它就会永远保持它的值(抗干扰性强)。

2、动态RAM

DRAM将每个位存储为对一个电容的充电,每个单元由一个电容和一个访问晶体管组成(成本相对低)。与SRAM不同,DRAM存储器单元对干扰非常敏感(抗干扰性弱)。当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变。

内存系统必须周期性地通过对DRAM读出,然后重写来刷新内存每一位。

3、传统的DRAM

DRAM芯片中的单元(位)被分成d个超单元,每个超单元由 [w] 个DRAM单元组成。一个d * [公w] 的DRAM总共存储了d [w] 位信息。

超单元被组织成一个r行c列的长方形矩阵,其中r * c = d。

每个超单元有形如(i, j)的地址,i表示行,j表示列。

信息通过称为引脚的外部连接器流入和流出芯片。每个引脚携带一个1位的信号。

有两种引脚:

  • addr引脚 —— 携带行和列超单元地址
  • data引脚 —— 传送字节到芯片,或从芯片传出字节

每个DRAM芯片被连接到某个称为"内存控制器"的电路,内存控制器通过addr引脚和data引脚与DRAM进行数据的交互。

4、内存模块

DRAM芯片封装在内存模块中,它插到主板的扩展槽上。

Core i7系统使用240个引脚的双列直插内存模块。

下图展示了用8个8M(超单元数) * 8(每个超单元存储一个字节)的DRAM芯片构成的内存模块,总共存储64MB(8 * 8M * 8B)。

用各个DRAM芯片中相应超单元地址都为(i, j)的8个超单元来表示主存中字节地址A处的64位字。DRAM 0存储第一个(低位)字节,DRAM 1存储下一个字节,依次类推。

要取出内存地址A处的一个字,内存控制器将A转换成一个超单元地址(i, j),并将它发送到内存模块,然后内存模块再将i和j广播到每个DRAM。作为响应,每个DRAM输出它的(i, j)超单元的8位内容。模块中的电路收集这些输出,并把它们合并成一个64位字,再返回给内存控制器。

5、增强的DRAM

一些后来发展并增强DRAM:

  • 块页模式DRAM(Fast Page Mode DRAM, FPM DRAM)
  • 扩展数据输出DRAM(Extended Data Out DRAM,EDO DRAM)
  • 同步DRAM(Synchronous DRAM, SDRAM)
  • 双倍数据速率同步DRAM(Double Data-Rate Synchronous DRAM, DDR SDRAM)
  • 视频RAM(Video RAM,VRAM)

6、非易失性存储器

如果断电,DRAM和SRAM会丢失它们的信息,它们是易失的。

而非易失性存储器即使是在关电后,仍然保存着它们的信息。

只读存储器(ROM)以它们能够被重编程(写)的次数和对它们进行重编程所用的机制来区分的:

  • 可编程ROM(Programmable ROM, PROM) —— 只能被编程一次
  • 可擦写可编程ROM(Erasable Programmable ROM,EPROM) —— 被擦除和重编程的次数的数量级可以达到1000次
  • 电子可擦除PROM(Electrically Erasable PROM, EEPROM) —— 能够被编程的次数的数量级可以达到 [10的5次方]

7、访问主存

数据流通过总线在CPU和DRAM主存之间传输。这些传输的过程称为总线事务。

读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。

所在小组

第七组

组内昵称

陈盛华

心得体会

还是用一个例子去解释自己学到的知识吧,虽然这是一本大部头的书籍,我这里还是用了以前的方法,先死后活(死记硬背的知识预先了解好,后面向着灵活运用的方向走,比如用一个例子去学习)

存储器是为了存储数据而创造的一个设备,但是随着cpu发展越来越迅速,普通机械硬盘的速度和cpu的差距高达一亿倍,ssd固态和cpu相差也有十万倍,所以就需要一个缓冲层设备——内存,用内存来解决速度差异过大的问题。

1995的创建的内存速度也和cpu有一千倍左右的差距,直到2015年也有百倍的差距。

存储器的形式有多种,简单的分有断电丢失数据的,还是断电也可保存数据。我们的硬盘,硬盘缓存,内存,cpu高速缓存都可以被称为存储器。一个大原则是,越靠近cpu的缓存速度越快

局部性原理能够好的运用存储器,局部发分为:时间局部性和空间局部性。用一个例子来解释,浏览器访问网站的图片文件会被保存下载,期待下一次再被访问,就可以直接在本地获取,这个叫时间局部性,而被访问网站的所有图片文件都被加载到一个内存地址附近,称为空间局部性。

所在小组: 第五组
组内昵称: 肖思成
心得体会:

  • 存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。CPU寄存器保存着最常用的数据。靠近CPU的小的、快速的高速缓存存储器作为一部分存储在相对慢速的主存储器中数据和指令的缓冲区域。主存储器缓存存储在容量较大的、慢速磁盘上的数据,而这些磁盘常常又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓存区域。

  • 存储器
    磁盘可以存储大量的数据,但是速度慢
    磁盘由盘片组成,每个盘片有两面,上面覆盖着磁性记录材料,盘片中央有一个可以旋转的主轴

  • 局部性 是计算机程序的一个基本属性。具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合,或是倾向于访问邻近的数据项集合。具有良好局部性的程序比局部性差的程序更多地倾向于从存储器层次结构中较高层次处访问数据项,因此运行得更快。

局部性又分为两个方面:

  1. 时间局部性
  • 有良好的时间局部性程序中,被引用过一次的存储器很有可能在不久的将来再被多次调用
  1. 空间局部性
  • 有良好空间局部性程序中,被引用过一次的存储器,很有可能在不久的将来引用其附近临近的存储器。

  • 基本的存储技术——SRAM存储器、DRAM存储器、ROM存储器以及旋转的和固定的硬盘

存储技术

  1. 静态RAM:SRAM将每个位存储子啊一个双稳态的(bistable)存储单元里
  2. 动态RAM:DRAM将每个位存储为对一个电容的充电
  3. 传统的DRAM:DRAM芯片中的单元(位)被分成d个超单元(supercell),每个超单元都由w个DRAM单元组成。
  4. DRAM芯片封装在内存模块中,它查到主板的扩展槽上。
  5. 增强DRAM:快页模式DRAM、扩展数据输出DRAM、同步DRAM、双倍数据速率同步DRAM、视频RAM

所在小组

第六组

组内昵称

之昂

心得体会

  • 存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。cpu保存最常用的数据,靠近cpu的高速缓存储器作为一部分存储在相对慢速的主存储器中的数据和指令的缓冲区域。主存缓存在容量比较大的磁盘,这些磁盘又作为存储在通过网络连接的其他机器的磁盘或磁带上的数据的缓冲区域。
  • 随机访问存储器分为两类:静态和动态。静态比动态快,也贵。静态用来作为高速缓存存储器,既可以在cpu芯片上,也可以在片下。动态用来作为主存以及图形系统的帧缓冲区。
  • 磁盘存储:磁盘由盘片构成,每个盘片有两面或者成为表面。表面覆盖这磁性记录材料。磁盘是由一个或多个叠放在一起的盘片组成,被封装在一个密封的包装。
  • 局部性:两种表现形式时间局部性和空间局部性。

所在小组

第一组

组内昵称

Nigel

你的心得体会

  1. 存储器的缓存思想依赖程序的局部性(时间局部性和空间局部性),基于局部性的缓存设计体现在单机程序设计/分布式系统设计的方方面面。
  2. 主存分为DRAM和SRAM,他们断电都丢数据。但是DRAM漏电需要刷新,掉电也会丢失,便宜。SRAM不需要刷新(双稳态),速度也快(就是贵)
  3. 机械硬盘一次寻址需要寻道(几毫秒)、旋转(几毫秒,和寻道大致相等)、传送(微秒),定位到要读取的字节是最慢的,访问时间与其相比几乎可以忽略不计。和主存的访问速度有千倍差距。磁盘的格式化只是在磁道之间的GAP里添加一些标志信息,比如是否已经格式化,是否坏道等。
  4. 操作系统对固态硬盘和机械硬盘都提供了相同的抽象
  5. 读写速度方面,机械硬盘的随机读写速度按原理来讲是差别不大的(因为感觉大头是寻址和旋转)。但是固态硬盘的写速度比读速度慢很多。
    磁盘存储
  • 磁盘结构
    • 由盘片构成,每个盘片由两个盘面,盘面覆盖着磁性记录材料,每个面由一组磁道的同心圆组成,每个磁道被划分为一组扇区,每个扇区包含相等数量的数据位,扇区之间由一些间隙分隔开,盘片中央有一个可以旋转的主轴,它使得盘片以固定的旋转速率旋转,通常5400~15000转每分钟
    • 磁盘容量 一个磁盘上可以记录的最大位数称为它的最大容量,
      • 记录密集,磁道一英寸的段中可以存放的位数
      • 磁道密度,从盘片中心出发一英寸的段内可以有的磁道数
      • 面密度,记录密度与磁道密度乘积
    • 磁盘操作 磁盘由读/写头来读写存储在磁性表面的位 读写头连接一个转动臂的一段来进行寻道.
  • 固态硬盘
    • 是一种基于闪存的存储技术,读比写快。
    • 由半导体存储器构成,易磨损
  1. 磁盘访问时间
  • 寻道时间:移动磁盘臂需要的时间
  • 旋转时间:等待目标扇区就位的时间
  • 传送时间:读取目标扇区数据的时间
    读取512字节扇区大小的块在SRAM大约256ns,对DRAM大约4000ns,对于磁盘大约10ms。
    设备可以直接执行读和写总线事物而不要CPU干涉,这种称为直接内存访问(DMA)

SSD的特点:

  1. 读要比写快(原因有2:①写之前擦除块需要相对来说比较长的时间②如果写操作试图修改一个包含已有数据的页,那么这个快所带有的数据也需要复制到一个新的块中)
  2. 能耗更低
  3. 因为闪存块会磨损,所以SSD也容易磨损。

所在小组

第六组

组内昵称

黄永平

你的心得体会

1、存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。
2、作为一个程序员,你需要理解存储器层次结构,因为它对应用程序的性能有着巨大的影响。CPU寄存器、TLB访问延迟0个周期数,L1、L2、L3高速缓存访问延迟4、10、50个周期数,主存需要上百个周期,而如果存储在磁盘上,需要大约几千万个周期!
3、局部性通常有两种不同的形式:时间局部性和空间局部性。程序员应该理解局部性原理,因为一般二月 ,有良好局部性的程序比局部性差的程序运行得更快。现代计算机系统的各个层次,从硬件到操作系统、再到应用程序,他们的设计都利用了局部性。

  • 重复引用相同变量的程序有良好的时间局部性
  • 对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。
  • 对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。

4、编写高速缓存友好的代码,从具有良好局部性的意义上说,好的程序员总是应该试着去编写高速缓存友好的代码。

  • 让最常见的情况运行得快
  • 尽量减少每个循环内部的缓存不命中数量

所在小组

第七组

组内昵称

李佳

你的心得体会

  • 写程序时若能让程序访问相同的数据项集合或者邻近的数据项集合,会使得程序在较高层次访问数据项,因此运行的更快。
  • 访问数组时,step越短空间局部性越好。
  • 统一数据对象尽量被多次使用。
  • 存储器的访问速度和容量成反比,容量越大,寻找地址越慢,访问越慢,容量小,寻找地址则快。
  • 每层结构缓存都来自低一层的数据对象。
  • 缓存命中和不命中的具体情况还是不知道什么时候会遇到,希望能找到实例来让以后写代码时候注意到。
  1. 所在小组: 静默组
  2. 组内昵称:frances
  3. 心得体会

作为开发者需要理解存储器层次结构,以及了解系统是如何将数据在存储器层次结构中移动,这样在编写程序时可以利用这些特性来提升性能。其中最主要的就是局部性原理,具有良好局部性的程序会更倾向于从较高层次访问数据,减少CPU访问时间。

  • 将注意力集中在内循环上,大部分计算和内存访问都发生在这里;
  • 通过按照数据对象存储在内存中的顺序,以步长为1的来读取数据,使得程序空间局部性最大;
  • 一旦从存储器中读入了一个数据对象,就尽可能多地使用它,从而使得程序中的时间局部性最大;
    这一章我是结合和CMU的课程视频来学习的,相比前几章来说,在看书之前已经了解了哪些重点概念需要关注,个人感觉效果还不错。

首先从基本的存储技术学习:

  • RAM 随机访问存储器:
    • SRAM,静态随机访问存储器,常用来做高速缓存,可以在CPU芯片上也可以在片下。将每个位都存储在一个双稳态存储器单元里,每个单元由一个六晶体管电路实现。只要有电就会永远保持它的值,即使有干扰来扰乱电压,消除后也会立即恢复到稳定值。
    • DRAM,动态随机访问存储器,常用来作为主存以及图形系统的帧缓冲。每个位存储为对一个电容的充电,对干扰非常敏感,当电容的电压被扰乱后就永远不会恢复了。
    • 两者相比,只要供电SRAM就会保持不变,与DRAM不同,不需要刷新。SRAM的存取也比DRAM快得多,但是SRAM比DRAM单元使用更多的晶体管,因此密集度低,更贵且功耗更大。
    • 传统DRAM,二维阵列,读取时先RAS(Row Access Strobe)请求再CAS(Column Access Strobe)请求。
    • 内存模块,DRAM芯片封装在内存模块中,插入主板的扩展槽,以64位为块传送数据到呢欧村控制器和从内存控制器传出数据。
    • 增强的DRAM:
      • 快页模式,允许对同一行连续地访问可以直接从行缓冲区得到服务。
      • 扩展数据输出DRAM,允许各个CAS信号在时间上靠得更紧密一些。
      • 同步DRAM,能够比一部的存储器更快输出单元内容。
      • 双倍数据速率同步DRAM,常见的DDR2 DDR4 DDR8等
      • 视频RAM,用在图形系统的帧缓冲区中。1)VRAM输出是通过依次对内部缓冲区的整个内容移位得到;2)VRAM允许对内存并行读写。
    • 非易失性存储器, 断电后依然能保存数据。 ROM, PROM, EPROM,flash memory等
    • 访问主存,通过总线的共享电子电路在处理器和DRAM主存之间传递数据。
  • 磁盘存储器:从磁盘上读取数据时间为ms级,比DRAM慢10万倍,比SRAM慢100万倍。
    磁盘的构造相关内容CMU的课程视频上讲解的比较清晰,所以看书时主要关注在于磁盘的访问。
    CPU通过内存映射I/O技术来发送命令,磁盘接受到命令后,将逻辑块号翻译成扇区地址,读取该扇区内容。然后将内容直接传到主存,不需要CPU的干涉,即DMA传送。当传送完成后,磁盘控制器通过给CPU发送一个中断信号来通知。
  • SSD固态硬盘,由半导体存储器构成,没有移动的部件,因而随意访问时间比旋转磁盘快,能耗更低且结实。不过缺点是反复写后,闪存块会磨损,通过平均磨损逻辑来将擦除平均到所有块上来最大化每块的寿命。

然后是局部性原理:空间局部性和时间局部性。现代计算机系统各个层次都有利用到局部性原理,如高速缓存等(CPU芯片、操作系统、分布式文件系统和万维网中都使用了缓存)。

最后是高速缓存相关,其结构可以用四元组(S,E,B,m)来描述,容量大小C=SEB。其结构使得它能够通过简单地检查地址位,找到请求字(类似哈希表)。1)组选择;2)行匹配;3)字抽取。 按照类型可以分为直接映射高速缓存、组相联高速缓存、全相联高速缓存。
需要注意的是,即使程序具备良好的空间局部性,高速缓存中也有足够的空间存放块,但是还可能因为映射到相同组产生抖动现象,即高速缓存反复地加载和驱逐相同的高速缓存块的组。 此时可以通过数据填充将其映射到不同的组来消除抖动冲突不命中。
高速缓存写操作:

  • 命中时,向更低一层写时分为两种:直写和写回。直写简单但是每次写都会引起总线流量;写回尽可能推迟更新,只有当替换算法驱逐该块时才写,由于局部性显著减少总线流量,但增加了复杂性。
  • 不命中时,有写分配和非写分配两种。写分配需要加载相应第一层的块到高速缓存中,然后更新,试图利用局部性原理。非写分配避开高速缓存,直接把这个字写入到下一层。直写高速缓存通常是非写分配的,写回高速缓存是写分配的。
    对开发者来说,在心里采用使用写回合写分配的高速缓存模型,在高层次开发程序展示良好的空间和时间局部性。原因:
    1)通常较长的传送时间,存储器层次结构中较低的缓存更可能使用写回;
    2)逻辑电路密度提高,写回的高复杂性也越来越不成阻碍;
    3)写回写分配试图利用局部性,和处理读的方式对称;
1 个赞

所在小组

第七组

组内昵称

高华

你的心得体会

  1. 存储系统是一个具有不同容量、价格和访问时间的存储设备的层次结构。之所以采用层次结构,是综合考虑成本和访问速度的结果。
    • 在存储器层次结构中,越靠上访问速度越快,位于顶层的寄存器的数据,cpu 只需要 0 个时钟周期就能访问到它们,而位于较低层的磁盘则需要几千万个时钟周期
    • 缓存对于存储系统非常重要,层次结构中的每一层都缓存来自较低一层的数据对象。
  2. 访问主存储器涉及到两个事务(读事务和写事务),对比汇编代码可以对主存储器的访问有更直观深入的了解。
  3. 具有良好局部性的程序运行速度会更快,平常代码没有关注过程序的局部性,编译器应该有做相应的优化。

所在小组

第二组

组内昵称

陶鑫

你的心得体会

1.SRAM 贵,稳定,集成度低,用于高速缓存存储器
2.DRAM 较便宜,不稳定,集成度高,需要定时重新读写和纠错码,用于主存和帧缓冲区
3.DRAM 的存储单元(超单元)以二元阵列排列而不是线性排列,这样可以节省管脚。请求某个超单元先发送行,此时会将行缓存到内部行缓冲区;然后发送列,此时将该行该列的超单元数据返回给请求者。传统的 DRAM 会将剩余的数据丢掉,而 FPM DRAM会缓存整行。这两种DRAM早就已经停产了,现在主流是 DDR3/4 SDRAM。
4.可擦写编程器 EEPROM 掉电数据不丢失,主要用于存储数据,如闪存(U盘)
一般的程序都具有良好的局部性,即访问的数据都是在一个较密集的区间内,这样可以提高访问效率。但局部性也导致容易受到栈溢出攻击。印象中新版本的 Linux 内核有降低局部性,防止栈溢出攻击的策略。
5.存储器层次结构的本质是,每一层存储设备都是较低一层的缓存。
6.高速缓存步骤:1. 组选择(一般用内存中间的位避免相邻的内存分到同一个组) * 2.行匹配 3. 字抽取(返回)
7.直接映射高速缓存命中遵循定的策略,在真实的程序中很常见,会导致令人困惑的性能问题。例如反复调用两个相邻的内存块(两个数组),而两个内存块映射的组索引恰好一样(块大小为2的幂时尤为容易出现),就会导致冲突不命中,只能每次重新加载。解决方案可以是稍微扩充一下内存块大小。直接映射高速缓存限制是只能有1行。
8.组相联高速缓存每组可以有多行,冲突不命中的问题得到缓解。
缓存经常会用到 write-back 机制,即更新的数据不会立刻写入到下一层,而是每隔一段时间写一次,以获得更高的性能。L1 对 RAM,RAM 对 ROM 都会用到。write-allocate 是当需要写的时候,如果没有匹配缓存,就先加载进来,而不是 write-through 直接写进去。write-back 和 write-allocate 经常一起使用。
i7 每个核心都有独立的 L1 i-cache (instructment) d-cache(data) 和 L2 unified cache。所有核心共享 L3 cache。L1 4周期,32kb,64组64块大小;L2 10周期,256KB,8行512组64块大小;L3 40-75 周期,8mb,16行8192组64块大小

所在小组

第六组

组内昵称

undefined

你的心得体会

存储技术的演变

随机存储器(RAM)

分类

  1. SDRAM:有电就可以保持稳态的存储器
  2. DDRAM:需要不断刷新才能保持稳态
  3. 内存模块:将DRAM组合的模块
  4. 增强DRAM:针对不同场景设计的内存模块
  5. 只读ROM:闪存、PROM光盘

访问方式

CPU通过总线处理数据流:从cpu发送请求至io桥,由io桥来获取内存数据

磁盘存储

有多快盘片和针头组成
查询时间:寻道+旋转+传送

固态硬盘

基于闪存的存储技术,读比写快,但易磨损

局部性

时间局部性:短时间更频繁的访问同一个数据
空间局部性:短时间内访问的数据在一块区域

局部性优化

  1. 重复引用相同的变量有时间局部性
  2. 步长为K的程序,K越小,空间局部性越好
  3. 循环体越小,指令局部性越好

高速缓存

结构

  1. 直接映射:多组一行,进行组选择,行匹配,字提取
  2. 组相联:多组多行,避免持续发生冲突不命中
  3. 全相联:一组多行

关于写

核心问题是:如何更新更低一级的缓存

  1. 直接写入:每次都写入下一层缓存
  2. 写回:尽可能推迟写入,等待缓存失效写回,减少流量,增加复杂度

核心问题:缓存未命中时的写入

  1. 写分配:加载下一层的数据至缓存,再进行写入
  2. 非写分配:直接写入更低一级

相关影响

存在多个维度来影响整个cpu的效率。

  1. 高速缓存的大小
  2. 块大小
  3. 组相联的方式
  4. 写策略的影响

所在小组

第五组

组内昵称

张学广

心得体会

第五章介绍了程序性能优化方面的知识,大体上需要注意如下几点:

  • 适当的算法和数据结构
  • 编译器友好的代码(可优化)
  • 任务并行处理

本章主要专注于前两点,本章中主要介绍了如下几种场景的优化:

  • 消除循环的低效率
  • 减少不必要的内存引用
  • 循环展开
  • 提高并行

除此之外还简单介绍了微处理器。

本章更像是前几章学习的应用,我们学了前几章就是为了让程序更高效的执行,而本章通过几个场景的介绍,带领我理解了如何优化代码,学会将底层知识运用到实际编码中,自己也在未来写代码的过程中多多考虑性能优化问题,写出更好的代码吧。

所在小组

静默组

组内昵称

清风环佩

心得体会

按照访问速度,可大致将存储器分为以下几层:

  1. L0,寄存器,存在于CPU中,访问速度为1个时钟周期;
  2. L1和L2高速缓存,使用静态随机访问存储器SRAM,将每个位存储在一个双稳态的存储器单元里,每个单元是用一个六晶体管电路来实现,极其稳定。存在于CPU中,单核独占。L1和L2的访问速度分别是4个和10个时钟周期;
  3. L3高速缓存,使用SRAM,所有CPU核心共享,保存着从主存高速缓存取出的缓存行,访问速度为50个时钟周期;
  4. 主存,即常说的内存,使用动态随机访问存储器DRAM,每个存储单元由一个电容和一个访问晶体管组成,属性为不稳定。保存着从本地磁盘取出的磁盘块,访问速度一般为160ns。
  5. 本地磁盘,现阶段分为机械硬盘和固态硬盘,机械磁盘使用盘片作为存储介质,平均寻道时间为15ms;固态硬盘使用闪存作为存储介质,按照品牌不同,闪存页访问速度为60微妙左右,是机械硬盘的1/140;
  6. 远程存储,包括分布式文件系统、Web服务器等,存在于其他机器上,通过网络来进行访问。

所在小组

第四组

组内昵称

彳亍

你的心得体会

随机访问存储器也就是RAM,我们常说的内存,分为静态的(SRAM)和动态的(DRAM),静态的一般用来作为高速缓存存储器,一般不会超过几兆,而动态的作为主存,一般有几千兆。

内存属于断电后会失去存储信息的存储器,所以还存在着非易失性存储器,在断电后还能保存相关信息,也就是ROM,我们称之为只读存储器,闪存就是其中的一种。存储在ROM设备中的程序称为固件,当一个计算机系统通电之后就会运行存储在ROM中的固件,可以理解为硬件内部的程序,例如声卡有自己的固件,而我们电脑上需要装驱动驱使声卡起作用,驱动相当于系统与硬件的接口。

层次结构(缓存命中)、时间/空间局部性:数组在内存中以行排列,程序中却以列去遍历(如果数组比高速缓存要大,对a[i][j]的每次访问都会不命中)

所在小组:第二组
组内昵称:跃山
心得体会:

存储技术

从CPU发送可能回到下面几个地方取数据(从慢到快):

  1. 寄存器,0个周期
  2. L1cache:SRAM组成,4个周期
  3. L2cache:SRAM组成,10个周期
  4. L3cache:SRAM组成,多核CPU共享,50个周期
  5. 虚拟内存
  6. 物理内存
  7. 磁盘
  8. 网络

随机访问存储器RAM分为两种:静态RAM(SRAM)和动态RAM(DRAM)。

  1. 静态RAM。
    1. SRAM将每个位存储在一个双稳态的存储器单元里,每个单元用六个晶体管电路实现(成本相对高)。双稳态就是电路可以无限期地保持在两个不同的电压配置或状态之一。其他任何状态都是不稳定的——从不稳定状态开始,电路会迅速地转移到两个稳定状态中的一个。
    2. 由于双稳态特性,SRAM只要有电,它就会永远保持它的值(抗干扰性强)。
  2. 动态RAM。
    1. DRAM将每个位存储为对一个电容的充电,每个单元由一个电容和一个访问晶体管组成(成本相对低)。与SRAM不同,DRAM存储器单元对干扰非常敏感(抗干扰性弱)。当电容的电压被扰乱之后,它就永远不会恢复了。暴露在光线下会导致电容电压改变。
    2. 内存系统必须周期性地通过对DRAM读出,然后重写来刷新内存每一位。

局部性

局部性原理,其实从应用层来理解更容易:

  1. 时间局部性:数据被多次使用,中间结果被重复使用,可以理解为缓存
  2. 空间局部性:一次性读取到更多的数据,而不是反复的切换读取

高速缓存就是为了加速程序的局部性访问,通过一种层级结构来分级访问,简单点可以类比Redis+Mysql这样的组合。

存储器层次结构

基于缓存的存储器层次结构是很有用的,因为较慢的存储设备比较快的存储设备更便宜,还因为程序倾向于展示局部性:

  1. 利用时间局部性。由于时间局部性,同一个数据对象可能会被多次使用。一单一个数据对象在第一次不命中时,被复制到缓存中,我们就会其往后面对该目标有一系列的访问命中。
  2. 利用空间局部性。块通常包含多个数据对象。由于多个空间局部性,我们会期望后面对该块中其他对象的访问能够补偿不命中后复制该块的话费。

高速缓存存储器

  1. 直接映射高速缓存中的组选择。
  2. 直接映射高速缓存中的行匹配。
  3. 直接映射高速缓存中的字选择。
  4. 直接映射高速缓存中不命中时的行替换。
  5. 综合:运行中的直接映射高速缓存。
  6. 直接映射高速缓存中的冲突不命中。

编写高速缓存友好的代码&高速缓存对程序性能的影响

  1. 将我们的注意力集中在内循环上,大部分计算和内存访问都发生在这里。
  2. 通过按照数据对象存储在内存中的顺序,以步长为1的来读数据,从而使得程序中的空间局部性最大。
  3. 一旦从存储器中读入了一个数据对象,就尽可能多地使用他。从而使得程序中的时间局部性最大。

所在小组
第六组

组内昵称
杨凯伟

你的心得体会

存储技术

不同种类的存储设备往往具有这样的特点:访问速度越快,造价越昂贵,存储空间越小。所以,选取存储设备时存在两个极端,高速设备容量小,而大容量设备速度慢。

缓存

局部性原理

  • 时间局部性:访问一个变量时,程序在不久的将来会访问同一个数据;

  • 空间局部性:访问一个变量时,程序在不久的将来会访问附近的数据。

编写高速缓存友好的代码

主要参考缓存的局部性原理,应该编写利用局部性的程序。

  1. 减小步长
    缓存以块为单位来存储数据,这样附近的数据也加载到缓存中。可以利用步长(Stride)的概念来衡量程序对空间局部性的利用。
  2. 分块
    分块可以提高内循环的时间局部性。分块的大致思想是将一个程序中的数据结构组织成的大的片(chunk),称为块。但是分块会是代码可读性变差。

所在小组

第六组

组内昵称

钟荣荣

你的心得体会

局部性原理:良好的计算机程序倾向于应用邻近于其他最近引用过的数据项的数据项;有时间局部性和空间局部性两种形式;时间局部性:被引用过一次的内存位置可能在不远的将来被多次引用,空间局部性:一个内存位置被引用一次,在不远的将来还会引用附近的内存位置;
存储器层次结构:存储器从高层到底层,存储器变得更慢,更便宜,更大;对于每个K,位于K层的更快更小的存储设备作为位于K+1层的更大更慢的存储设备的缓存(好像和数据结构中的升维的原理很像);