不落辰

知不可乎骤得,托遗响于悲风

0%

csapp_6_存储器层次结构

  • 各类存储技术
    • RAM:SRAM DRAM
    • ROM
    • 磁盘
  • 访问主存,访问磁盘流程

Storage technologies 存储技术

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

  • Random-Access Memory(RAM):随机访问存储器
    • RAM就是所说的内存
  • 分为SRAM(快)和DRAM(慢)。
  • SRAM和DRAM都是易失性存储器(volatile memories)
    • 当断电得时候存储的信息就会丢失。

SRAM 静态RAM

  • 用作高速缓存存储器
  • 双稳态特性,只要有点,就会永远地保持它的值。只要有电,SRAM就会保持不变。
  • 对干扰(光、电噪)不敏感
  • 贵(需要晶体管多,密集度低)

DRAM 动态RAM

  • 用作主存
  • 有许多原因会导致DRAM单元漏电,因此内存系统必须周期性的通过读出然后重写,来刷新内存每一位。
  • 对干扰敏感
  • 便宜

ROM :nonvolatile memory 非易失性存储器

  • 非易失性存储器(nonvolatile memory):即使在断电之后,仍然保存着他们的信息。(ROM就是非易失性存储器)

  • ROM:由于历史原因,虽然ROM中有的类型既可以读又可以写,但是他们整体上都被称为只读存储器(Read-Only Memory,ROM)

  • ROM以他们能被重新编程的次数和对他们重新编程所用的机制来区分。

    • 可编程ROM (Programmable ROM,PROM):只能被编程一次
    • 可擦写可编程ROM(Erasable Programmable ROM,EPROM):能够被擦除和重编程。(1000次)
    • 电子可擦除PROM(Electrically Erasable Programmable ROM:EEPROM)。(100000次):为大量电子设备提供快速而持久的非易失性存储,如数码相机,手机,笔记本,台式机等。
    • 闪存(flash memory):基于EEPROM的非易失性存储器。
    • 固态硬盘(Solid State):基于闪存的磁盘驱动器,提供相对于传统旋转磁盘的一种更快速、更强健和更低能耗的选择。
  • 固件 firmware:存储在ROM设备中的程序。

    • 当一个计算机系统通电之后,它会运行存储在ROM中的固件。
    • 一些系统在固件中提供了少量的基本输入输出函数。如PC的BIOS例程。
      • BIOS,controllers for disks,network cards,graphics accelerators,security subsystems,…
  • 有个之前没搞懂的问题,现在懂了
    • RAM就是内存。SRAM 高速缓冲 DRAM 主存
    • ROM不意味着硬盘
      • 旋转磁盘:不是基于ROM。是靠磁性物质
      • 固态硬盘:基于flash memroy。是ROM
    • RAM、ROM都算半导体存储器利用逻辑电路读写,磁盘就是磁介质存储加上机械传动读写

Disk 磁盘

磁盘构造

  • 盘片以固定速率旋转

  • 磁盘(disk)由多个盘片(platter)组成。每个盘片有两个表面(surface),表面覆盖着磁性记录材料。
  • 每个表面由多个同心环组成,被称为磁道(track)。
  • 每个磁道由一组扇区(sector)组成。一组中的每个扇区被间隙(gap)分隔开。每个扇区包含数量相等的数据位;间隙不存储数据位。
  • 磁盘:由一或多个盘片组成,封装起来。称为磁盘驱动器(disk driver),也称为磁盘(disk),也叫玄幻磁盘(rotating disk)(以区分固态硬盘ssd)

磁盘容量

  • 磁盘容量:一个磁盘可以记录的最大位数

    • 记录密度(recording density):磁道一英寸的段可以放入的位数
    • 磁道密度(track density):从盘片中心出发半径一英寸的段内可以有的磁道数
    • 面密度(areal density):记录密度 * 磁道密度的乘积。
  • 公式

  • 单位 K M G T

    • 对于DRAM、SRAM容量相关的计量单位:2^10进制,K=2^10,M=2^20,G=2^30
    • 对于磁盘和网络这样的IO设备的容量计量单位:10^3进制,K=10^3,M=10^6,G=10^9,T=10^12

