浮点数表示
- 是符号位。
- 是尾数部分(小数点后面的部分,默认省略小数点前面的1)。
- 是无符号的阶码。
- Bias(偏移量) 是用于将阶码变为无符号整数的值:
- 单精度:127(即 )
- 双精度:1023(即 )
| 符号位() | 阶码() | 尾数() |
|---|---|---|
| 1 | 8/11 | 23/53 |
校验码
1、奇偶校验码
奇偶校验码是一种简单的错误检测方法,适用于检测单个比特错误。
基本原理
奇偶校验通过在数据末尾添加一个附加位(称为校验位)来工作。校验位的值根据数据中 1 的个数来确定:
- 奇校验(Odd Parity) :校验位使得数据中
1的总数为奇数。 - 偶校验(Even Parity) :校验位使得数据中
1的总数为偶数。
2、循环冗余码
循环冗余校验码(CRC) 是一种强大的错误检测码,广泛用于网络通信、存储设备和数字通信中。
基本原理
CRC 使用多项式除法来生成校验码。其基本过程如下:
- 将数据视为一个二进制多项式。
- 使用一个预定义的生成多项式对数据多项式进行模 2 除法(异或运算)。
- 余数就是 CRC 校验码,将其附加在数据末尾一起发送。
接收方接收数据后,使用相同的生成多项式对数据(包括CRC校验码)进行模 2 除法。如果余数为 0,说明数据没有错误;否则,数据发生错误。
示例
假设数据是 110101,生成多项式是 1011:
- 将数据附加生成多项式位数减一的零:
110101000。 - 使用多项式除法计算余数,余数为
011。 - 结果数据为
110101011。
3、海明码
海明码(Hamming Code) 是一种错误检测和纠正码,能够检测和纠正单比特错误。
基本原理
海明码通过在数据中插入冗余位(校验位)来实现错误检测和纠正。校验位的位置遵循 的形式(如第 1、2、4、8 位等)。校验位的值通过特定位数的 XOR(异或)运算来计算。
- 生成规则:对于一个 比特的数据,使用 个校验位( 为满足 的最小整数),插入到数据中相应的位置。
- 检验过程:接收方重新计算每个校验位的值,如果校验值不匹配,则可以定位到错误的比特位。
示例
假设要传输数据 1011,使用海明码生成:
- 插入校验位:原数据变成
1 0 1 p3 1 p2 p1,其中 p 为校验位。
| H7 | H6 | H5 | H4 | H3 | H2 | H1 |
|---|---|---|---|---|---|---|
| D4 | D3 | D2 | p3 | D1 | p2 | p1 |
| 1 | 0 | 1 | 1 |
- 计算校验位的值:
| p3 | p2 | p1 | |
|---|---|---|---|
| H7 | 1 | 1 | 1 |
| H6 | 1 | 1 | 0 |
| H5 | 1 | 0 | 1 |
| H3 | 0 | 1 | 1 |
- p1校验位:覆盖H3、H5、H7,得到 p1=1⊕1⊕1=1.
- p2校验位:覆盖H3、H6、H7,得到 p2=1⊕0⊕1=0.
- p3校验位:覆盖H5、H6、H7,得到 p3=1⊕0⊕1=0.
-
最终海明码为:
1010101。 -
错误检测和纠正:
- 接收方计算校验位并与接收到的校验位进行比较,如果存在差异,则可以确定错误位的位置并进行纠正。
flynn分类
定义:计算机体系结构中用于描述计算机系统处理并行性的能力的一种分类方法
| 类名 | 简写 | 描述 |
|---|---|---|
| 单指令流单数据流 | SISD | 表示计算机系统在每个时钟周期内只能执行一条指令,并且该指令只能处理单个数据元素 |
| 单指令流多数据流 | SIMD | 表示计算机系统在每个时钟周期内可以执行同一条指令,但该指令可以同时处理多个数据元素 |
| 多指令流单数据流 | MISD | 表示计算机系统在每个时钟周期内可以执行多条指令,但这些指令处理的是相同的数据元素 |
| 多指令流多数据流 | MIMD | 表示计算机系统在每个时钟周期内可以执行多条不同的指令,并且这些指令可以处理不同的数据元素 |
| 单指令流多线程 | SIMT | 一种扩展的SIMD架构,主要应用于GPU中。虽然与SIMD类似,但SIMT每个线程可能对相同的指令产生不同的控制流 |
| 单程序多数据 | SPMD | 多个处理单元执行相同的程序,但处理不同的数据集。与MIMD架构相似,但所有处理单元运行的程序通常相同 |
指令系统的寻址方式
1. 立即寻址(Immediate Addressing)
- 定义:操作数是直接包含在指令中的一个常数。
- 表示形式:指令中直接给出操作数的值。
- 优点:无需访问内存,执行速度快。
- 缺点:只能用于常数,操作数的范围受指令长度限制。
示例:MOV A, #5 // 将立即数 5 移动到寄存器 A。
2. 直接寻址(Direct Addressing)
- 定义:操作数的地址直接在指令中给出,操作数存储在内存的某个固定地址中。
- 表示形式:指令中包含操作数的内存地址。
- 优点:访问简单,指令长度较短。
- 缺点:内存地址的范围受指令长度限制,指令不够灵活。
示例:MOV A, [1000H] // 从内存地址 1000H 读取数据到寄存器 A。
3. 寄存器寻址(Register Addressing)
- 定义:操作数位于寄存器中,指令中指定寄存器。
- 表示形式:指令中包含寄存器编号或名称。
- 优点:操作速度快,指令长度短。
- 缺点:寄存器数量有限,无法处理大量数据。
示例:ADD A, B // 将寄存器 B 的值加到寄存器 A。
4. 寄存器间接寻址(Register Indirect Addressing)
- 定义:指令指定一个寄存器,该寄存器中存储的是操作数的地址。
- 表示形式:操作数地址存储在寄存器中,指令中给出寄存器的名称。
- 优点:适用于数组和表格等数据结构,灵活性高。
- 缺点:需要多次访问内存,速度相对较慢。
示例:MOV A, [BX] // 使用寄存器 BX 中的地址访问内存,将数据移到寄存器 A。
5. 隐含寻址(Implicit Addressing)
- 定义:操作数隐含在指令中,无需显式给出。
- 表示形式:操作数在指令中没有明确指明,通常是一个固定寄存器或栈。
- 优点:指令长度最短,执行速度快。
- 缺点:灵活性低,只能操作固定的寄存器或内存位置。
示例:CLR // 清除累加器(隐含地操作一个固定的寄存器)。
6. 基址寻址(Base Addressing)
- 定义:操作数的地址是基地址寄存器的内容加上指令中给出的位移量(偏移量)。
- 表示形式:
[基址寄存器 + 偏移量]。 - 优点:适用于处理动态数据结构,如链表等,支持程序的重定位。
- 缺点:需要额外的计算,指令较复杂。
示例:MOV A, [BX+04H] // 将基址寄存器 BX 加上偏移量 04H 指向的内存数据移到寄存器 A。
7. 变址寻址(Indexed Addressing)
- 定义:操作数的地址是变址寄存器的内容加上指令中给出的位移量。
- 表示形式:
[变址寄存器 + 偏移量]。 - 优点:常用于访问数组中的元素,灵活性高。
- 缺点:需要额外的计算,指令较复杂。
示例:MOV A, [SI+04H] // 使用变址寄存器 SI 加上偏移量 04H 访问内存数据移到寄存器 A。
8. 相对寻址(Relative Addressing)
- 定义:操作数的地址是程序计数器(PC)的内容加上指令中给出的偏移量。
- 表示形式:
[PC + 偏移量]。 - 优点:适用于跳转指令,程序的重定位和段间访问。
- 缺点:仅适用于相对地址的场景,指令不够灵活。
示例:JMP 05H // 跳转到当前指令位置加上偏移量 05H 处。
9. 堆栈寻址(Stack Addressing)
- 定义:操作数从栈顶指针(SP)指向的地址中取出或存入,通常用于函数调用和返回。
- 表示形式:操作数隐式地在栈顶,指令不需明确指明。
- 优点:适用于函数调用和递归等场合。
- 缺点:仅适用于与栈相关的操作,灵活性较低。
示例:PUSH A // 将寄存器 A 的值压入栈。
CISC和RISC的对比
| 特性 | CISC(复杂指令集计算) | RISC(精简指令集计算) |
|---|---|---|
| 指令集 | 多且复杂,每条指令可以完成多个操作 | 少且简单,每条指令通常只完成一个操作 |
| 指令长度 | 不固定,可能为一个字节到多个字节不等 | 固定,通常为4字节 |
| 寻址方式 | 多种复杂的寻址方式 | 少数几种简单的寻址方式 |
| 控制方式 | 微代码控制,执行速度较慢 | 硬连线控制,执行速度较快 |
| 指令执行时间 | 不一致,不同指令执行时间差异大 | 一致,大部分指令一个时钟周期内完成 |
| 寄存器数量 | 相对较少,依赖于内存访问 | 相对较多,鼓励使用寄存器操作 |
| 硬件复杂度 | 高,控制单元复杂,功耗大 | 低,控制单元简单,功耗较低 |
| 编译器设计 | 相对简单,由于指令集复杂性较高 | 需要编译器进行更多优化以生成高效的汇编代码 |
| 指令流水线 | 可以通过一定方式实现 | 必须实现 |
| 典型代表 | Intel x86系列、VAX | ARM、MIPS、SPARC、RISC-V、IBM POWER |
指令系统流水线的计算
流水线执行时间公式
-
流水线的深度(阶段数,
n) :指流水线的总阶段数(如取指、解码、执行、访存、写回等)。 -
每个阶段的时钟周期(
t) :流水线中每个阶段执行一次所需的时间,通常假设每个阶段的时间相等,或取最长阶段时间作为周期。 -
要执行的指令数(
k)。
流水线加速比公式
流水线的的吞吐率
CPU与外设之间的数据传输方式
1、程序控制方式
在程序控制方式中,数据传输是由CPU通过执行程序指令来完成的。CPU不断查询外设的状态寄存器,判断外设是否准备好接受或发送数据。这种方式有两种具体实现:
- 轮询方式(Polling I/O) :CPU不断地轮询外设的状态寄存器,以确定外设是否准备好进行数据传输。只有当外设准备就绪时,CPU才会进行数据读写操作。
- 程序控制输入/输出(Programmed Input/Output, PIO) :CPU通过编程方式读取外设寄存器,控制外设进行数据传输。在这种模式下,CPU是主动的,需要不断发出命令。
2、中断驱动方式
外设准备好进行数据传输时,会发出一个中断信号给CPU,CPU暂停当前的执行任务,转去处理中断服务程序(ISR),执行完成后再返回原任务。中断驱动方式解决了程序控制方式中的CPU等待时间问题。
- 中断过程:
- 外设发出中断信号。
- CPU暂停当前任务,保存上下文。
- 执行中断服务程序,完成数据传输。
- 恢复上下文,继续执行被暂停的任务。
直接存储器访问(Direct Memory Access, DMA)
CPU将数据传输任务交给DMA控制器(DMAC)。DMA控制器直接在内存和外设之间进行数据传输,而不需要CPU的干预。数据传输完成后,DMA控制器向CPU发送中断信号,告知传输结束。CPU可以在此期间执行其他任务,因此极大地提高了效率。
- DMA工作过程:
- CPU设置DMA控制器,指定内存地址、外设地址和数据传输长度。
- DMA控制器获得总线控制权,开始数据传输。
- 数据传输完成后,DMA控制器向CPU发送中断信号。
通道控制方式(Channel I/O)
通道控制方式是更加高级的一种I/O控制方式,通常用于大型计算机系统中。通道是一种特殊的处理器,用于管理和控制外设的数据传输。通道与DMA的不同在于,它能够同时管理多个外设并进行复杂的数据传输操作。
- 通道的类型:
- 字节多路通道(Byte Multiplexer Channel) :适用于多个低速外设的输入输出。
- 选择通道(Selector Channel) :用于高速设备的专用数据通道传输。
- 多路通道(Multiplexor Channel) :支持混合类型的数据传输,可以连接多种类型的设备。
缓存(cache)的地址映射方式
地址结构
- 标签位:用于区分在同一缓存行中可能存储的不同数据块。
- 索引位:用于决定主存中的一个数据块映射到缓存的哪一行。
- 块内偏移位:用于定位块内具体的字节地址。
直接映射
主存中的每个块都映射到缓存中的唯一一个位置(缓存行)。这种方式的映射是通过对缓存大小取模来计算的。
| 标 签 | cache行号 | 块内偏移位 |
|---|
全相联映射
主存中的任何数据块可以映射到缓存中的任何位置。换句话说,内存中的一个块可以放置在缓存的任何一行(多对多关系),不受限制。
| 标 签 | 块内偏移位 |
|---|
组相联映射
组相联映射是一种折衷方案,结合了直接映射和全相联映射的优点。在组相联映射中,缓存被分为若干个组(Set) ,每组包含多个缓存行(称为组相联度(n-way set associative) )。一个主存块可以映射到缓存中的一个组内的任何一行。
| 标 签 | 组号 | 块内偏移位 |
|---|
存储系统
主存扩展方式
- 位扩展
通过增加存储器的数据位宽来扩展主存的容量。这意味着每次从主存中读取或写入的数据量增加,可以加快数据传输速率。位扩展适用于需要增加数据并行处理能力的场景。
- 字扩展
通过增加地址线的数量,来扩展主存的寻址范围,从而增大存储容量。这种方式主要用于扩大存储器的地址空间,使得计算机能够寻址到更多的存储单元。
磁盘存储器
- 硬盘的存储结构
- 扇区(Sector):扇区是硬盘存储数据的最小单位,通常为512字节或4096字节。
- 磁道(Track):每个盘片被分成多个同心圆,称为磁道。磁道是盘片上的逻辑存储区。
- 柱面(Cylinder):不同盘片上具有相同半径的磁道组成一个柱面,柱面是一个硬盘存储区的三维描述。
- 簇(Cluster):簇是操作系统用于管理硬盘的最小分配单位,通常由多个扇区组成
- 硬盘性能指标
- 存取时间(Access Time) :包括寻道时间和旋转延迟,即磁头找到目标扇区并读取数据所需的时间。
- 寻道时间(Seek Time) :磁头移动到指定磁道所需的时间。
- 旋转延迟(Rotational Latency) :盘片旋转至目标扇区下方所需的时间,通常与盘片的转速有关。
- 数据传输率(Data Transfer Rate) :指数据从硬盘传输到计算机的速度,通常以MB/s(兆字节每秒)为单位。
- 缓存大小:硬盘自带的缓存用于缓冲数据,通常能提高数据传输的效率。缓存越大,传输性能通常越好。
- 磁盘阵列技术
RAID 的核心思想是通过不同方式将数据分布到多个物理磁盘上,增强系统的可靠性和性能。RAID阵列通常通过硬件控制器或软件实现,不同的RAID级别提供不同的性能、数据冗余和容错能力。
- 数据条带化(Striping) :将数据分成小块,然后将每个块分散写入到不同的磁盘中,从而提高读写速度。
- 数据镜像(Mirroring) :在多个磁盘上存储相同的数据,实现数据冗余。当一个磁盘发生故障时,另一个镜像磁盘能够保证数据安全。
- 奇偶校验(Parity) :通过计算校验位来提供数据冗余。当一个磁盘发生故障时,可以根据校验位和其他磁盘的数据恢复丢失的数据。
| RAID级别 | 原理 | 优点 | 缺点 | 适用场景 |
|---|---|---|---|---|
| RAID 0 | 将数据分成小块,分别存储在不同的磁盘上,读写操作并行进行 | 数据访问速度快,容量是所有磁盘容量的总和 | 没有数据冗余,单个磁盘故障会导致整个阵列的数据丢失 | 需要高读写速度且对数据安全性要求不高的场景,如视频编辑或临时数据存储 |
| RAID 1 | 将相同的数据写入两块或更多的磁盘,实现数据冗余 | 数据安全性高,容错能力强 | 存储效率低,磁盘利用率为50% | 对数据安全性要求极高的场景,如银行系统、关键数据库等 |
| RAID 5 | 将数据和校验信息分布存储在多个磁盘上。每个磁盘上既有数据块,也有校验块。当任意一块磁盘损坏时,可以通过其他磁盘的数据和校验块恢复数据 | 提供数据冗余的同时具有较好的读写性能。磁盘利用率较高(n-1),即使用n块磁盘时,容量为n-1块磁盘的总和 | 写入速度稍慢,因为每次写入需要计算校验位。只允许一个磁盘发生故障,多个磁盘故障会导致数据丢失 | 性能和数据冗余兼顾的场景,如中小型数据库、文件服务器 |
| RAID 6 | RAID 6 与 RAID 5 类似,但它使用双重奇偶校验 | 能够容忍两块磁盘同时故障 | 写入性能比 RAID 5 更低,因为需要计算两组奇偶校验信息 | 对数据安全性要求极高的大型存储系统,如企业级数据中心 |
| RAID 10 | RAID 10 结合了 RAID 1 和 RAID 0 的优点,首先将数据条带化,然后对每个条带的数据进行镜像 | 具有 RAID 1 的高数据安全性和 RAID 0 的高读写性能 | 磁盘利用率为50% | 需要高性能和高容错能力的场景,如大型数据库、虚拟化环境等 |
稀疏矩阵存储下标
假设上三角矩阵是 的矩阵,使用一维数组来存储其非零元素。
对于矩阵中的元素 ,其在一维数组中的下标公式为:
- 其中 和 分别表示行号和列号
上三角矩阵
-
行优先:
-
列优先:
下三角矩阵
-
行优先:
-
列优先: