同一个结构可以有不同组成
- CPU
- main memory
- I/O
- system interconnection
使用stored program concept
- branch predition
- data flow analysis
- speculative execution
指令流水 超标量
- power
- RC delay(电容电阻延迟)
- memory latency
系统时钟
clock rate: 时钟频率
clock cycle: 时钟周期
cycle time: 周期时间
CPI: cycles per instruction
MIPS: millions of instruction per second 避免指令系数的情况出现
MFLOPS: millions of floating-point operations per second 复杂指令的情况
SPEC 程序集合, 用来测试指令运行情况
- SPEC存在专门的不同测试标准, 针对不同的情况
当核足够多的时候, 并发需要的时间接近0, 所以, 和程序有关
早期programming in headware
后期programming in software
- 数据和指令都存储在内容中
使用中断
program
timer
I/O
hardware failure
计算机的内存单元可以是按字节分和按字分的
- 内存单元的长度一样
字
是一个数据内容的所占的内容
比如一个INT
就是一个字, 字长代表长度
大端顺序/小端顺序: 内存中不同的存放方式
存在总线竞争的问题
多个部件的速度不一样, 总线的速度需要依靠速度最慢的设备
可能使用高速总线, 低速总线
- 双总线/三总线模式
- 同步传输方式, 使用一个
clock
总线控制全部的设备
可能在内存或者寄存器或者指令(常量)中
内存的速度没有寄存器快
- 存在间接寻址的方法
- 有符号的数字使用第0位作为符号位,
0
是正数 - 补码是把负数可以和正数一样表达
值是要被执行的指令
一个一个+1操作, 使得指令不断下移
可以通过转移改变偏移量实现if
操作
使用不同的标准, 配置适配器, 适配不同的model(外部输入输出)
- 有不同的接口电路编号
DMA控制器
自动操作从I/O到memory, 或memory到I/O
- CPU只需要处理一次, 传输两者开始的地址和写入的长度
内存有DRAM
和SRAM
SRAM速度更快, 容量小
命中率: CPU访问的时候, 多少可能在SRAM中找到需要的数据
cache连接CPU和main memory
- 缓存可以有多层, 每一层的缓存速度是不一样的
有寄存器
,总线
,ACU
(计算单元)
有顺序访问
,随机访问
,DMA
,相联访问
的方式
顺序访问就和磁带一样, 访问的时间是变量, 存储数据的叫做record
随机访问
- 随机访问的地址不同, 但是每个访问的时间都是一样的
相联访问同时比较多个, 键值对一样, 使用关键字匹配实现, 一般用在缓存中
DMA: 直接访问, 访问硬盘, 访问的时间是变量
- 内存是用电容实现的, 每次读出内容都是破坏性的, 所以需要写回去
- RAM: 读取哪个位置的时间是一样的
access time: 完成一个访问需要的事件
cycle time: 从上一次访问结束开始到下一次访问结束需要的时间
切换访问的时候可能需要消耗其他时间, 连续访问的效果
transfer rate: 传输的速度
volatile 易失性 nonvolatile
erasable 可以擦除的
internal 内存等
external 磁盘等
inboard memory
- register
- cache(SRAM) 静态随机访问存储器 不是用电容存储,使用MOS管构成的寄存器存储内容
- main memory 使用电容存储内容
outboard memory
- magnetic disk 机械盘
- CD-ROM
- CD-RW
- DVD-RW
- DVD-RAM
- blue ray
off-line storage
- DVD能存储4.3G, CD只有700MB左右
分块, 一个块有多个字节
cache 有 tag, 作为索引的key
缓存和内存是以块为单位传输的
CPU会自动检查内存内容是否在缓存(hit cache)中
命中, 然后进行地址转换
不命中, 先从main memory读取内容到cache, 然后再读取到CPU
- 缓存不是越大越好, 大的缓存判断命中需要的时间也要更长
给内存块分配在缓存块中的地址
映射方式:
- 全相联映射方式(assocative): 任意对应
- 直接映射(direct): 一一对应
- 替换算法(replacement algorithm): 淘汰原来已经在里面的内容, 替换掉, LRU/FIFO/LFU/RANDOM
写入政策
一段代码的地址不是真实的地址, 是由虚拟地址写着的
当内存的物理空间不足的时候, 把内存部分不是特别需要的内容交换到硬盘中
一段代码的地址不是真实的地址, 是由虚拟地址写着的
使用MMU转换你的虚拟地址为一个物理地址
logical cache
不需要经过MMU, 直接使用虚拟地址访问缓存
physical cache
使用物理地址存放的, 需要使用MMU
不同的映射方式
映射方式:
- 全相联映射方式(assocative): 任意对应
- 直接映射(direct): 一一对应
- 替换算法(replacement algorithm): 淘汰原来已经在里面的内容, 替换掉, LRU/FIFO/LFU/RANDOM
比如使用取模数的运算的直接映射运算方式
全相联的缓存存放的内容可能来自任何一个内存内容
set assocative(集合相联):
- 以block为单位作为转移的最小单位, 而不是block中的unit
1024 = 2^10
以byte作为一个最小单位
所以16MB就是24位的地址信息
- 内存的总位数由main memory的大小决定
包含以下三个字段
memory address = tag + line + word
word(存储字): 代表当前内容是内存块内第几个单元
line: 代表这个内容在第几个内存块中
在缓存中的LINE = 内存中的LINE 整除 缓存的总的块数
从缓存块确定是来自哪个内存块中地址, 检查TAG字段
- 缓存中的同一块内容的TAG一定是相同的
- TAG+LINE(来自缓存的LINE) = LINE(在main memory)
内存地址分成 TAG + WORD
-
不存在LINE, 因为缓存块可以存储任意一块内存块的内容
-
TAG直接代表内存中的块的信息
缓存由set构成, 一个set中块的位置是任意存储的, 但是一个块属于哪个set是确定的
缓存的内存一个地址包含多个block, 内存中的地址和缓存中的set是一一对应的, 但是在一个set中如何存放block是随意的
memory address = tag + set + word
set为
0000-1fff
的时候, set使用13bits
- 一个set有K个block的时候, 叫做K way mapping
一个变量的数据可能存放在不同的内存block中, 访问不同的block会造成性能的丢失, 所以对齐的时候, 可能可以减少对内存的访问
直接内存映射缓存可能造成很多的冲突问题
使用victim cache, 可以减少冲突造成的问题
当出现冲突的时候, 存放从缓存中淘汰的旧的缓存内容, 当出现再次使用这个旧的缓存的时候, 直接从牺牲缓存中获取
当CPU需要访问某个内存中的内存的时候, 但是这个内存内容不存在在缓存中, 需要把缓存中的一个内容和需要使用的内存内容替换
- LRU
least recently used 最少最近使用
- 一个内容在最近被访问, 之后被访问的概率也很高
在近期没有被访问的数据在未来也可能不会访问
替换最近最长时间没有被访问的内容
-
FIFO(first in first out)
-
LFU(least frequently used)
和LRU的区别是LRU存在时间限制, LFU没有时间限制
使用write through和wirte back
write through: 同时对内存和缓存都要操作, 效率低
write back: 只对缓存操作
被替换的时候, 直接覆盖内存的内容
分离成指令和数据两部分缓存
DRAM: 动态随机存储器
使用电容来存储数据
有电子代表1
每隔一段时间需要充电, refresh(全部读取一遍其实就实现了刷新, 叫做行再生装置)
- 单管的DRAM cell是破坏性的读取, 每次读取会破坏原先里面的内容, 会让全部变成0
- 需要刷新, 所以叫做动态的RAM
SRAM: 静态随机存储器
使用寄存器实现, 不需要定期充电刷新, 所以速度快
需要一直供电
共同处:
都是volatile(易失的)
DRAM: 内存条
SRAM: 缓存
传统的DRAM是异步的, 因为执行的速度不一样, 使用异步可以不依赖最慢的硬件速度, 但是需要等待响应码
使用SDRAM没有等待状态, 使用外部的时钟信号同步
一个上升沿或者下降沿都作为数据传输的同步信号(以前只是上升沿有效)
ddr的提升让prefetch buffer提升, 一次可以取出的内容
介于eprom(可擦除的编程ROM)和eeprom(电子可擦除的ROM)
- 不支持字节级别的擦除, 支持的是block级别的擦除
只读的
不需要供电
不需要从外存中读入内存
4M*4 代表有有4M个units, 4代表4bits
有21bits的地址使用11个地址线的时候, 所以需要输入两次, 需要使用锁存器
- 输入的时候分成row address和column address, 获取行地址和列地址放入锁存器
timing and control: 分成RAS(row address), CAS,WE(write enable),OE
全部读取一遍其实就实现了刷新, 叫做行再生装置
在刷新期间无法被访问, 这是弊端(集中式刷新)
分布式刷新: 把全部内容的读取刷新分步到2ms(刷新间隔)中, 每次刷新一部分就给CPU访问
- 因为DRAM的容量很大, 所以需要拆分到row address和column address
多个存储芯片合成一个芯片的时候, 实现位扩展, 每个芯片代表其中的一bit(全部工作)
比如四个存储芯片的时候, address的最后2bits作为选择哪个储存芯片工作,叫做自扩展(只有一个存储芯片工作)
- 可以组合实现新的扩展
多个主体可以并行, 速度快
读取经过MAR,BODY,MDR(memory data register)
可以使用交叉编址/顺序编址
顺序编址: 一个从0到4G - 1,一个从4G到8G-1
交叉编址: 一个存放奇数地址, 一个存放偶数地址
最后1bit作为分位地址(低位交叉编址)
前面的作为体内地址
硬件问题, 物理上永久的损伤
软件问题, 可能来自供电问题
奇偶校验法不能精确到哪一位错误了
FAT: file allocation table(文件分配表)
- wait for device (等待硬盘空闲)
- wait for channel (外部设备访问的隧道, 外围控制器)
- seek (寻道)
- ratational delay
- data transfer
access time = seek + ratational delay
RAID: 磁盘阵列
SSD: 固态硬盘
CD-ROM: 使用铝层反光, 有land,pit
光盘的数据在螺旋线(光道)上面
block访问的方式
使用
MIN
,SEC
,SEC
作为访问到第几个部分的信息
CR-R: CD recordable
write once and read many
CD-RW: CD rewritable
tape: 磁带
有多个磁道, 一下子可以读取多个磁道
也是使用多个block存储的
接口模块
有地址线
,数据线
,控制线
三个部分
使用控制信号, 数据在buffer中, 使用transducer
转换信号
- 处于外部设备和系统的总线之间, 系统总线不直接和外部设备接触, 之间有I/O model
作用:
控制, 定时
控制器通信
设备通信
数据缓冲
错误检查
- 外部设备也存在多种状态, 使用二进制编码表示, 存储在
state/control register
- 对外部设备的操作命令存入control register, 被I/O logic解析执行
programmed i/o: 用编程实现, 效率低
interrupt-driven i/o: 使用中断技术, 不会打断CPU
DMA: direct memory access
对于不同的接口寄存器, 使用不同的PORT, 有不同的编号
使用
memory-mapped i/o
设备和内存在同一个地址空间中
对设备的操作看起来像是对内存操作
好处: 不用设计访问设别的特殊指令
坏处: 使用地址表示的时候, 内存的address是太长了
使用
isolated I/O
(独立编址)设别是一套编址方式, 内存是一套
PSW: programe state word 程序状态字
根据逻辑部件, 把一个数字操作得出它的状态, 使用PSW表示
使用程序状态字寄存器存储
PC: 程序计数
weight: 权重
radix/base: 基
十进制转换二进制: 整数部分除以2, 小数部分乘以2
使用十六进制的原因:
比二进制表示的数字更加紧凑, 使用的数字的存储个数大多是4bits的倍速
算法运算单元 ALU
control signal: 用来选择运算模式
flags: 用来表示不同标志, 比如, 进位标志, 符号位.
使用状态实现一些功能, 比如
if
语句的判断检查sf(symbol flag), zf(zero flag)的内容
定点数: 小数点的位置固定
不同的定点防止定义混淆的问题: 不同的指令可以区分定点整数和定点小数
浮点数: 小数电的位置不固定
可以分成小数部分和整数部分
原码: 直观
补码: 运算简单, 基本都是使用补码表示数据
正数原码就是补码
负数的补码需要原码保留符号位, 其他位置取反然后末尾+1
- 补码的0是唯一的,
10000
表示-16 - 表示范围
-2^n~2^n-1
获取补码的方法再执行一遍就是原码
- 补码按照符号位扩展可以保证正常扩展数字
补码的位置全部取反然后取反, 末尾+1, 可以取到相反数
- 对于最小值
-2^n
的
-
补码的运算可能会溢出, 溢出之后符号可能会发生改变(不同的符号相加一定不溢出, 同号不一定溢出)
-
减法使用
被减数+减数的相反数
实现
补码获取原码:
最高位符号位的权重作为
-2^n
, 加权相加
一组数组存储上4位, 一组数组存储下4位
每次相加, 然后, 移位一位, 小的部分移到后4位数组
对于有符号的乘法, 符号位异或, 然后数据位执行乘法.
逻辑右移: 不考虑符号, 空出来的高位补零 (给无符号数字用)
算术移位: 空出来的最高位需要和原来的最高位是相同的, 需要保持出现的数字和符号位相同. (给有符号的数字用)