磁盘操作

  • 大体有两个操作,一个是传动臂,一个是盘面
  • 寻道:传动臂沿半径轴前后移动,驱动读写头定位任意一个磁道。称为寻道。
    • 寻道是为了确定目标扇区所在磁道
    • (即将读写头定位到正确柱面。柱面:所有盘片到主轴中心举例相等的磁道集合,即垂直看重合的磁道称为一个柱面)
  • 盘面:以固定速率旋转。
    • 盘面旋转是为了让扇区处于读写头下。
  • 对磁盘的访问时间
    • 寻道时间:寻道所花时间
    • 旋转时间:寻道结束后,旋转扇区所花时间
    • 传送时间:当目标山区第一个位位于读写头希望,驱动器就可以开始读或者写该扇区内容了。

逻辑磁盘块

  • Disk Controller:磁盘控制器。
    • 维护逻辑块号码和物理扇区的关系。
    • 控制器上的固件:将逻辑块号翻译成(盘片、磁盘、扇区)三元组
    • 磁盘控制器上的硬件会解释这个三元组,将读写头移动到适当的柱面,等待扇区移动到读写头下,将读写狗感知的位放到控制器上的一个小缓冲区中,然后将他们复制到主存。

Solid State Disk (SSD) 固态硬盘

  • solid state disk 基于闪存实现的存储技术。
    • 由一个或多个闪存芯片和闪存翻译曾组成。
    • 闪存芯片 <—> 旋转磁盘的机械驱动盘
    • 闪存翻译层 <—> 磁盘控制器
    • ssd大部分取代旋转磁盘。

访问主存

总线

  • 总线(bus):数据流通过被称为总线的共享电子电路在处理器和DRAM主存之间传递。

    • 一组并行的导线,可以携带地址,数据和控制信号。
    • 数据和地址信号是否共享同一组导线,取决于总线的设计。同时,总线通常被不同设备共享。
    • 控制线携带的信号会同步事务,并表示出当前正在被执行的事务的类型。
  • 总线事务:每次cpu和主存之间的数据传送都是通过一系列步骤完成的,这些步骤,称为总线事务

    • 读事务:数据从主存传送到cpu
    • 写事务:数据从cpu->主存。
  • 总共有三个总线

    • 系统总线
    • 内存总线
    • IO总线

读事务

没画高速缓存L123

  • movq A,%rax:地址A的内容被加载入寄存器
    • cpu芯片上被称为总线接口的的电路在总线上发起读事务
    • 1. cpu将地址A放在系统总线上,IO桥将信号传递到内存总线
    • 2. 主存感受到内存总线上的地址信号,从内存总线上读地址,然后从DRAM中取数据,并将数据写到内存总线;IO桥将内存总线的信号转化成系统总线的信号,然后通过系统总线传递给cpu
    • 3. cpu感觉到系统总线上的数据,从总线上读数据,然后将数据复制到寄存器%eax

写事务

  • mov %rax,A:寄存器的内容被写入地址A
    • cpu芯片发起写事务
      1. cpu将地址A放在内存总线上,IO桥将信号传递到内存总线,DRAM主存从内存总线上读地址。DRAM然后等待数据信息到达。
      1. cpu将数据信息放在系统总线上。
      1. 主存从总线上读取字,并存储在地址A中。

访问磁盘

结构

  • **内存映射I/O(memory-mapped I/O)**:CPU使用该技术来向IO设备发射命令。
    • 在使用内存映射io的系统中,地址空间有一块地址是为与io设备通信保留的。每个这样的地址称为一个IO端口。当一个设备连接到总线时,她与一个或多个这样的端口相关联。(或他被映射到一或多个端口)
    • 这不是Linux的mmaped,我第一眼还以为是hhh

