CSAPP--第六章:存储器层次结构学习

重要思想:编写出数据项存储在层次结构中,较高地方的程序。

  • **学习目标:SRAM、DRAM、ROM存储器及旋转和固态存储器。
    重点关注高速缓存存储器cache。

随机访问存储器(Random-Access Memory):
  • 静态RAM(SRAM):
    (速度快,价格高,用于高速缓存,一般为几M。)
    SRAM用双稳态的存储器单元,每个单元有6个晶体管,可以无限期保持两个电压中的状态之一。
    具有扛干扰性。
    静态RAM的双稳态示意图

  • 传统的动态RAM(DRAM):
    而动态RAM结构,由细节到宏观,如下图所示。
  • 访问数据步骤:
    1:传送一个地址A到内存控制器
    2:控制器随即访问数据,选择指定的模块(module)k
    3:k模块将地址A转化成(i,j)形式。
    (i为行row,j为列column)
    4:将8个DRAM芯片,都访问其(i,j),得到8个字节(8位),依次组成64位。
    具体从单个DRAM芯片中得到字节的方式,如下图2。


    1

    2

    3

  • 增强的DRAM:
    主要在传统结构上,进行优化,而得到一系列的改进结构。
    依性能排序为:
    1-快页模式: FPM DRAM
    (Fast Page Mode)
    2-拓展数据输出: EDO DRAM
    (Extended Data Out)
    3-同步DRAM: SDRAM
    (Synchronous同步)
    4-双倍数据速率同步DRAM: DDR SDRAM
    (Double Data-Rate):
    根据预取缓冲区大小划分: DDR1 DDR2 DDR3。

  • 非易失性存储器:
    DRAM和SRAM,如果断电就会丢失信息。从这方面来说,属于易失的(volatile)。
    而非易失性存储器,即使断电之后,仍然可以存储信息。
    他们整体上都被成为只读存储器ROM(Read Only Memory)。
    ROM设备中,有基本的程序:固件,用来翻译cpu的输入输出请求。
    以可重写次数和重写机制分为:
    1:PROM(programmable)
    存储单元有熔丝,可以用高电流熔断一次。
    2:EPROM(erasable programmable)
    利用了光学物理设备进行写入,清零是用紫外线照射存储单元。
    可擦除重编程次数:1000数量级。
    3:EEPROM(electrically erasable)
    类似EPROM,但不需要格外物理设备,而是在电路卡上编程。
    可擦除编程数:10 0000数量级。
    闪存(flash memory)便是基于EEPROM结构。
    及基于闪存的固态硬盘。

访问主存的方式:

cpu和主存连接方式:
cpu--总线接口--系统总线--I/O桥--内存总线--主存
(I/O桥连接了I/O总线,由磁盘,显卡等共享)


整体流程

movq A,%rax 示例
  • 磁盘:
    磁盘结构:由盘片、面、磁道、扇区和传动臂组成。
    磁盘封装了一个固件:磁盘控制器,用以将实际地址转化成连续的逻辑块

磁盘结构

访问磁盘:
每一个逻辑块,会被翻译成:(盘片,磁道,扇区)三元组,对应唯一物理扇区。
读取时,读写头会将数据保存在控制器的缓冲区里,然后复制到内存中。

访问磁盘时间分为三个阶段:

1:寻道,将传动臂移到指定磁道。
时间平均通常为3-9ms。

2:旋转,磁盘转到指定的扇区。
Tmax=(1/RPM) //以m为单位要乘以60
Tavg=1/2 * Tmax

3:读写,对扇区(指定为512个字节)进行读写。
用每转耗时,除以扇区数。
T=Tmax / 扇区数。



连接I/O设备:

说明:系统总线和内存总线都与cpu相关,
而I/O总线与CPU无关。
如intel的外部设备互连PCI总线,其连接了磁盘、显卡、键盘、鼠标、USB(通用串行总线)。
PCI(Peripheral Component Interconnect )。
下图为CPU,内存,I/O设备简单抽象连接图:



  • 访问磁盘:

CPU使用:内存映射I/O 技术来向I/O发射命令。
下图说明:
a.cpu发出三次指令:
1 命令:读。及其他参数如是否中断指令。
2 磁盘的逻辑块地址。
3 读出放到某个内存地址。
b.磁盘控制器接受命令,并读取定逻辑块,将值传送到内存。
此步骤不需要CPU参与,称为DMA(直接内存访问)。
c.当内容安全存储到主存上后,磁盘控制器会发生给cpu一个中断信号,来通知cpu。


  • 固态硬盘SSD:
    (Solid State Disk)
    与磁盘区别:
    1:底层硬件为闪存而非磁盘,闪存分为b个块,每个块内又有一定数量的页,页内存放512~4k个字节。
    2:以闪存翻译器(控制器)代替磁盘控制器。

说明:闪存读取比写入快,因为:

