存储

存储

两个经常混淆的词汇:

  • 可靠性:设备出现故障的几率来衡量。改善使用环境;减少组成部件;提高部件可靠性

  • 可用性:系统能正常运行的几率来衡量。增加校验码(硬件冗余)

可用性的提高可能带来可靠性的降低
$$
你正常 \neq 你没问题
$$

层次化存储

  • DRAM : 动态随机访问存储;SRAM : 静态随机访问存储;flash :闪存;disk :磁盘

SRAM

feature

  • 一个读写端口 ;读写访问时间不同;对于任意位置的数据,SRAM访问时间固定;一般集成在芯片上

DRAM

  • 分两次送行列;dram以bank方式来组织,一个bank有很多行,一个行有很多列;dram缓存行数据以便重复访问

  • 添加时钟后成为同步 DRAM( Synchronous DRAM, SDRAM) 可以利用和cpu同步的时钟信号突发传递后续数据

    突发传递:无需每次使能与选择,参考shenzhen i/o 的ram

cache

结构

  • 直接映射;全相联;组相联

相联度每增加一倍,cache的组数减少一半,索引的长度也增加一位

直接映射

映射方法:

例子:五位地址01101,cache有8项,那么地址低三位是索引,剩下两项是tag

64位地址;cache 大小为 $2^n$ 数据块;数据块大小为 $2^m$ 个单字(4字节,因此忽略地址的最低两位)

标签字段的大小为:$64-n-m-2$ ;该直接映射 cache 的总容量为

$$
2^n \times (单个数据块容量 + 标签字段大小 + 有效位大小)
$$

全相联

64位地址

cache 大小为 $2^n$ 数据块

数据块大小为 $2^m$ 个单字(4字节,因此忽略地址的最低两位)

标签字段的大小为:$64-m-2$

这个很好理解,因为cache可以放在任意位置,所以cache index不包含信息,于是标签字段就要相应增大

而且这样就需要对每一个tag判断是否符合要求。

组相联:结合直接映射和全相联

通过索引找到组,数据块在组内的位置是任意的

每个数据块有 n 个位置可放的组相联 cache 称为n路组相联 cache。

在组相联 cache 中,包含主存块的组号为
$$
(数据块号)mod(cache 中的组数)
$$
实际上,直接映射就是一路组相联,全相联就是M路组相联,M为cache大小

假设 64 位的存储地址,对于直接映射 cache, 如果数据大小为 16KiB, 每个数据块为 4 字大小。该 cache 容量多大 (用 bit 表示)?

image-20231220141339793

image-20231220142422131

块大小的影响?

我自己的cache只有64个基本块,而且每一个块就是一个字.这样一一对应虽然很简单,但是完全没有挖掘出空间局部性.

容量更大的块可以通过挖掘空间局部性来降低失效率,如果基本块大小为4个字,那么不仅当前这个字不用再访存,下次访问下面三个字也不用访存了.

但是数据块也不是越大越好

  • cache可存放的块数变少,最终使得失效率反而增加

  • 增加失效损失

cache失效

  1. 必然缺失 对策:预取

  2. 容量缺失 增加cache容量

  3. 冲突缺失 增加cache容量 增加相联的路数

  4. 无效缺失 其他进程修改了主存数据块

image-20240114160118901

cache的接入

侧接法:

像入出设备似的连接到总线上,优点是结构简单,成本低,缺点是不利于降低总线占用率。

隔断法

把原来的总线打断为两段

应用:

注意c语言是行优先的,其中
$$
C[i+j*n]=C[i][j]
$$

DISK

image-20231221103751115

磁盘访问

  • 寻道(tracks)

    磁头径向移动

  • 寻扇

    等待磁盘旋转

  • 数据传输

磁盘访问时间 = 寻道时间 + 旋转延迟 + 传输时间 + 磁盘控制器延迟

其中旋转延迟等于磁盘旋转半周的时间

传输时间就是读取大小/读取速度

缺页的处理过程

(逻辑上)缺页引起,内存(=主存)中没有所需页,要从外存(通常是硬盘)中调入。
CPU给地址,需要访问某存储单元;并行进行TLB、cache查找,TLB没有找到,停止并行查找,通知OS处理;
OS检查页表,发现该页不在内存中,需要从硬盘调入;选择被换出的牺牲页,若是脏页,则需写回,写回时OS申请I/O总线,发送写命令,传回数据;I/O控制器会控制磁盘进行访问然后写入扇区。然后需要调入新页,也是申请I/O,……,磁盘申请I/O总线,得到授权后将数据通过总线送到内存。

结论:

  • 额外开销在总开销中比例较大 =>一次传输大量数据比较有效

  • 将页面存放在相邻扇区中可以避免额外的寻道开销

RAID:

RAID,即冗余阵列独立磁盘(Redundant Array of Independent Disks),是一种将多个硬盘驱动器组合在一起以提供性能、冗余或两者兼而有之的存储技术。RAID技术旨在通过在多个硬盘之间分发或复制数据,提高系统性能、数据可用性和/或容错能力。

