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

所在小组

第三组

组内昵称

kippa

心得体会

存储技术

  • 随机访问存储器RAM,RAM又分为两类:静态的SRAM和动态的DRAM

静态SRAM特点:容量较小,速度较之动态DRAM要快很多,故而价格也较高。一般用作CPU与内存的缓存
动态DRAM特点:容量较大,速度比SRAM慢,价格相对较低。一般用作系统内存

  • 磁盘存储,存盘属于外部I/O设备。从磁盘上读信息的时间为毫秒级,从DRAM读比从磁盘读快10万倍,从SRAM读比从磁盘读快100万倍。
  • 因为磁盘的构造是一个圆盘,盘上分布着一条条磁道(不同半径就有不同的磁道),每次访问都要找到相应的磁道,然后磁盘旋转到对应的启示位置,故而,磁盘扇区访问时间=寻道时间+旋转时间+传输时间

访问主存

  • 数据流通过总线在CPU和DRAM主存之间传输。这些传输的过程称为总线事务。
  • 读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。

局部性原理

  • 在程序中,程序倾向于引用邻近于其他最近引用过的数据项的数据项,或者就是最近引用的数据项本身。

重复引用一个变量的程序有良好的时间局部性。
对于具有步长为k的引用模式的程序,步长越小,空间局部性越好。在存储器中以大步长跳来跳去的程序空间局部性会很差。
对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。

所在小组

第一组

组内昵称

SADAME

你的心得体会

机械硬盘总的访问时间 Taccess = 寻址时间 Tavg seek + 旋转时间 Tavg rotation + 传输时间 Tavg transfer

  • 寻址时间 Tavg seek 因为物理规律的限制,一般是 3-9 ms
  • 旋转延迟 Tavg rotation 取决于硬盘具体的转速,一般来说是 7200 RPM
  • 传输时间 Tavg tranfer 就是需要读取的扇区数目

要决定访问时间的是寻址时间和旋转延迟
而固态硬盘中分成很多的块(Block),每个块又有很多页(Page),大约 32-128 个,每个页可以存放一定数据(大概 4-512KB),页是进行数据读写的最小单位。但是有一点需要注意,对一个页进行写入操作的时候,需要先把整个块清空(设计限制),而一个块大概在 100,000 次写入之后就会报废。

与传统的机械硬盘相比,固态硬盘在读写速度上有很大的优势。但是因为设计本身的约束,连续访问会比随机访问快,而且如果需要写入 Page,那么需要移动其他 Page,擦除整个 Block,然后才能写入。现在固态硬盘的读写速度差距已经没有以前那么大了,但是仍然有一些差距。

  • 时间局部性(Temporal Locality): 如果一个信息项正在被访问,那么在近期它很可能还会被再次访问。程序循环、堆栈等是产生时间局部性的原因。
  • 空间局部性(Spatial Locality): 在最近的将来将用到的信息很可能与现在正在使用的信息在空间地址上是临近的
  • 顺序局部性(Order Locality): 在典型程序中,除转移类指令外,大部分指令是顺序进行的。顺序执行和非顺序执行的比例大致是5:1。此外,对大型数组访问也是顺序的。指令的顺序执行、数组的连续存放等是产生顺序局部性的原因。
    缓存。缓存可以看作是把大且缓慢的设备中的数据的一部分拿出来存储到其中的更快的存储设备。在金字塔式存储体系中,每一层都可以看作是下一层的缓存。利用局部性原理,程序会更倾向于访问第 k 层的数据,而非第 k+1 层,这样就减少了访问时间。

在整个存储层级中,不同的层级可能会存放同一个数据的不同拷贝(如 L1, L2, L3, 主内存, 硬盘)。如果发生写入命中的时候(也就是要写入的地址在缓存中有),有两种策略:

  • Write-through: 命中后更新缓存,同时写入到内存中
  • Write-back: 直到这个缓存需要被置换出去,才写入到内存中(需要额外的 dirty bit 来表示缓存中的数据是否和内存中相同,因为可能在其他的时候内存中对应地址的数据已经更新,那么重复写入就会导致原有数据丢失)