1:必须已经格式化即擦除的块,才能在页写入数据。擦除块需要1ms左右时间。
但块进行一次擦除,其内页不需要擦除即可写入一次。

2:写入位置若已有数据,则需要将整个块的有用数据全部拷贝到已经被擦除的块,才能再进行写入。

下面是闪存的结构示意图和速度指标:
(IOPS是每秒I/O次数)

抽象结构

各项数值

近年cpu与各存储器性能、价格示意图:



存储器层次结构:

(memory hierarchy)

  • 原则:基于缓存思想
    根据局部性(locality)思想,缓存可以作为实现的桥梁。
    如:
  • 空间局部性:如数组,以步长1访问(每次索引加一),具有良好的空间局部性。
    此时若高速缓存不命中,而下一层命中。则会提取包含多个元素的一整块,到高速缓存。因而下次访问的时间也会大大缩减。
  • 时间局部性:频繁地访问某元素。
    高速缓存可以保存该元素在高层次中,相比每次从内存提取,能大大提高速度。

越靠近cpu,缓存容量越小,速度越快,价格越贵。


存储器层次结构

  • 对于任意两层缓存(k,k+1)之间:

传输方式:以块进行传输。
在指定两层,块大小相同。而层次结构里,越高,则块的大小越小。

  • 缓存命中与不命中:(读取)
    缓存命中(cache hit):当需要的数据,在k层的块内时,缓存命中。
    缓存不命中(cache miss):当需要的数据,在k层找不到,此时缓存不命中,会到k+1层寻找。


    缓存原理

不命中的种类:
①冷不命中(cold miss):k层是空的,
②容量不命中(capacity miss):如程序中,需反复访问同一数组的元素,此时缓存太小,不能够处理这个工作集。
③冲突不命中(conflict miss):缓存足够,但是k层中的某块地址,被k+1层以某种规则映射,即两个块都会映射到同一个地方。
如规则为mod 4时:程序反复需要块0,块4。
1:先请求块0,此时k层没有,从k+1层取出放在k层指定位置,并取出元素返回给cpu。
2:cpu又请求块4,又会不命中从下一层调,然后保存并返回值,此时又覆盖了块0。
3:cpu又请求块0,又会不命中。这就是冲突不命中。


  • 缓存管理:
    可以由软件、硬件、或者两者结合,如下图

  • SRAM高速缓存结构示意图:
    cpu发出的地址的,高速缓存是如何翻译,并判断出指定地址的?
  • 高速缓存采取(S,E,B,m)结构:
    S:高速缓存内部分为S个组(0,S-1)。
    E:每个组内部又有E个行。
    B:每个行包括:1个有效位,t个标记位,一个块(B个字节,可以理解为字节数组)
  • 与地址的对应:
    传入地址为:t个标记位,s个组数位,b个偏移位。
    t标记位一一对应;
    s个数组位指出指定组——共S=2^s个组;
    b位指出字节偏移位——共B=2^b个字节。
    如下图:


高速缓存实现:
以下模型均假设内存和cpu间,只有一个L1高速缓存。

  • 直接映射高速缓存:
    最简单模型。E为1,即每组一行。
    步骤①:由s位找到指定组。
    步骤②:访问唯一行的有效位。
    步骤③-1:有效位为1,匹配标志位t,若相等,由b在块中,找到偏移位,取出指定数量字节,返回给cpu。
    步骤③-2:有效位为0,则访问内存,从内存得到一个数据块,将其放到指定组,取出字,返回给cpu。


    直接映射抽象流程
  • E路相联高速缓存:
    每组有E行。
    步骤与直接映射类似,找到组后,对每一行进行遍历,命中则返回值,否则访问内存。


    2路相联高速缓存
  • 全相联高速缓存:
    仅有一组,包含了C/B行,C为容量(仅包含块数据,不包含标志位和有效位)。


    全相联高速缓存

ps:为什么用中间位当做s组索引?↓



写命中与不命中:

  • 写命中会执行:
    直写:当某层写命中后,会更新块内指定内容,然后往更低层继续写。
    写回:当某层命中后,也会更新写入到块内,但是不会直接写入更低层,除非该行会被替换时。(需要附加硬件判断该行是否被修改过。)
  • 写不命中会执行:
    写分配:从更低层读入块,然后更新块内内容。
    非写分配:直接写入到更低层,而不对该层进行修改更新。
    说明:
    写回和写分配,都更利于局部性实现,但会需要格外硬件,使要替换驱逐该行时,会将该行复制更新到更低层中。

  • cpu与高速缓存


    三层cache封装到cpu中

    层次结构

    影响参数

    ps:存储器山的实验,暂时没进行,以后可以看csapp家庭作业,山的代码已经下载到OSstudy/soft里了。

你可能感兴趣的:(CSAPP--第六章:存储器层次结构学习)