当前位置: 首页 > news >正文

计算机组成原理-华科版本

文章目录

  • 序言
  • Memory
    • 大容量 高速度 低成本
    • 分类
      • 存储介质
      • 存取方式
      • 信息可改写性
      • 信息可保存性
      • 功能和存取速度
    • 存储器技术指标
      • 存储容量
      • 存取速度
    • 主存中数据的存放
      • 存储字长和数据字长的概念
      • 地址访问模式
      • 数据对齐
    • 半导体存储器
      • 静态MOS存储单元
        • 存储单元扩展
        • 字长扩展
      • 动态MOS存储器
      • 只读存储器
    • 主存的组织与CPU的连接
      • 存储器与CPU的连接
      • 存储器的扩展
    • Cache
      • cache实现的关键技术
      • 相联存储器 Content Addressable Memory CAM
      • 地址映射 多做题 多理解
        • 全相联 Full Associative Mapping
        • 直接相联 Direct Mapping 课后两题一定要做
        • 组相联 Set Associative Mapping

序言

此篇博客为阅读 谭志虎版计组 中记录的内容。主要为书本内容摘抄和注解。
为方便自己日后再次阅读,梳理。

Memory

大容量 高速度 低成本

分类

存储介质

磁存储器:利用磁化单元剩磁的不同磁化方向来存储数据0和1. 体积大,存取速度慢,单位容量成本最低。

半导体存储器:双极型存储器,MOS存储器。静态MOS存储器(SRAM),动态MOS存储器(DRAM),体积小,速度快,单位容量成本高。

光存储器:利用介质的光学特性读出数据。便于携带,成本低。

存取方式

随机存储器(RAM Random Access Memory):按照地址随机读写数据存储单元,且存取访问时间与存储单元的位置无关。半导体存储器。

顺序存储器(SAM Sequential Access Memory): 存储单元中的内容只能按地址顺序访问,访问速度和存储单元的位置有关。磁带。

直接存储器(DAM Direct Access Memory): 不必经过顺序搜索就能在存储器中直接存取信息的存储器。磁盘。

信息可改写性

既能读出又能写入:读写存储器。

不允许被读出:只读存储器。ROM read only memory

信息可保存性

易失存储器:断电后,所保存的信息会丢失的存储器。

非易失存储器:断电后,所保存的信息不丢失的存储器。

功能和存取速度

寄存器存储器:字长一般与机器字长相等,CPU内部,存放结果。

高速缓冲存储器:cache,用静态RAM构成,用于缓冲CPU和慢速主存之间的性能差异。

主存储器:MM(Main Memory)CPU能直接访问的存储器,存放指令和数据。主存并不是单一的内存,还包括BIOS.硬件端口。

外存储器:计算机主机外的存储器。磁盘,磁带等。

存储器技术指标

存储容量

存储器可以存储的二进制信息总量。

1K * 4 : 1K个单元,长度为4位

128B 表示 该芯片有128个单元

存取速度

存取时间:存储器的访问时间,启动一次存储器操作到该操作完成所经历的时间。

存取周期:连续启动两次访问操作之间的最短时间间隔。

存储器带宽:单位时间内存储器所能传输的信息量。

主存中数据的存放

存储字长和数据字长的概念

存储字长:主存的一个存储单元所存储的二进制位数。

数据字长:计算机一次能处理的二进制的位数。

这两个不一定相等。字长为32位的计算机所采取的存储字长可以是16位,32位,64位。

地址访问模式

主存通常按照字节编址。主存可以按照字节访问,还可以按16位半字访问。

主存地址可以分为:字节地址,半字地址,字地址。

字节地址右移一位得到半字地址,右移两位得到字地址。