定义

  • 廉价磁盘的冗余阵列(Redundant Arrays of Inexpensive Disks)

  • 用N 个低价磁盘构成一个统一管理的阵列,以取代特贵单一磁盘

  1. RAID 0(条带化):

    1. 概念: 数据被分割成strip,然后分别存储在不同的硬盘上。

    2. 性能: 提供良好的读写性能,因为数据被分割并同时写入多个硬盘。

    3. 冗余: 无冗余,一个硬盘故障将导致数据丢失。

    4. 用途: 适用于对性能要求较高而对数据冗余要求较低的场景。

    5. 示意图:

      1
      2
      3
      4
      5
      |-----------------|      |-----------------|
      | Data Block 1 | | Data Block 2 |
      |-----------------| |-----------------|
      | Data Block 3 | | Data Block 4 |
      |-----------------| |-----------------|

      在这个示意图中,数据块1和2同时写入硬盘1和硬盘2,数据块3和4同时写入硬盘3和硬盘4,以此类推。

  2. RAID 1(镜像):

    • 性能: 读性能可能比单个硬盘更好,写性能通常比RAID 0差。

    • 冗余: 数据被完全复制到两个硬盘上,其中一个硬盘失效时,另一个仍然可用。

    • 用途: 适用于对数据冗余要求高而对性能要求适中的场景。

    • 概念: 数据被完全复制到两个硬盘上。

    • 示意图:

      1
      2
      3
      |-----------------|      |-----------------|
      | Data Block | | Data Block |
      |-----------------| |-----------------|

      在这个示意图中,相同的数据块被同时写入硬盘1和硬盘2,实现数据的冗余备份。

  3. RAID 5:

    • 性能: 提供较好的读性能,写性能比RAID 1好。

    • 冗余: 通过分布式冗余校验(Parity)实现数据冗余,其中一个硬盘失效时,可以通过其他硬盘的数据和校验信息进行恢复。

    • 用途: 平衡了性能和冗余需求,适用于中等负载的通用情况。

    • 概念: 数据和校验信息被分布式存储在多个硬盘上。

    • 示意图:

      1
      2
      3
      4
      5
      6
      7
      |-----------------|      |-----------------|
      | Data 1 | | Parity 1 |
      |-----------------| |-----------------|
      | Data 2 | | Parity 2 |
      |-----------------| |-----------------|
      | Data 3 | | Parity 3 |
      |-----------------| |-----------------|

      在这个示意图中,数据块和校验信息(通过异或运算产生)交替存储在不同的硬盘上,允许一个硬盘失效时通过其他硬盘的数据和校验信息进行恢复。

  4. RAID 6:

    • 性能: 类似于RAID 5,但写性能可能稍差。

    • 冗余: 使用双分布式冗余校验,允许两个硬盘同时失效而不导致数据丢失。

    • 用途: 针对更高的冗余需求,适用于大容量硬盘阵列。

    • 概念: 类似于RAID 5,但使用双分布式冗余校验。

    • 示意图:

      1
      2
      3
      4
      5
      6
      7
      8
      |-----------------|      |-----------------|
      | Data 1 | | Parity 1 |
      |-----------------| |-----------------|
      | Data 2 | | Parity 2 |
      |-----------------| |-----------------|
      | Data 3 | | Parity 3 |
      |-----------------| | Parity 4 |
      |-----------------| |-----------------|

      在这个示意图中,除了数据块和校验信息外,还有第二份校验信息,允许两个硬盘失效时进行数据恢复。

  5. RAID 10(1+0):

    • 性能: 提供很好的读写性能。

    • 冗余: 数据被镜像,允许多个硬盘失效,只要不是同一镜像组内的两个硬盘。

    • 用途: 结合了RAID 1和RAID 0的优点,适用于对性能和冗余都有高要求的应用。

    • 概念: 结合了RAID 1和RAID 0的优点,数据被同时条带化和镜像。

    • 示意图:

      1
      2
      3
      4
      5
      |-----------------|      |-----------------|
      | Data Block 1 | | Data Block 1 |
      |-----------------| |-----------------|
      | Data Block 2 | | Data Block 2 |
      |-----------------| |-----------------|

      在这个示意图中,数据块1和2同时写入硬盘1和硬盘2,同时也被复制到硬盘3和硬盘4,实现数据的冗余备份和提高读写性能。

选择合适的RAID级别通常取决于对性能、冗余和成本的特定需求。RAID技术提供了在硬盘阵列中平衡这些要求的选项。

固态硬盘(SSD)

固态硬盘(Solid State Drives):由控制单元、存储单元(FLASH+DRAM芯片)组成,用固态电子存储芯片阵列制成。控制单元:FTL完成上层逻辑地址→底层物理地址的转换、磨损均衡。存储单元:按block有限次擦除,按页进行读写,组织为package-die-plane-block-page
SSD的写入:

image-20240114160607178




本文总阅读量