在写入 miss 的时候,同样有两种方式:

  • Write-allocate: 载入到缓存中,并更新缓存(如果之后还需要对其操作,这个方式就比较好)
  • No-write-allocate: 直接写入到内存中,不载入到缓存

这四种策略通常的搭配是:

  • Write-through + No-write-allocate
  • Write-back + Write-allocate

其中第一种可以保证绝对的数据一致性,第二种效率会比较高(通常情况下)。

所在小组

第五组

小组昵称

郑伟钊

心得体会

存储器的层次结构

存储技术

  • 随机存储器(Random Access Memory):1.SRAM 2.DRAM

    • SRAM(静态存储器):快,贵,稳,用于芯片读写(高速缓存);六个晶管电路,因为 SRAM 的电路简单,所以访问速度非常快,防干扰
    • DRAM(动态储存器):比起 SRAM 来说,它的密度更高,有更大的容量,而且它也比 SRAM 芯片便宜不少。电容,易干扰,用于帧缓/主存
      SRAM&DRAM.jpg
  • 非易失性存储器(Read-Only Memory):RAM在断电的时候会丢失数据,ROM不会(硬盘)

  • 访问主存:数据流通过总线在处理器和DRAM 中间来回。

  • 磁盘:磁盘的结构,以及磁盘的读写。

  • 固态硬盘:加了一个闪存翻译层,(半导体存储器)代替传统的机械转动,反复写会磨损。
    SRAM&20201024140342.jpg

  • 局部性:

    • 时间局部性,从时间维度上将东西关联起来,一部电视剧电视剧第一集第二集这种,有时间轴的那种。
      20201024143125.jpg
    • 空间复杂度,从类似于空间的概念关联起来,比如说同类商品,竞品或者同一品牌的不同系列。
      20201024143139.jpg

*分别从一个二维数组不同的读取方式

从行依次读取:数组在内存中的行优先顺序被访问

20201024141113.jpg

从列依次读取:内存数据访问的时候步长为N

20201024141113.jpg

  • 存储器的结构图:
    20201024141803.jpg

所在小组

第三组

组内昵称

uucloud

你的心得体会

  • 耗时:SRAM:DRAM(内存):磁盘 = 1:10:10万
  • 数据从处理器到DRAM内存之间,通过总线传输。
    • movq A,%rax:CPU将地址A放到系统总线。I/O桥将信号传递到内存总线。主存感觉到内存总线上的地址信号,从内存总线读地址,从DRAM取出数据字,写到内存总线。I/O桥将内存总线信号翻译成系统总线信号,然后沿着系统总线传递。最后,CPU感觉到系统总线上的数据,从总线上读数据,并将数据复制到寄存器。

  • 磁盘需要先移动转动臂寻道(seek),之后读/写头可以读或者写,耗时主要有三部分:寻道时间、旋转时间和传送时间。旋转时间是指到指定位的时间,最差需要等到转动接近一圈的时间。传送时间是指读取内容的时间。
  • 与内存总线和系统总线不一样的是,I/O总线总是设计的与CPU无关。I/O总线氛围:
    • 通用串行总线(USB),USB3.0的总线最大带宽位625MB/s,USB3.1最大带宽为1250MB/s
    • 图形卡(或适配器)包含硬件和软件逻辑。
    • 主机总线适配器(SCSI或SATA)
    • 网络适配器

  • 外围设备互联(PCI)是Intel的I/O总线。系统中所有的设备共享总线,但是一个时刻只能有一台设备访问这些线路。现代使用PCIe,最大吞吐是16GB/s,比PCI(533MB/s)快一个数量级。
  • CPU通过内存映射I/O读取I/O,I/O设备通过DMA,不需要通过CPU,之后通过CPU中断,通知CPU读取。
  • SSD的读性能要比写好很多,因为SSD由块+页组成,页写入前必须先擦除,擦出是1ms级的,如果要写入一个有数据的页,需要先拷贝走再擦除。

所在小组

第三组