; 数据段寄存器DS为 0 
mov ah, [8] ; 按字节寻址 ah = 0x12
mov ax, [8] ; 按半字寻址 ax = 0x3412
mov eax, [8] ; 按字寻址 eax = 0x78563412
; 8  9  a  b
; 12 34 56 78
; intel为小端 低字节放低位 高字节放高位 方便机器处理 : Intel x86, IA64 RISC-V
; 按照大端 低字节放高位 高字节放低位 符合人类思维 : PowerPC
; ARM, MIPS 同时支持小端 大端
; 上述如果按照大端进行访问得到的结果为
; ah = 0x12
; ax = 0x1234
; eax = 0x12345678

数据对齐

现代计算机主存按照字节编址,但是高级语言中不同数据类型的变量对应不同的字节长度。

如果按照对应字节长度顺序地分配地址,不好访问数据。

因为主存虽然按字节编址,但是存储字长是字节的整数倍,但是当一个多字节变量分布在不同字存储单元中时,比如double类型,8字节,如果是一个存储字长为4字节的机器,最优的放置方案是放置连续的字存储单元。但是如果按照字节去分配,它就有可能分散在3个字存储单元中。

这样虽然会造成一定的空间浪费,但是可以有效提高存储速度。现代编译器除了会对数据变量进行边界对齐,还会对数据结构进行边界对齐。

半导体存储器

静态MOS存储单元

存储单元是存储器中最小存储单元,作用是存储一位二进制信息。

1.具有两种稳态

2.两种稳态可以经过外部信号控制相互转换

3.经控制后可以读出其中信息

4.无外部原因,其中信息可以长期保存

存储单元扩展

采取二维的双译码结构,减少地址线条数。但是这样一次只能访问一位数据。

为了访问多位,需要字长扩展。

字长扩展

字长扩展其实很简单,要一次访问多位数据,其实就是要同一个地址下能够取出多位数据。

只需要把之前的多个一位合并,组成存储阵列即可。

6位x向地址,6位y向地址,总共4片阵列,那么得到的就是2^6 * 2^6 * 4 = 4096*4位

动态MOS存储器

存储器以动态MOS存储元为基本单位组成的存储器称为动态MOS存储器。(DRAM)

只读存储器

信息只能读出,不能随意写入的存储器称为只读存储器。记为ROM。

通过一定方式将信息写入之后,信息就固定在其中,且具有非易失性,即使电源断电,保存的信息也不会丢失。

Mask ROM:掩膜式只读存储器,只能读出,不能修改,灵活性较差,信息固定不变,可靠性高。

Programmable ROM:用户可写一次的ROM;

EPROM Erasable Programmable ROM,可擦除可编程只读存储器。可多次写入的ROM。写入的信息可长期保存,当不需要这些信息或希望修改的时候,可以擦除后重新写入。

主存的组织与CPU的连接

存储器与CPU的连接

单片存储器容量有限,要获得一个大容量的存储器,通常需要将多片存储器按照一定方式组织来实现并与CPU连接。

需要注意以下几点:

1.连接的地址线的数量与CPU要访问的主存容量有关。

2.连接的数据线的数量与计算机字长有关。

3.SRAM芯片的控制线包括片选信号和读写控制线。

4.ROM芯片的控制线只有片选控制线。

5.DRAM没有片选控制线,进行容量扩展时,可以利用~RAS和 ~CAS控制芯片的选择。

存储器的扩展

由于存储器芯片的容量及字长与目标存储器的容量及字长之间可能存在差异,应用存储芯片组织一定容量与字长的存储器时,可采用位扩展,字扩展,字位同时扩展的方式组织。

位扩展即字长扩展。需要256K * 32 的存储器芯片,但是只有256k * 1 的存储器芯片,这个时候就需要位扩展。

字扩展即容量扩展,需要 2M * 8 但是只有 256k * 8, 此时就需要利用一部分地址去组成 译码器。进而去选择确切的芯片。

字位同时扩展即需要 2M * 8 ,但是只有 256k * 1 。要不先进行位扩展,再进行字扩展,要不反过来。

Cache

在主存和CPU中增加一个隐藏的小容量的快速的SRAM。