访问磁盘过程:

  • CPU 将【命令、逻辑块号、目的内存地址】 写到 【与磁盘相关联的】【内存映射地址】,发起一个【磁盘读】。

  • 磁盘控制器读扇区,并执行到主存的DMA传送

    • cpu发出请求后,在磁盘执行读的时候,通常会执行其他工作。
    • DMA(direct memory access)传送:磁盘控制器收到cpu的读命令后,将逻辑块号翻译成一个扇区地址,读取该扇区内容,然后将这些内容传送给主存,无需cpu干涉。也即,设备可以自己执行读或写总线事务而无需cpu参与的过程。
  • 当DMA传送完成时,磁盘控制器用中断的方式通知CPU

    • 基本思想:中断会发出信号给cpu芯片的引脚,使得cpu暂停当前工作,将控制传递给一个os的例程。这个例程记录下IO已经完成,然后将控制返还给cpu刚刚被中断的地方。
  • 例子:假设磁盘控制器映射到IO端口0xa0,随后cpu可能通过执行三个对地址0xa0的存储指令,发起磁盘读。

  • CPU执行三个对地址0xa0的存储指令,发起磁盘读

    • 第一条指令是发送一个命令字,告诉磁盘发起一个读(还可能有其他参数,如是否中断cpu)。
    • 第二条指令指明应该读取的逻辑块号。(磁盘控制器会找到相应物理扇区)。
    • 第三条指令指明应该存储磁盘扇区内容的贮存地址。

Trend

  • 内存和磁盘技术:增加密度(从而降低成本)比降低访问时间容易得多
  • SRAM的性能滞后于CPU的性能,但SRAM还在保持继续增长。
  • DRAM和磁盘的性能滞后于CPU的性能(时间),且差距逐渐增大。
  • 现代计算机频繁使用基于SRAM的告诉缓存,试图弥补处理器-内存(cpu-memory)的之间的差距。(原理:程序的局部性属性)

Locality 局部性

  • 分为时间局部性空间局部性

  • 时间局部性 (temporal locality)

    • 在一个具有良好时间局部性的程序中,被引用过一次的内存位置很可能在不远的将来再被多次引用。(重复引用同一数据项)
  • 空间局部性 (spatial locality)

    • 在一个具有良好空间局部性的程序中,如果一个内存位置被引用了一次,那么程序很可能在不远的将来引用附近的一个内存位置。(引用邻近于最近使用过的数据项的数据项
  • 评价局部性的简单原则

    • data
      • 时间局部性良好:重新引用相同变量
      • 空间局部性良好:步长为k的引用模式,k越小越好(不在内存中大步长跳来跳去。
    • instruction
      • 对于取指令来说,循环有好的时间局部性和空间局部性。
      • 循环体越小,循环迭代次数越多(相同频率下),局部性越好。

程序例子

对程序数据引用的局部性

  • 变量sum

    • 时间局部性很好:每次循环被引用一次
    • 不存在空间局部性:sum是标量
  • 变量v:

    • 时间局部性很差:因为每个向量元素只被访问一次。
    • 空间局部性很好
      • 步长为1的引用模式
  • 看出时间局部性和空间起码占一样儿。

  • 步长为1的引用模式(顺序访问一个向量)

    • stride-1 reference pattern / sequential reference pattern
    • 在一个连续向量中,每隔k个元素进行访问,称为步长为k的引用模式(stride-k reference pattern)
    • k越大,空间局部性越差。

取指令的局部性

  • cpu需要从内存读出指令,所以我们也能够评价一个程序关于指令的局部性。
  • 空间局部性:for循环体里的指令是按照连续的内存顺序执行的,因此循环有良好的空间局部性。
  • 时间局部性:for循环体会被执行多次。(Loop:… goto Loop;)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <iostream>
#include<string.h>
#include<stdlib.h>

using namespace std;
class mystring
{
public:
char *s;

//一元操作符重载
//重载1
mystring (mystring &a){cout<<"wrong!"<<endl;}
mystring (){}
mystring operator=(const mystring &it)
{ memset(s,0,1024);
strcpy(s,it.s);
cout<<"111"<<endl;
return *this;
}
};


int main()
{
mystring s1;
s1.s="111";
mystring s2=s1;
return 0;
}

因为"111"在rodata段,所以报错。

https://stackoverflow.com/questions/26672661/for-write-back-cache-policy-why-data-should-first-be-read-from-memory-before-w

https://xiaolincoding.com/os/1_hardware/cpu_mesi.html#%E5%86%99%E5%9B%9E