组内昵称

晴天

你的心得体会

  1. 对抗缓冲区溢出攻击的3种方式:栈随机化,栈破坏性检测(金丝雀值)和限制可执行代码区域。
  2. 随机访问寄存器分为两类:SRAM(静态)和DRAM(动态),SRAM比DRAM更快也更贵。SRAM将每个位存储在一个双稳态的存储单元里;每个位被分成d个超单元,每个超单元都由w个DRAM单元组成,一共存储dw位的信息。
  3. 存储器分为易失性存储器和非易失性存储器。断电后仍然保存信息的表现为非易失性。
  4. 历史原因,虽然ROM中有类型支持读,也支持写,但整体上被称为只读存储器。
  5. 数据流通过总线在CPU和DRAM主存之间传输。这些传输的过程称为总线事务;读事务从主存传送数据到CPU,写事务从CPU传送数据到主存。(流程图待补充)
  6. CPU通过内存映射I/O的方式向设备发射命令
    1. CPU通过命令、逻辑块号和目的内存地址写到与磁盘相关联的内存映射地址,发起一个磁盘读
    2. 磁盘控制器读扇区,并执行到主存的DMA传送
    3. DMA传送完成,磁盘控制器用中断的方式通知CPU
  7. 剩余章节待补充(未完成)

所在小组

第7组

组内昵称

jinmiaoluo

你的心得体会

阅读地址: https://github.com/jinmiaoluo/blog/tree/main/example-8-reading-notes/csapp/chapter-6
Diff: https://github.com/jinmiaoluo/blog/pull/8/files

所在小组

第五组

组内昵称

李锦锐

心得体会

Chapter 6 The Memory hierarchy

This week we skip a few chapter and moved on to chapter 6 the memory hierarchy. The author introduces us a few key concepts, such as the locality of the program and memory hierarchy of storage.

About RAM(random-access-memory)

there mainly two kind of ram , (static ram and Dynamic ram) .

  • RAM is traditionally packaged as a chip
  • Basic storage unit is normally a cell (one bit per cell)
  • Multiple RAM chips form a memory.
  • volatile memory

SRAM is for Cache memories, but DRAM is for Main memories, frame buffers.

Bus connection

  • CPU places address A on the memory bus.
  • CPU read word x from the bus and copies it into register %rax.

Store operation: movq %rax, A
Load operation: movq A, %rax

what it is inside disk ?

disk consists of serval parts including actuator、arm、spindle、platters、scsi connector。

  • Disks consist of platters, each with two surfaces
  • Each surface consists of concentric rings called tracks
  • Each track consists of sectors separated by gaps
  • disk capacity is determined by recording density、track density、areal density

所在小组

第四组

组内昵称

张旭辉

你的心得体会

随机访问存储器分为两类,静态的和动态的。

静态RAM(SRAM)比动态RAM(DRAM)快地多,也贵得多。

SRAM用来作为高速缓存存储器
DRAM用来作为主存以及图形系统的帧缓冲区(显存)。

时间局部性:被引用过一次的数据很可能在不远的将来被再次引用,是较好的时间局部性

空间局部性:一个内存位置被引用了,那么程序在不久的将来会引用其附近的一个内存位置。

缓存命中

当程序需要K+1层中的数据对象d中,在第K层的一个块中寻找d,若d存在缓存K层中,称为缓存命中。

缓存不命中

第K层没有缓存数据对象d,则为缓存不命中。

此时第K层的缓存从K+1层中取出包含d的块,放入K层(若K层已满,则需覆盖一个块)。

所在小组

静默组

组内昵称

Mr_李冲

你的心得体会

RAM :静态RAM、动态RAM,静态RAM供电数据不丢失,动态RAM需要刷新电路来保持数据不丢失,但动态RAM廉价,前者用于高速缓存,后者用于内存或显存。

时间局部性:访问一个变量时,程序在不久的将来会访问同一个数据。
空间局部性:访问一个变量时,程序在不久的将来会访问附近的数据。
衡量缓存性能的指标:命中率,命中时间,不中处罚。