将主存中经常访问或即将访问的数据的副本调度到小容量的SRAM中,使得大部分访问都可以在快速的SRAM中进行。(程序局部性原理)

程序局部性原理:在一段时间内,整个程序的执行仅限于程序中的某一部分,而执行程序所需的指令和数据也仅局限于某个存储区域内。

时间局部性原理:当程序访问某个存储位置时,该位置也可能在未来被多次访问。

空间局部性原理:一旦程序访问了某个存储单元,其周围的存储单元也即将被访问。

CPU不再直接访问主存,而是访问Cache。

如果数据在Cache, 即为 Hit 命中。 命中时的数据访问时间称为命中范围时间tc。查找时间和cache访问时间。

如果数据不在Cache中,即为Miss 数据缺失。此时需要将缺失数据从主存调入Cache。

数据缺失时的访问时间称为缺失补偿(Miss Penalty)

为了快速查找和比较,cache和主存都被分为多个固定大小的数据块。

主存地址和cache地址可以分为块内地址和块内偏移地址(offset)

读操作,命中cache即读入,缺失从mm中取出数据放入cache再读取。

写操作,命中cache后,决定是写到cache中(写回),还是一直写到mm中(写穿)。写回速度快,但是会导致mm和cache数据不一致,cache中的数据称为脏数据。写穿数据一致,但是速度慢。

缺失则从mm中取出数据再进行上述判断。

cache实现的关键技术

数据查找(Data Identification)如何快速判断数据是否在cache中

地址映射(Address Mapping)主存中的数据块如何放到cache中

替换策略(Placement Policy)cache满后如何处理,选择什么样的数据块进行操作

写入策略(Write Policy)如何保证cache和memory数据的一致性

相联存储器 Content Addressable Memory CAM

按内容进行访问的存储器,用于存放查找表,其内部存储的基本数据单元是键值对(key, value)

输入的不是地址,而是关键字key。输出该关键值对应的value。CAM用于cache的快速查找,用于在虚拟存储器中存放段表,页表和TLB表。

地址映射 多做题 多理解

全相联 Full Associative Mapping

各主存块都可以映射到cache的任意数据块。

将主存按照 每2^w个 分块,得到内存块b0,b1,b2…bn-1,bn,…,b2n-1,…,bmn-n,…,bmn-1

那么整体地址就可以分为 s + w bits。2^s = mn

主存地址-> 主存块地址(tag) 2^s + 块内偏移(offset) 2^w

对于cache 除了要存储具体的信息外,还需要去存储标记信息。

有效位+主存块地址+数据块副本。

cache总共有n块。因此cache副本缓冲区的容量为 n * 2^w * 8 bits = n * 2^w bytes

如果再算上标记位,cache实际容量为 n * (1 + s + 8 * 2^w) 位。

这样的话,每次查询数据就需要去做n*(1+s)位比较,看看在cache中是否存在相关数据块,找到后输出,这个数据块中offset 后的 数据。

特点:

1.主存数据块可以映射到cache任何一行,cache利用率高

2.只要cache中还有空行就不会引起冲突,因此cache冲突率低

3.查找时需要并发比较查找表中所有项,每一个cache行对应一个比较电路,硬件成本比较高,只适合于小容量cache使用。

4.cache满时载入新数据块需要利用替换算法进行替换,替换策略和算法较为复杂。

直接相联 Direct Mapping 课后两题一定要做

各主存块只能映射到cache中的固定块。

cache 行号 i = 主存块号 j mod (cache 行数 n)

主存地址-> 区地址 s-r + 行索引 r + 块内偏移 offset w 位

2^r >= n

也就是说cache 的每一行 必然是它区地址 中 2^r 块中 对应的那一行。 要再读取这行的具体数据,就再根据offset去读。

因此,cache的实际容量为 n * (1 + (s-r) + 8 * 2^r )位。

