- 计算机原理之概述
- 计算机原理之组成
- 计算机组成原理之计算
- 计算机组成原理实践
计算机原理之概述
计算机的发展历史
- 计算机发展的四个阶段
- 微型计算机的发展历史
计算机的分类
- 超级计算机
- 大型计算机
- 迷你计算机(服务器)
- 工作站
- 微型计算机
计算机的体系与结构
冯诺依曼体系
将程序指令和数据一起存储的计算机设计概念结构
- 必须有一个存储器
- 必须有一个控制器
- 必须有一个运算器
- 必须有输入设备
- 必须有输出设备
现代计算机都是冯诺依曼机。
- 能够把需要的程序和数据送至计算机中
- 能够长期记忆程序、数据、中间结果及最终运算结果的能力
- 能够具备算数、逻辑运算和数据传送等数据加工处理的能力
- 能够按照要求将处理结果输出给用户
现代计算机的结构
- 现代计算机在冯诺依曼体系结构基础上进行修改
- 解决CPU与存储设备之间的性能差异问题
计算机的层次与编程语言
程序翻译与程序解释
- 计算机执行的指令都是L0
- 翻译过程生成新的L0程序,解释过程不生成新的L0程序
- 解释过程由L0编写的解释器去解释L1程序
计算机的层次与编程语言
- 硬件逻辑层
- 微程序机器层
- 传统机器层
它们的关系:
一条机器指令对应一个微程序
一个微程序对应一组微指令
操作系统层
汇编语言层
高级语言层
应用层
计算机的速度单位
容量单位
- 1Byte = 8bits
速度单位
- 网络速度 100M/S = 100 Mbps = 100 Mbit/s = (100/8)MB/s = 12.5MB/s
CPU速度
- CPU的速度一般体现在CPU的时钟频率
- CPU的时钟频率的单位一般是赫兹(Hz)
- Hz就是秒分之一 每秒中的周期性变动重复次数的计量
计算机的字符与编码集
字符编码集的历史
- ASCII码
- 使用7个bits就可以完全表示ASCII码
- 包含95个可打印字符
- 33个不可打印字符(包括控制字符)
- 很多应用或者国家中的符号都无法表示。于是7bits->8bits,出现Extended ASCII码
- Extended ASCII码
- 字符编码集的国际化
- GB2312
- GBK
- Unicode。定义了世界通用的符号集,UTF-*实现了编码。UTF-8以字节为单位对Unicode进行编码
计算机原理之组成
计算机的总线
总线的概述
USB:Universal Serial Bus(通用串行总线)
- 提供了对外连接的接口
- 不同设备可以通过USB接口进行连接
- 连接的标准,促使外围设备接口的统一
- PCI总线、ISA总线。。。。。。
- 解决不同设备之间的通信问题
总线的分类:
- 片内总线
- 芯片内部的总线
- 寄存器与寄存器之间
- 寄存器与控制器、运算器之间
- 高集成度芯片内部的信息传输线
- 系统总线
- 数据总线
- 双向传输各个部件的数据信息
- 数据总线的位数(总线宽度)是数据总线的重要参数。一般与CPU位数相同(32位、64位)
- 地址总线
- 指定源数据或目的数据在内存中的地址
- 地址总线的位数与存储单元有关。地址总线位数=n,寻址范围:
0~2^n
- 控制总线
- 控制总线是用来发出各种控制信号的传输线
- 控制信号经由控制总线从一个组件发给另一个组件
- 控制总线可以见识不同组件之间的状态(就绪/未就绪)
- 数据总线
总线的仲裁
为什么需要总线的仲裁
- 为了解决总线使用权的冲突问题
总线仲裁的方法
- 链式查询
- 好处:电路复杂度低,仲裁方式简单
- 坏处:优先级低的设备难以获得总线使用权
- 坏处:对电路故障敏感
- 计时器定时查询
- 仲裁控制器对设备编号并使用计数器累计计数
- 接收到仲裁信号后,往所有设备发出计数值
- 计数值与设备编号一致则获得总线使用权
- 独立请求
- 每个设备均有总线独立连接仲裁器
- 设备可单独向仲裁器发送请求和接收请求
- 当同时收到多个请求信号,仲裁器有权按优先级分配使用权
- 好处:响应速度快,优先顺序可动态改变
- 坏处:设备连线多,总线控制复杂
计算机的输入输出设备
常见的输入输出设备
- 常见输入设备
- 字符输入设备
- 图像输入设备
输入输出接口的通用设计
- 数据线
- 是I/O设备与主机之间进行数据交换的传送线
- 单向传输数据线
- 双向传输数据线
- 状态线
- IO设备状态向主机报告的信号线
- 查询设备是否已经正常连接并就绪
- 查询设备是否已经被占用
- 命令线
- CPU向设备发送命令的信号线
- 发送读写信号
- 发送启动停止信号
- 设备选择线
- 主机选择I/O设备进行操作的信号线
- 对连在总线上的设备进行选择
CPU与IO设备的通信
- 程序中断
- 当外围IO设备就绪时,向CPU发出中断信号
- CPU有专门的电路响应中断信号
- 提供低速设备通知CPU的一种异步的方式
- CPU可以高速运转同事兼顾低速设备的响应
- DMA(直接存储器访问)
- DMA直接连接主存与IO设备
- DMA工作时不需要CPU的参与
计算机存储器概览
存储器的分类
- 按照存储介质
- 半导体存储器。内存、U盘、固态硬盘
- 磁存储器。磁带、磁盘
- 按照存取方式
- 随机存储器(RAM)。随机读取、与位置无关
- 串行存储器。与位置有关、按顺序查找
- 只读存储器(ROM)。只读不写
存储器的层次结构
读写速度、存储容量、价格。位价:每比特位价格。
缓存、主存、辅存
- 缓存-主存层次
- 原理:局部性原理
- 局部性原理是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
- 实现:在CPU与主存直接增加一层速度快(容量小)的Cache
- 目的:解决主存速度不足的问题
- 原理:局部性原理
- 主存-辅存层次
- 原理:局部性原理
- 实现:主存之外增加辅助存储器(磁盘、SD卡、U盘等)
- 目的:解决主存容量不足的问题
计算机的主存储器与辅助存储器
- 主存储器–内存
- RAM(随机存取存储器:Random Access Memory)
- RAM通过电容存储数据,必须隔一段时间刷新一次
- 如果掉电,那么一段时间后将丢失所有数据
- 辅助存储器–磁盘
- 表面是可磁化的硬磁特性材料
- 移动磁头径向运动读取磁道信息
- 磁盘调度算法
- 先来先服务算法
- 按照顺序访问进程的磁道读写需求
- 最短寻道时间优先
- 与磁头当前位置有关
- 优先访问离磁头最近的磁道
- 扫描算法(电梯算法)
- 每次只往一个方向移动
- 到达一个方向需要服务的尽头再反方向移动
- 循环扫描算法
- 只往一个方向移动
- 先来先服务算法
计算机的高速缓存
- 高速缓存的工作原理
- 字:是指存放在一个存储单元中的二进制代码组合
- 字块:存储在连续的存储单元中而被看做是一个单元的一组字
- 字的地址包含两个部分。前m位指定字块的地址,后b位指定字在字块中的地址
- 命中率是衡量缓存的重要性能指标
- 理论上CPU每次都能从高速缓存存取数据的时候,命中率为1
- 命中率:h = Nc/(Nc+Nm)。访问效率:e = Tc/Ta = Tc/(hTc + (1-h)Tm)
- 高速缓存的替换策略
- 随机算法
- 先进先出算法 FIFO
- 把高速缓存看做是一个先进先出的队列
- 优先替换最先进入队列的字块
- 最不经常使用算法 LFU
- 优先淘汰最不经常使用的字块
- 需要额外空间记录字块的使用频率
- 最近最少使用算法 LRU
- 优先淘汰一段时间内没有使用的字块
- 有多种实现方法,一般使用双向链表
- 把当前访问节点置于链表前面,保证链表头部节点是最近使用的。淘汰链表尾部节点
计算机的指令系统
机器指令的形式
- 机器指令主要由两部分组成:操作码、地址码
- 操作码指明指令所要完成的操作
- 操作码的位数反映了机器的操作种类
- 地址码直接给出操作数或者操作数的地址
- 分三地址指令、二地址指令、一地址指令、零地址指令
- 零地址指令:在机器指令中无地址码。空操作、停机操作、中断返回操作等
机器指令的操作类型
- 数据传输
- 寄存器之间、寄存器与存储单元、存储单元之间传送
- 数据读写、交换地址数据、清零置一等操作
- 算术逻辑操作
- 操作数之间的加减乘除运算
- 操作数的与或非等逻辑位运算
- 移位操作
- 数据左移(乘2)、数据右移(除2)
- 完成数据在算术逻辑单元的必要操作
- 控制指令
- 等待指令、停机指令、空操作指令、中断指令等
机器指令的寻址方式
- 指令寻址
- 顺序寻址
- 跳跃寻址
- 数据寻址
- 立即寻址
- 指令直接获取操作数,无需访问存储器
- 直接寻址
- 直接给出操作数在主存的地址
- 寻找操作数简单,无需计算数据地址
- 间接寻址
- 指令地址码给出的是操作数地址的地址
- 需要访问一次或多次主存来获取操作数
- 立即寻址
计算机的控制器
控制器是协调和控制计算机运行的 控制器分为:
- 程序计数器
- 用来存储下一条指令的地址
- 循环从程序计数器中拿出指令
- 当指令被拿出时,指向下一条指令
- 时序发生器
- 电气工程领域,用于发送时序脉冲
- CPU依据不同的时序脉冲有节奏的进行工作
- 指令译码器
- 控制器的主要部件之一
- 计算机指令由操作码和地址码组成
- 翻译操作码对应的操作以及控制传输地址码对应的数据
- 各种寄存器
- 指令寄存器
- 也是控制器的主要部件之一
- 从主存或高速缓存取计算机指令
- 主存地址寄存器
- 保存当前CPU正要访问的内存单元的地址
- 主存数据寄存器
- 保存当前CPU正要读或写的主存数据
- 通用寄存器
- 用于暂时存放或传送数据或指令
- 可保存ALU的运算中间结果
- 容量比一般专用寄存器要大
- 指令寄存器
计算机的运算器
运算器是用来进行数据运算加工的
- 数据缓冲器
- 分为输入缓冲和输出缓冲
- 输入缓冲暂时存放外设送过来的数据
- 输出缓冲暂时存放送往外设的数据
- ALU
- ALU:算术逻辑单元,是计算机的主要组成
- 常见的位运算(左右移、与或非等)
- 算术运算(加减乘除等)
- 通用寄存器
- 用于暂时存放或传送数据或指令
- 可保存ALU的运算中间结果
- 容量比一般专用寄存器要大
- 状态字寄存器
- 存放运算状态(条件码、进位、溢出、结果正负等)
- 存放运算控制信息(调试跟踪标记位、允许中断位等)
计算机指令的执行过程
- 指令执行过程
- 取指令:从缓存取指令,送到指令寄存器
- 分析指令:指令译码器译码,发出控制信号,程序计数器+1
- 执行指令:装载数据到寄存器,ALU处理数据,记录运算状态,送出运算结果
- CPU的流水线设计
- 类似工厂的装配线
- 工厂的装配线使得多个产品可以同时被加工
- 在同一个时刻,不同产品均位于不同的加工阶段
计算机组成原理之计算
进制运算的基础
进制概述
- 进制的定义
- 进位制是一种计数方式,亦称进位计数法或位值记数法
- 有限种数字符号来表示无限的数值
- 使用的数字符号的数目成为这种进位制的基数或底数
- 常见的进制
二进制运算的基础
- 二进制转化十进制:按权展开法
N = (01100101) = 1*2^6 + 1*2^5 + 1*2^2 + 1 = 101
- 十进制转换二进制:重复相除法
- 小数二进制转换十进制:按权展开法
N = (0.11001) = 1*2^-1 + 1*2^-2 + 1*2^-5 = 0.78125 = 25/32
- 小数十进制转二进制:重复想乘法
有符号数与无符号数
- 原码表示法
- 使用0表示正数、1表示负数
- 规定符号位位于数值第一位
- 表达简单明了,是最容易理解的表示法
二进制的不补码表示法
- 补码的定义
- n=4,x=13。x的补码 = 原码 = 01101
- x=-13。x的补码 = 2^5-13 = 100000-1101 = 10011
二进制的反码表示法
反码的定义
负数的反码等于原码除符号位外按位取反
负数的补码等于反码+1
小数的补码
- 二进制小数的补码
定点数与浮点数
定点数的表示方法
- 小数点固定在某个位置的数成为定点数
- 纯小数:小数点位于符号位和数值位之间
- 纯整数:小数点位于符号位和数值位之后
- 如果不是纯小数也不是纯整数,就需要乘以一个比例因子以满足定点数的保存格式
- 计算机处理的很大程度上不是纯小数或纯整数
- 数据范围很大,定点数难以表达
浮点数的表示方法
- 浮点数的表示格式
- 浮点数的表示范围
- 假设阶码数值取m位,尾数取n位
- 阶码表示范围:[-(2^m-1),2^m-1]
- 尾数表示范围:[-(1-2^-n),-(2^-n)] [2^-n,1-2^-n]
- 单精度浮点数:使用4字节、32位来表达浮点数 float
- 双精度浮点数:使用8字节、64位来表达浮点数 double
- 浮点数的规格化
- 尾数规定使用纯小数
- 尾数最高位必须是1 定点数与浮点数的对比
- 当定点数与浮点数位数相同时,浮点数表示的范围更大
- 当浮点数尾数为规格化数时,浮点数的精度更高
- 浮点数运算包含阶码和尾数,浮点数的运算更为复杂
- 浮点数在数的表示范围、精度、溢出处理、编程等方便均优于定点数
- 浮点数在数的运算规则、运算速度、硬件成本方便不如定点数
定点数的加减法运算
定点数的加法运算
- 数值位与符号位一同运算,并将符号位产生的进位自然丢掉
判断溢出
- 双符号位判断法
- 单符号位表示变成双符号位:0=>00,1=>11
- 双符号位产生的进位丢弃
- 结果的双符号位不同则表示溢出
定点数的减法运算
浮点数的加减法运算
运算步骤
- 对阶
- 对阶的目的是是的两个浮点数阶码一致,使得尾数可以进行运算
- 浮点数尾数运算简单
- 浮点数尾数实际小数位与阶码有关
- 阶码按小阶看齐大阶的原则
- 尾数求和
- 使用补码进行运算
- 减法运算转化为加法运算:A - B = A + (-B)
- 尾数规格化
- 对补码进行规格化需要判断两种情况:S>0和S<0
- 尾数规格化(右移)
- 一般情况下都是左移
- 双符号位不一致下需要右移(定点运算的溢出情况)
- 右移的话需要进行舍入操作
- 舍入
- “0舍1入”法(二进制的四舍五入)
- “0舍1入”法(二进制的四舍五入)
- 溢出判断
- 浮点数运尾数双符号位不一致不算溢出,因为尾数双符号位可以右移进行规格化
- 浮点运算主要通过阶码的双符号位判断是否溢出
- 如果规格化后,阶码双符号位不一致,则认为溢出
浮点数的乘除法运算
浮点数乘法
浮点数除法
例子
计算机组成原理 实践
双向链表的原理与实践1
- 双向链表可以快速找到上一个节点(和下一个节点)
- 可以快速的去掉链表中的某一个节点
代码:https://github.com/Cuiks/review