编写高速缓存友好的代码:

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

所在小组
第一组

组内昵称
深圳-李悦东

心得体会
这里

所在小组
第七组
组内昵称
Hayden
心得体会

  • 计算机系统的存储结构,从上到下存储空间越来越大,运算速度也越来越慢,如内存访问肯定比硬盘快,寄存器缓存比内存快。

  • 存储器的缓存思想依赖程序的局部性(时间局部性和空间局部性),空间局部性是指刚访问过的数据,他相邻的数据也会很快访问到,时间局部性是指访问过得数据会很快再次被访问到。我们在编写代码时,利用局部性原则程序性能会提升。

  • 局部性良好的程序会多次访问相同的数据或者临近的数据,这样就是利用局部性原则是的程序运行的更快,在架构设计时,我们将热点数据加入到进程缓存,远程缓存。

  • 即使程序有很好的空间局部性,但是如果缓存空间没有足够的容量,有的检索可能会造成缓存反复失效,反复加载这叫缓存抖动,这种抖动让速度下降的比没有缓存还慢。

  • 衡量缓存性能的指标:命中率,命中时间,不中处罚。

所在小组
第四组
组内昵称
志林
心得体会

6.访问磁盘

内存映射技术:地址空间中一块地址是为与I/O设备通信保留的I/O端口,设备连接到总线时,与一个或多个端口相关联。

6.1 固态硬盘

SSD封装到I/O总线上标准硬盘插槽。一个SSD封装由一个或多个闪存芯片和闪存翻译层组成。闪存翻译层扮演磁盘控制器的

组成:由B个块的序列组成,每个块由P页组成,页的大小为512字节~4KB 块由32-128页组成,大小为16KB~512KB

数据以页为单位读写,只有在一页所属的块被擦除后,才可以写这一页、

随机写慢。-擦除需要时间较长 -写操作试图修改一个包含已经有的数据的页p,则这个块中所有带有数据的页都必须被复制到一个新的块,才能对p进行重写。

优点:1.没有移动的部件,所以随机访问时间比旋转磁盘快,能耗低。

缺点:SSD容易磨损。

6.2 局部性

时间局部性:被引用过一次的数据很可能在不远的将来被再次引用,是较好的时间局部性

空间局部性:一个内存位置被引用了,那么程序在不久的将来会引用其附近的一个内存位置。

局部性总结:1.重复引用相同变量的程序有良好的时间局部性。

              2.对与具有步长为k的引用模式的程序,步长越小,空间局部性越好。

              3.对于取指令来说,循环有好的时间和空间局部性。循环体越小,循环迭代次数越多,局部性越好。

6.3 存储器的层次结构

6.3.1 存储器层次结构中的缓存

存储器层次结构的中心思想:对于每个K,位于K蹭的更快更小的存储器设备作为位于K+1层的更大更慢的存储设备的缓存。层次结构中的每一层都缓存来自较低一层的数据对象。

存储器层析结构中缓存的一般性概念:K+1层的存储器被划分为连续的数据对象组块——块。每个块有唯一的地址或名字。

数据以块为传送单元,在K层与K+1层来回复制。

  1. 缓存命中

当程序需要K+1层中的数据对象d中,在第K层的一个块中寻找d,若d存在缓存K层中,称为缓存命中。

  1. 缓存不命中

第K层没有缓存数据对象d,则为缓存不命中。

此时第K层的缓存从K+1层中取出包含d的块,放入K层(若K层已满,则需覆盖一个块)。

牺牲块:被覆盖替换的现存块。

  1. 缓存不命中的种类

强制性不命中/冷不命中 冷缓存(cold cache):第K层缓存是空的,对任何数据对象的访问都不命中。

  发生不命中,K层必须采用严格的放置策略,确定K+1层的块放在K层何处。限制性放置策略确定k+1层的块放在k层的(i mod n)中。

冲突不命中:限制性放置策略引起的不命中。数据对象会映射到同一个缓存块,然后缓存会一直不命中。