直接相联的替换算法较为简单,如果访问不命中则直接替换行索引译码器选中的行即可;所选中的行存在脏数据,需要将脏数据写入二级存储器保证数据一致。

特点:

1.主存数据块只能映射到cache中的特定行,cache利用率低,命中率低。

2.index 相同的所有主存块映射到cache中的同一行,cache未满也可能发生数据冲突,cache的冲突率高。

3.查找时只需根据index字段访问对应cache行的标记字段tag并进行比较,只需要一个比较器,硬件成本低,适合于大容量cache的使用。

4.无须使用复杂的替换算法,直接替换冲突数据即可。

组相联 Set Associative Mapping

各主存块只能映射到cache固定组中的任意块。

相关文章:

  • 计算机网络原理 谢希仁(第8版)第五章习题答案
  • 记一次Netty堆外内存溢出OutOfDirectMemoryError
  • 设计模式详解:模式汇总与索引清单
  • SpringSecurity实战-第5章 自动登录和注销登录
  • Python基础内容训练9(文件操作)
  • 冰冰学习笔记:list的简单模拟
  • 基于鸽群优化算法的线性规划求解matlab程序
  • 【博客505】k8s Sig-scheduler Coscheduling调度器插件原理
  • 【Linux】I/O多路复用-SELECT/POLL/EPOLL
  • Python解释器路径寻找规则
  • [Qt桌面开发]一个Qt简单界面的开发
  • 文本的换行与包裹 之可能是全网最详细的 line-break 中文介绍
  • Matlab项目合作
  • 【Eigen】Chapter4 几何模块 Geometry
  • 【GAMES-104现代游戏引擎】4、引擎渲染基础(渲染基础数据、全局光照、PBR、阴影)
  • 【跃迁之路】【735天】程序员高效学习方法论探索系列(实验阶段492-2019.2.25)...
  • 2019.2.20 c++ 知识梳理
  • Centos6.8 使用rpm安装mysql5.7
  • create-react-app项目添加less配置
  • docker python 配置
  • golang中接口赋值与方法集
  • JavaWeb(学习笔记二)
  • java概述
  • LintCode 31. partitionArray 数组划分
  • Node + FFmpeg 实现Canvas动画导出视频
  • node和express搭建代理服务器(源码)
  • Python学习之路16-使用API
  • Spark in action on Kubernetes - Playground搭建与架构浅析
  • 区块链将重新定义世界
  • 软件开发学习的5大技巧,你知道吗?
  • 设计模式走一遍---观察者模式
  • 线上 python http server profile 实践
  • 用 vue 组件自定义 v-model, 实现一个 Tab 组件。
  • 在electron中实现跨域请求,无需更改服务器端设置
  • Mac 上flink的安装与启动
  • ​2021半年盘点,不想你错过的重磅新书
  • # 睡眠3秒_床上这样睡觉的人,睡眠质量多半不好
  • $emit传递多个参数_PPC和MIPS指令集下二进制代码中函数参数个数的识别方法
  • (9)目标检测_SSD的原理
  • (C语言)逆序输出字符串
  • (Redis使用系列) Springboot 实现Redis消息的订阅与分布 四
  • (Redis使用系列) Springboot 使用redis实现接口Api限流 十
  • (zt)基于Facebook和Flash平台的应用架构解析
  • (十)【Jmeter】线程(Threads(Users))之jp@gc - Stepping Thread Group (deprecated)
  • (五)Python 垃圾回收机制
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (原創) 如何動態建立二維陣列(多維陣列)? (.NET) (C#)
  • (转)fock函数详解
  • (转)MVC3 类型“System.Web.Mvc.ModelClientValidationRule”同时存在
  • (转)淘淘商城系列——使用Spring来管理Redis单机版和集群版
  • .babyk勒索病毒解析:恶意更新如何威胁您的数据安全
  • .gitattributes 文件
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .NET构架之我见
  • [ 手记 ] 关于tomcat开机启动设置问题