zoukankan      html  css  js  c++  java
  • 存储器层次结构

    存储器层次结构

    计算机程序的一个基本属性:局部性

    存储器层次结构分类:

    1 CPU寄存器:放在CPU里面的内存,特点:速度快,价格高

    2 高速缓存存储器、主存储器、磁盘。特点:CPU之外,需要时访问调用,相对较慢

    随机访问存储器(RAM)

    两类RAM:

    1 SRAM(静态)  :

    (1) 更快,更贵。

    (2)作为高速缓存存储器,主要负责运算需要

    (3) 双稳态的存储单元,抗干扰强

    2  DARM(动态):

    (1)用于主存以及图形系统的帧缓冲区

    (2)抗干扰弱

    (3)必须周期性更新

    传统DRAM:类似于数电的选择控制器,操作单位为超单元,行R*列C=超单元D,步骤为集体复制,特定传出

    增强DRAM:对于传送更多的数据信息提高速率

    ROM(只读存储器):

    弥补RAM数据不存储特性

    总线是一组并行的导线,能携带地址、数据和控制信号

    I/O桥将系统总线的电子信号翻译成存储器总线的电子信号,也将系统总线和存储器总线连接到I/O总线

    磁盘存储

    磁盘容量:磁盘上可以记录的最大位数,提高面密度或者磁盘体积可提高容量

    局部体现——多区管理:

    1 将柱面的集合分割成不相交的子集合(记录区),每个区包含一组连续的柱面

    2 一个区中的每个柱面的每条磁道都有相同数量的扇区,这个扇区的数量由该区中最里面的磁道所能包含的扇区数确定

    3 磁盘以扇区大小的块来读写数据

    逻辑磁盘块结构:

    盘面,磁道,扇区,这个三元组唯一的标识了对应的物理扇区

    I/O总线

    I/O总线:CPU与外界的桥梁连接了CPU,主存和I/O设备

    固体磁盘

    固态硬盘是一种基于闪存的存储技术,且为固定不可移动

    闪存:ROM的一种,普遍用于电子设备存储需要数据

    一个SSD包由一个或多个闪存芯片和闪存翻译层组成:

    闪存芯片 ,闪存翻译层

    局部性

    分类:

    1 时间局部性

    2 空间局部性

    对程序数据引用的局部性

    步长为k的引用模式:

    一个连续变量中,每隔k个元素进行访问,就被称为步长为k的引用模式

    K=1的步长,利用顺序访问相当线性遍历

    K>=2的步长,类似空间,例如数组的多维遍历规则,列遍历不利于空间局部性(由于与规定存储规格不符合)

    取指令的局部性

    程序指令是存放在存储器中的,CPU必须取出(读出)这些指令

    空间局部性程度决定:

    1 K的大小

    2 循环次数多少

    3 重复调用

    存储器层次结构

    缓存:使用高速缓存的过程称为缓存

    数据处理方式单位:块处理

    操作方式:

    替换:随机替换策略-随机牺牲一个块,最近最少被使用替换策略LRU-牺牲最后被访问的时间距离现在最远的块。

    高速缓存存储器

    L1-L3高速缓存:时间周期增加

    块偏移位:b高速缓存的结构将m个地址划分成了t个标记位,s个组索引位和b个块偏移位。

    高速缓存的大小/容量C:C=E*S*B

    组相联高速缓存

    E路组相联高速缓存:1<E<C/B

    1.组选择

    和直接的一样。

    2.行匹配和字选择

    形式是(key, value),用key作为标记和有效位去匹配,匹配上了之后返回value。

    重要思想:组中的任意一行都可以包含任何映射到这个组的存储器块,所以告诉缓存必须搜索组中的每一行。

    判断匹配的标准依旧是两个充分必要条件:

    1.有效
    2.标记匹配

    3.行替换

    有空行替换空行,没有空行,应用替换策略:

    • 随机替换
    • 最不常使用策略LFU:替换在过去某个时间窗口内引用次数最少的那一行。
    • 最近最少使用策略LRU:替换最后一次访问时间最久远的那一行。

    全相联高速缓存(E=C/B)

    1.组选择

    只有一个组,默认组0,没有索引位,地址只被划分成了一个标记和一个块偏移。

    2.行匹配和字选择

    同组相联。

    只适合做小的高速缓存。

    写不命中的处理方法

    (1)写分配---通常写回对应:加载相应的低一层中的块到高速缓存中,然后更新这个高速缓存块。

    (2)非写分配---通常直写对应:避开高速缓存,直接把这个字写在低一层中。

    真实的高速缓存层次结构:

    1 只保存指令的:i-cache

    2 只保存程序数据的:d-cache

    3 既保存指令又保存数据的:统一的高速缓存

    高速缓存参数的性能影响

    1.性能:

    • 不命中率 = 不命中数量/引用数量
    • 命中率 = 1 - 不命中率
    • 命中时间
    • 不命中处罚:因为不命中所需要的额外的时间

    编写高速缓存友好的代码

    1.基本方法:

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

    2.重要问题:

    • 对局部变量的反复引用是好的(时间局部性)
    • 步长为1的引用模式是好的(空间局部性)

    存储器山

    每台计算机都有表明他存储器系统的能力特色的唯一的存储器山。

    ——就是把存储器系统的性能用关于时间和空间局部性的山表示。

    想要达成的目的:使得程序运行在山峰而不是低谷

    目标:利用时间局部性,使得频繁使用的字从L1中取出;利用空间局部性,使得尽可能多的字从一个L1高速缓存行中访问到。

    参考资料:

    课本

    百度

    闫佳歆

  • 相关阅读:
    【转】STL中map用法详解
    【转】容器 C++ set和map
    .NET简谈面向接口编程 狼人:
    详解.NET程序集的加载规则 狼人:
    ASP.NET MVC 入门介绍 (上) 狼人:
    页面片段缓存(二) 狼人:
    改善代码设计 —— 优化物件之间的特性(Moving Features Between Objects) 狼人:
    改善代码设计 —— 组织好你的数据(Composing Data) 狼人:
    C# 中奇妙的函数联接序列的五种简单方法 狼人:
    Log4Net 全方位跟踪程序运行 狼人:
  • 原文地址:https://www.cnblogs.com/chuishi/p/4908897.html
Copyright © 2011-2022 走看看