容量不命中:每个阶段访问缓存块的某个相对稳定的集合。当工作集的大小超过缓存的大小,缓存会容量不命中。(缓存太小,不能处理工作集)

  1. 缓存管理

存储器层次结构的本质:每一层存储设备都是较低一层的的缓存。

在一个虚拟内存的系统中,DRAM主存作为存储在磁盘上的数据块的缓存,由操作系统软件和CPU上的地址翻译硬件共同管理。

所在小组:静默
组内昵称:黄小黄
心得体会:

  • SRAM 贵,稳定,集成度低,用于高速缓存存储器

  • DRAM 较便宜,不稳定,集成度高,需要定时重新读写和纠错码,用于主存和帧缓冲区

  • DRAM 的存储单元(超单元)以二元阵列排列而不是线性排列,这样可以节省管脚。请求某个超单元先发送行,此时会将行缓存到内部行缓冲区;然后发送列,此时将该行该列的超单元数据返回给请求者。传统的 DRAM 会将剩余的数据丢掉,而 FPM DRAM会缓存整行。这两种DRAM早就已经停产了,现在主流是 DDR3/4 SDRAM。

  • 可擦写编程器 EEPROM 掉电数据不丢失,主要用于存储数据,如闪存(U盘)

  • 一般的程序都具有良好的局部性,即访问的数据都是在一个较密集的区间内,这样可以提高访问效率。但局部性也导致容易受到栈溢出攻击。印象中新版本的 Linux 内核有降低局部性,防止栈溢出攻击的策略。

  • 存储器层次结构的本质是,每一层存储设备都是较低一层的缓存。

  • 高速缓存步骤:1. 组选择(一般用内存中间的位避免相邻的内存分到同一个组) * 2.行匹配 3. 字抽取(返回)

  • 直接映射高速缓存命中遵循定的策略,在真实的程序中很常见,会导致令人困惑的性能问题。例如反复调用两个相邻的内存块(两个数组),而两个内存块映射的组索引恰好一样(块大小为2的幂时尤为容易出现),就会导致冲突不命中,只能每次重新加载。解决方案可以是稍微扩充一下内存块大小。直接映射高速缓存限制是只能有1行。

  • 组相联高速缓存每组可以有多行,冲突不命中的问题得到缓解。

  • 缓存经常会用到 write-back 机制,即更新的数据不会立刻写入到下一层,而是每隔一段时间写一次,以获得更高的性能。L1 对 RAM,RAM 对 ROM 都会用到。write-allocate 是当需要写的时候,如果没有匹配缓存,就先加载进来,而不是 write-through 直接写进去。write-back 和 write-allocate 经常一起使用。

所在小组:

     第二组

组内昵称:

心得体会

  1. 高层往底层走,存储设备速度变慢、价格便宜、容量更大
  2. 存储技术
    1. 随机访问存储RAM
    2. 存盘存储,属于外部I/O设备,存储容量大速度慢,价格更便宜性价比更高
      3.局部性
      在程序中,程序从近邻、最近引用过的数据本身,这种称作局部性原理
      好处:
      1. 重复引用一个变量,程序的运行时间越快
      2. 固定步长的程序步长越小,程序性能越好
  3. 高速缓存器
    随着CPU和主存之间的速度之间的速度差距不断增加,早期系统设计的时候就在在CPU和主存之间插入了一个小的SRAM叫做高速缓存器

所在小组

第2组

组内昵称

叶王

你的心得体会

  1. 存储技术在计算机中的体现是分级,越快的存储越贵,所以容量越小。尽量使用快的存储介质,是提高程序运行效率的关键之一。
  2. 存储的局部性是「二八法则」在计算机的一个体现,包括空间局部性和时间局部性,而缓存就是其中的一个应用,很多互联网技术,说到底,都是一种「缓存」。
  3. 了解编写高速缓存友好的代码,不一定在工作中直接写底层代码,却是写出高质量代码的前提之一。
  4. 这一章介绍的存储技术,其实还结合了前面几章内容的应用。我们在工作时多注意自己代码运行时候在存储系统里的情况。