夜雪天狼
学习笔记
技术博文
转载备份
心灵鸡汤
目录
计算机组成原理【02318】
发布者:caijw
阅读量:26745
发布时间:2020-07-24 22:07:13
# 概述篇 摒弃了硬件内容,专注软件逻辑与理论 ## 计算机发展简史 ### 计算机发展的四个阶段 一、 电子管计算机(1946-1957) * 二战是电子管计算机产生的催化剂,英国为了解密德国海军的密文,创造了全世界第一台电子管计算机 * 而埃尼阿克(ENIAC)是第一阶段最出名的计算机,是美国为了计算飞机和火箭的炮弹射击参数而创造的,非常庞大,拥有18000多个电子管,耗电量达到150千瓦,重量达30吨,占地1500平方英尺(约140平方米)  特点 * 集成度小,占用空间大 * 功耗高,运行速度慢 * 操作复杂,更换程序需要接线 二、 晶体管计算机(1957-1964) 1948年,贝尔实验室的三个科学家发明了晶体管,十年内晶体管给计算机带来了一次革命 著名的晶体管计算机有两个 * 第一台晶体管计算机TX0,诞生于MIT的林肯实验室 * PDP-1,当时性能最高的计算机,4k内存,每秒20w条指令,配备了512*512的显示器 特点 * 集成度相对较高,占用空间相对较小 * 功耗相对较低,运行速度较快 * 操作相对简单,交互更加方便 三、 集成电路计算机(1964-1980) 德州仪器的工程师发明了集成电路(IC) 特点 * 变得更小 * 功耗更低 * 计算的速度变得更快 > 操作系统的诞生 IBM已经是当时的计算机领域的领头羊了,有两款计算机卖的非常好,分别是7094和1401,但是这两款计算机主打功能不一样,且相互无法兼容,很多公司不愿意投入两组人力进行开发,IBM为了解决这个问题,就推出了兼容的产品System/360,即操作系统的雏形 四、 超大规模集成电路计算机(1980至今) * 一个芯片可以集成上百万的晶体管 * 速度更快,体积更小,价格更低,更能被大众接受 * 用途更丰富:文本处理,表格处理,高交互的游戏和应用 > apple 这一时代,乔布斯发明了Apple和Apple 二代 ### 微型计算机的发展历史 微型计算机发展历史主要是从计算机发展的第三个阶段开始的 微型计算机的发展是从算力方面去看待的,受限于CPU性能 * 单核CPU * 1971-1973 500KHz频率(字长8位) * 1973-1978 高于1MHz频率(字长8位) * 1978-1985 500MHz频率(字长16位) * 1985-2000 高于1GHz频率(字长32位) * 2000-现在 高于2GHz频率(字长64位) > 摩尔定律 价格不变的前提下,每18-24个月就会提升一倍,适用于20世纪 * 多核CPU,因为单核CPU性能到了瓶颈 * 2005年,Intel奔腾系列双核CPU,AMD速龙系列 * 2006年,Intel酷睿四核CPU * Intel酷睿十六核CPU * Intel至强系列五十六核CPU(服务器领域) ## 计算机的分类 一、超级计算机 功能最强,运算速度最快,存储容量最大的计算机,多用于国家高科技领域和尖端技术研究 标记他们运算速度的单位是TFlop/s:每秒一万亿次浮点计算 二、大型计算机,又称大型机,大型主机,主机等 具有高性能,可处理大量数据和复杂的运算 > 去IOE行动,I(IBM,服务器提供商),O(Oracle,数据库服务提供商),E(EMC,存储设备提供商),由阿里在2008年提出,直接导致了2009年阿里云成立 三、迷你计算机,又称小型机,服务器,是目前云服务的基础 不需要特殊的空调场所,具备不错的算力,可以完成较复杂的计算 四、工作站 高端的通用微型计算机,提供比个人计算机更强大的性能,类似于普通台式电脑,体积较大,但性能强劲 五、微型计算机 个人计算机,最普通的计算机,分为台式机,笔记本,一体机 > 从构成的本质来说,个人计算机和前面的分类无异 ## 计算机的体系结构 ### 冯诺依曼体系 将程序指令和数据一起存储的计算机设计概念结构 背景:早期的计算机只能用于固定用途,如果需要别的用途,就需要更改电路结构,甚至重新设计机器,于是冯诺依曼提出了一种思想,将程序存储起来,在设计底层硬件的时候不再是设计专有的电路,而是通用电路的设计,当需要运行某种程序时,先将程序翻译成电路能理解的语言,然后让通用电路去执行相关的逻辑,所以冯诺依曼体系的核心概念即存储程序指令,设计通用电路 组件: * 存储器:存储运行的程序和运行所需要的数据 * 控制器:当前执行了什么程序,接下来要执行什么程序,就是控制球要操作的事情 * 运算器:完成运算的相关操作 * 输入设备 * 输出设备 现代计算机都是冯诺依曼机 冯诺依曼机具备的功能: 1. 能够将需要的程序和数据送至计算机,通过输入设备实现 2. 能够长期的记忆程序,数据,中间结果和最终运算结果,通过存储器实现 3. 具备算数,逻辑运算和数据传输等数据加工处理的能力,通过运算器,控制器实现 4. 能够按照要求将处理结果输出给用户,通过输出设备实现  上面的图就是早期的冯诺依曼结构,这个结构是将CPU和存储器分开的,就导致了冯诺依曼瓶颈:CPU和存储器速率之间的问题无法调和,因为CPU的速度比较快,会出现CPU经常空转等待数据  ### 现在计算机的结构 为了解决冯诺依曼瓶颈,现在计算机的结构在冯诺依曼结构的基础上,进行了一定的改变,将存储器和运算器控制器合在一起共同组成CPU(这里的存储器是围绕着CPU的高速设备,即CPU的寄存器)  现在计算机的结构是以存储器为核心的 ## 计算机的层次与编程语言 ### 程序翻译和程序解释 人类语言和计算机语言是不互通的,计算机只认识01这两个数字,所以才需要通过程序翻译/解释来将人类语言转化为计算机语言,所以程序翻译/解释的原因是需要进行语言的转换 使用较为高级的语言进行开发,将这个较为高级的语言生成(计算机实际执行的)较为低级的语言的过程称之为程序翻译,生成的工具称之为编译器  使用较为高级的语言进行开发,并将这个结果作为输入传递给一个程序,将每一句都转为对应的低级语言,称之为程序解释,转换程序称之为解释器  说明: 1. 计算机执行的指令都是l0 2. 翻译过程生成新的l0程序,解释过程不生成新的l0程序 3. 解释过程由l0编写的解释器去解释l1程序 常见的语言中 C/C++,Object-C,Golang属于翻译型语言 Python,PHP,js属于解释型语言 而Java和C#严格来说属于翻译+解释型,java程序会编译成JVM字节码,JVM字节码在解释成机器码进行执行 ### 计算机的层次与编程语言  分层的目的是为了便于理解,并不是固定死的 * 硬件逻辑层:门电路,触发器等逻辑电路组成,属于电子工程领域 * 微程序机器层:编程语言是微指令集,由微指令组成的微程序直接交由硬件执行 * 传统机器层:编程语言是CPU指令集(机器指令),这个层面的编程语言与硬件直接相关,所以不同架构的CPU使用不同的CPU指令集,CPU指令集存储在CPU内部 * 操作系统层:向上为用户提供了简易的操作界面,向下对接了指令系统,管理硬件资源,所以操作系统是软件和硬件之间的适配层 * 汇编语言层:编程语言是汇编语言,汇编语言可以翻译成可直接执行的机器语言,完成翻译的过程的就是汇编器 * 高级语言层:编程语言是为广大程序员所接受的高级语言,种类非常多,有几百种 * 应用层:满足计算机针对某种用途而专门设计 > 微指令,微程序,机器指令:一条机器指令对应一个微程序,一个微程序对应一组微指令 ## 计算机的计算单位 ### 容量单位 在物理层面,使用高低电平记录信息,理论上只认识0/1两种状态,0/1称之为bit(比特位) | | Bit | Byte | KB | MB | GB | TB | PB | EB | | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ | | 名字 | 比特位 | 字节 | 千字节 | 兆字节 | 吉字节 | 太字节 | 拍字节 | 艾字节 | | 比例 | -| 8bits | 1024B | 1024KB | 1024MB | 1024GB | 1024TB | 1024PB | | 常见设备 | 门电路 | - | 寄存器 | 高速缓存 | 内存/硬盘 | 硬盘 | 云硬盘 | 数据仓库 | ### 速度单位 一、 网络速度 带宽所说的100M是100M/s,是网络速度而非容量 网络速度的单位是Mbps,这也就解释了为什么100M光纤测试峰值速度只有12M/s,100M/s=100Mbps=100Mbit/s=(100/8)MB/s=12.5MB/s 二、 CPU速度 CPU的速度一般体现为CPU的时钟频率,单位是赫兹(Hz):每秒钟的周期性变动重复次数的计量,并不是描述计算机领域的专有单位 主流CPU的时钟频率都在2GHz以上,2GHz=2*1000
3
Hz=每秒20亿次 ## 计算机的字符与编码集 ### 字符编码集的历史 一、ASCII码 使用7个bits就可以完全表示,包括95个可打印字符和33个不可打印字符(含控制字符) 可以满足计算机的使用,但是随着计算机的推广,很多应用或者国家的符号都无法表示,于是第一次对ASCII码进行扩充 二、Extended ASCII码 7bits=>8bits,由128个字符扩充为256个字符 三、字符编码集的国际化 世界上诸多国家的语言多样性,且语言体系不一样,不以有限字符组合的语言,又以中韩日的语言最为复杂 ### 中文编码集 一、 GB2312(信息交换用汉字编码字符集——基本集) 共收录了7445个字符,包括6763个汉字和682个其他符号 问题:GB2312不符合国际的标准,于是中国科学家推出了GBK 二、GBK(汉字内码扩展规范) 向下兼容GB2312,向上支持国际ISO标准 收录了21003个汉字,同时支持全部中日韩汉字 问题:只是中国本地化的编码集,无法在全球范围内使用 三、Unicode(统一码,万国码,单一码) 定义了世界通用的符号集,使用UTF-*实现了相关的编码(如UTF-8,UTF-16等)UTF-8以字节为单位对Unicode进行编码 > Unicode由于是万国码,很显然一个字节无法存储(因为一个字节的上限是256,其实就是ASCII扩展字符集),所以Unicode第一个版本是用2字节存储的(2个字节是2的16次方,共65536个)称之为UTF-16,其中0至127这128个数字表示的字符仍然跟ASCII完全一样 UTF-16是无论什么字符都使用两个字节来表示,就导致ASCII编码字符如果使用Unicode编码,所需要的存储空间会翻倍,于是就创建了UTF-8,UTF-8的第一个位(是bit)表示了这个字符需要几个字节,如果是可以用一个字节表示的,那就占用一个字节大小,否则占用两个字节大小,所以可以认为UTF-8是UTF-16的一个优化版本,优化的是占用空间的大小 但事情有一利就有一弊,UTF-8的第一位被用来表示长度了,那相比UTF-16能存储的上限就少了,所以就有了后续的Unicode版本2,用四个字节存储字符,也就出现了UTF-32,原理都差不多 # 组成篇 ## 计算机的总线 ### 概述 连接计算机不同设备的一条数据线,就是为了解决不同设备之间的通信问题 常见的总线: * USB = Universal Serial Bus = 通用串行总线 * PCI总线 * ISA总线 * Thunderbolt总线(苹果电脑) > 如果没有总线,各个设备之间相互分散连接,导致计算机内的线路非常复杂,不易扩展,而有了IO总线以后,各个设备就可以连接在总线上 ### 分类 一、片内总线 高集成度芯片内部的总线(信息传输线),用于连接芯片内各个设备,如下图所示为CPU的片内总线  二、系统总线 连接计算机外围各种设备(包括CPU,主存,硬盘,IO设备和其他组件)的一条总线 分为以下三类: * 数据总线:双向传输各个部件的数据信息,数据总线的位数是一次可以传输的数据量,是数据总线的重要参数(与CPU位数相同【32位:一次4字节,64位:一次8字节】) * 地址总线:指定源数据或目的数据在内存中的地址,地址总线的位数与存储单元有关,地址总线位数=n,寻址范围是:0-2
n
* 控制总线:用来发出各种控制信号的传输线,控制信号经由控制总线从一个组件发给另一个组件,控制组件可以监视不同组件之间的状态(就绪/未就绪) ### 仲裁 如果没有仲裁,不同设备使用总线的先后顺序就会乱套,仲裁就是为了解决不同设备使用总线的优先顺序的设备,解决了总线使用权的冲突问题 总线仲裁有以下方法 一、链式查询 仲裁控制器与设备通过仲裁控制线连接,而总线使用权的信号通过*链式*连接各个设备,如下图:  设备需要使用总线时,会通过仲裁控制线发出请求给仲裁控制器,如果总线空闲,仲裁控制器会发出允许使用的响应信号,信号先到设备1,如果设备1不需要使用,会来到设备2,以此类推 * 好处:电路复杂度低,仲裁方式简单 * 坏处:优先级低的设备难以获得总线使用权,且链式查询对电路的故障比较敏感 二、计时器定时查询 仲裁控制器对设备进行编号,接收到仲裁信号后,如果总线空闲,向所有设备发出计数值,与计数值一致的设备获得控制权,如果该设备不需要使用总线,则仲裁控制器将计数值+1继续发送给所有组件,以此类推 * 好处:不对电路故障敏感,且可以通过修改计数初始值的方式解决优先级低的问题: * 计数每次从“0”开始,设备的优先级就按顺序排列,固定不变,优先级与链式查询一样 * 计数从上一次的终点开始,此时所有设备使用总线的优先级相等 * 计数器的初值还可以由程序设置 * 坏处:增加了控制线数,控制相对比链式查询相对复杂 三、独立请求 每个设备均由独立连接仲裁器,设备可以单独向仲裁器发出请求和接收请求,当同时收到多个请求信号时,仲裁器有权按优先级分配使用权 好处:响应速度快,优先顺序可以动态改变 坏处:设备连线多,总线控制相对复杂 ## 计算机的IO设备 ### 常见的IO设备 一、输入设备 * 字符输入设备:键盘(分为薄膜键盘,机械键盘【黑轴,红轴,青轴,茶轴】,电容键盘) * 图像输入设备:鼠标,数位板,扫描仪 二、输出设备 * 图像输出设备:显示器,打印机,投影仪 ### 输入输出接口的通用设计 满足以下要求: 1. 从设备中读取数据 2. 向设备发送/写数据 3. 设备是否被占用 4. 设备是否已经连接 5. 设备是否已经启动 基于以上要求,通用的输入输出接口主要有以下部分组成: * 数据线:IO设备与主机之间进行数据交换的传送线,可以分为单向传输和双向传输两种 * 状态线:IO设备状态向主机报告的信号线,可供主机查询设备是否正常连接并就绪,也可以查询设备是否被占用 * 命令线:CPU/主机向IO设备发送命令的信号线,如读写命令,启动/停止命令 * 设备选择线:主机选择IO设备进行操作的信号线,对连接在总线上的设备进行选择 ### CPU与IO设备的通信 前提:CPU的速度与IO设备的速度是不一致的 一、程序中断 当外围IO设备准备就绪时,向CPU发出中断信号,CPU有专门的电路响应中断信号,当收到中断信号后,就会暂停当前的工作,转为处理外围IO设备的工作,等外围IO设备的事情处理完成后,CPU在重新加载并继续之前的工作 提供低速设备通知CPU的一种异步的方式 虽然程序中断可以使CPU高速运转的同时兼顾低速设备的响应,但是频繁中断CPU会降低CPU的使用效率,因此可以使用DMA通信方法 二、DMA(直接存储器访问) DMA直接连接主存和IO设备,因为DMA的存在,主存与IO设备交换信息时,不需要中断CPU,可以提高CPU的效率 在硬盘和外置显卡中都有DMA设备 ## 计算机的存储器 ### 存储器概览 一、存储器的分类 按照存储介质分类 * 半导体存储器:存储的元器件是由半导体组成的,如内存,U盘,固态硬盘 * 磁存储器:在金属或者塑料表面涂抹一层磁性磁料作为存储介质的存储器,如磁带,磁盘 按照存取方式进行分类 * 随机存储器(RAM):可读可写的存储器,任何一个单元都可以随机读取,存取的时间与位置无关 * 串行存储器:与位置有关,读取数据是按照存储的先后顺序进行查找的 * 只读存储器(ROM):只读不写,比如BIOS,手机的固件 二、存储器的层次结构 根据容量和价格可以得出存储器的位价(每比特位价格),而通过位价和读写速度可以将存储器分为以下几个层次结构: * 缓存:CPU的寄存器和高速缓存,速度快位价高 * 主存:内存 * 辅存:外部辅存设备  缓存主存层次: * 原理:局部性原理【是指CPU访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中】正是因为这样,提高了缓存的命中率,缓存主存层次才能生效并高效的运行 * 实现:在CPU与主存之间增加一层速度快(容量小)的Cache * 目的:解决主存速度不足的问题 主存辅存层次: * 原理:局部性原理 * 实现:在主存之外增加辅助存储器 * 目的:解决主存容量不足的问题 ### 主存储器与辅助存储器 问题:计算机断电时,为什么内存数据会丢失,为什么磁盘数据不会丢失 一、主存储器(主存)—— 内存  * 名词解释: * 字:存放在一个存储单元中的二进制代码组合,内存中存储单元最小的单位 * 字块:存储在连续的存储单元中,被看作是一个单元的一组字 * 字的寻址的过程:字的地址就包含两个部分,分别是所属字块的地址和字在字块中的地址,所以先根据字块的地址找到字块,在根据字块中字的地址找到对应的字 * 关于内存的一些运算 假设如下: * 一个字有32位(bits,=4Byte) * 一个字块共B个字 * 主存共M个字块 * 字的前m位指定所属字块的地址,后b位指定字在字块中的地址 结论如下: * B * M = 主存总字数 * B * M * 32 = 主存的总容量(bits) * 2
m
>= M (因为m只用来指定字块的地址的,2
m
代表最多可以存储多少个字块,所以这个值一定大于等于主存的总字数,一般是等于) * 2
b
>= B (同上) * 内存是RAM(随机存取存储器:Random Access Memory,RAM通过电容存储数据,必须隔一段时间刷新一次),如果断电,那么一段时间后,电容中的电子将会丢失,数据也就丢失了 * 下图是内存的结构及与CPU进行交互的示意图  * 主存与操作系统的位数的关系:不同位数的操作系统对内存的支持也是不一样的,32位系统最多支持2
32
=4\*2
30
=4GB的内存(装再多的内存也没用,地址总线只有32位,寻址范围最多只有4GB),64位系统最多支持2
64
=2
34
\*2
30
=2
34
GB 二、辅助存储器(辅存)—— 磁盘  * 名词解释 * 盘片:使用磁材料存储数据,表面是可磁化的硬磁特性材料 * 磁道:盘片一周的内容 * 扇区:磁道里的一部分内容 * 磁头位置:磁头当前位于哪一个磁道 * 磁头方向:磁头是往里走还是往外走 * 读取数据的方法:移动磁头径向运动读取磁道信息 * 磁盘的调度算法【通过例子说明以下四个算法:假设将最外层磁道叫磁道1,最里层磁道叫磁道5,磁头位置是磁道4,磁头方向向外,目前要读取142315磁道】 * 先来先服务算法:按照顺序访问进程的磁道读写要求,最简单粗暴的算法,读取顺序为:142315 * 最短寻道时间算法:调度顺序与磁头当前位置有关,每次读取都优先访问离磁头最近的磁道,读取顺序为:453211(当前在4,读完4可能读3或者5,每次读完都选择最近的磁道继续,那磁头方向呢???) * 扫描算法(电梯算法):每次只往一个方向移动,到达一个方向中需要服务的尽头再反方向移动,读取顺序为432115 * 循环扫描算法:扫描算法并不公平,而循环扫描算法在读取的时候只往一个方向读取,假设这个固定的方向是向内(既可以向内也可以向外,但是在每次服务过程中将不能改变),读取顺序是451123 > 扫描算法与循环扫描算法最大的区别是:扫描算法可以改变磁头方向,而循环扫描算法不会改变磁头方向 ### 高速缓存 一、高速缓存的工作原理 * 与主存类似,也有字块和字的概念【所以上面的内存的字和字块的运算也适用于高速缓存】但是主存的容量远大于高速缓存 * 缓存的数据是主存的数据的复制,里面的每份数据都来自于主存 * 工作原理 1. cpu所需要的数据在高速缓存里,直接读取高速缓存 2. cpu需要的数据不再高速缓存里,就去主存中取 * 高速缓存的性能指标 * 缓存命中率【h】=访问高速缓存的次数/(访问高速缓存的次数+访问主存的次数),是衡量缓存的重要性能指标,理论上CPU每次都从高速缓存取数据,则命中率为1,但由于高速缓存容量不及主存,所以命中率永远不可能为1 * 访问效率【e】=t
c
/t
a
* 访问主存时间:t
m
* 访问缓存时间:t
c
* 访问缓存-主存系统的平均时间:t
a
=ht
c
+(1-h)t
m
二、高速缓存的替换策略(缓存淘汰机制) * 随机算法:随机选择一组数据进行替换 * 先进先出算法(FIFO):将高速缓存看作是一个先进先出的队列,优先替换最先进入队列的字块 * 最不经常使用算法(LFU):优先淘汰最不经常使用的字块,需要额外的空间存储每个字块的使用频率 * 最近最少使用算法(LRU):优先淘汰一段时间内没有使用的字块,有多种实现方法,一般都是使用双向链表,每次访问将当前访问节点置于链表前面确定链表头部节点是最经常使用的,而链表的尾部则是要淘汰的数据 ## 计算机的CPU 计算机的CPU由高速缓存,控制器,运算器等组成 ### 计算机的指令系统 一、机器指令的形式 机器指令由两部分组成:操作码字段,地址码字段 * 操作码指明了指令要完成的操作类型,操作码的位数反应了机器的操作类型总数上限(假设操作码有8位,则最多有256种操作类型) * 地址码直接给出操作数或者操作数的地址,分为以下三种情况: * 三地址码指令:操作码(OP)|addr1|addr2|addr3 通常完成:(addr1)OP(addr2)=>(addr3) a=b+c * 二地址码指令:操作码(OP)|addr1|addr2 通常完成:(addr1)OP(addr2)=>(addr1)或(addr2) a+=b * 一地址码指令:操作码(OP) 通常完成:(addr1)OP=>(addr1)【自己和自己操作】 (addr1)OP(ACC)=>(addr1)【一个操作数做默认行为,如自增】 * 零地址指令: 在机器指令中没有地址码,空操作,停机操作,中断返回等 二、机器指令的操作类型 * 数据传输类型:包括数据读写,交换地址数据,清零置一等操作,可以发生在寄存器之间,寄存器与存储单元,存储单元间传送,ps:这个存储单元可以是任意存储媒介 * 算数逻辑操作:如操作数的加减乘除,与或非等逻辑位运算 * 移位操作:数据左移(乘2),数据右移(除以2),完成数据在算数逻辑单元的必要操作 * 控制指令:等待指令,停机指令,空操作指令等,控制指令不需要地址码,即上面的零地址指令 三、机器指令的寻址方式 指令寻址,分为顺序寻址和跳跃寻址两种,如下表格,会从101开始顺序寻址,当执行到105时,会通过跳跃寻址跳转到102继续执行 | 地址 | 指令 | | ------------ | ------------ | | 101 | MOV R0,R1 | | 102 | LAD R1,6 | | 103 | ADD R1,R2 | | 104 | ADD R1,R3 | | 105 | JUMP 102 | ------------ 数据寻址 | 寻址方式 | 说明 | 优点 | 缺点 | | ------------ | ------------ | ------------ | ------------ | | 立即寻址 | 指令可以直接获得操作数,即指令已经包含了操作数,无需访问存储器 |速度快|地址码位数**限制操作数表示范围**| | 直接寻址 | 机器指令中直接给出数据在主存的地址,寻找操作数简单,无需计算数据地址|寻找操作数简单|地址码位数**限制操作数寻址范围**| | 间接寻址 | 指令地址码给出的是操作数地址的地址,需要多次访问主存来获取操作数|操作数寻址范围大|速度较慢| ### 计算机的控制器 用于协调和控制计算机的运行的,由以下部分组成: * 程序计数器:用于存储下一条指令的地址,cpu会循环从程序计数器中拿出指令,当指令被拿出时,程序计数器就指向下一条指令 * 时序发生器:属于电气工程领域,用于发送时序脉冲,CPU会根据不同的时序脉冲有节奏的进行工作,可以理解为cpu的节拍器 * 指令译码器:控制器重要的部件之一,翻译操作码对应的操作以及控制传输地址码对应的数据 * 指令寄存器:控制器重要的部件之一,从主存或高速缓存存取计算机指令,使得CPU可以高效运转 * 主存地址寄存器:保存当前CPU正要访问的内存单元的地址,使用地址总线与主存进行通信 * 主存数据寄存器:保存当前CPU正要读写的主存数据,使用数据总线与主存进行通信 * 通用寄存器:用于暂时存放或传送数据和指令,也可以保存ALU【算数逻辑单元】的运算中间结果,容量上面的专用寄存器要大 * 总线 ### 计算机的运算器 用来进行数据运算加工的,由以下部分组成: * 数据缓冲器:分为输入缓冲和输出缓冲,输入缓冲暂时存放外设送过来的数据,输出缓冲暂时存放送往外设的数据,是ALU与外设之间的缓冲 * ALU:算数逻辑单元,是运算器的主要组成,完成常见的位运算(移位,与或非等)和算数运算(加减乘除等) * 状态字寄存器:存放运算状态(条件码,进位,溢出,结果正负等)和运算控制信息(调试跟踪标记位,允许中断位等) * 通用寄存器:与控制器的通用寄存器类似 ### 计算机指令执行的过程 一、指令执行过程 * 取出指令 * 将指令及其数据加载到cpu的高速缓存中 * 程序计数器加载当前要执行的指令的地址 * 将对应的指令的信息从高速缓存加载到指令寄存器 * 分析指令 * 指令寄存器将指令发送到指令译码器中 * 指令译码器对指令进行分析,并通过片内总线向运算器发出控制信号 * 程序计数器+1,指向下一条指令 * 执行指令 * 运算器将数据装载到寄存器 * ALU处理数据 * 记录运算状态 * 送出运算结果 二、cpu的流水线设计 取出指令和分析指令的工作是由控制器完成的,而执行指令是由运算器完成的,运算器和控制器并不能同时工作,导致cpu综合利用率不高,于是将流水线思想运用到计算机的cpu中 将上述执行操作的顺序执行改为并发执行,下表为五条指令并发执行的结果 | 指令 | 时间片 | 时间片 | 时间片 | 时间片 | 时间片 |时间片 | 时间片 | | ------------ | ------------ | ------------ | ------------ | ------------ | ------------ |------------ | ------------ | | 1 | 取指令 | 分析指令 | 执行指令 ||||| | 2 | | 取指令 | 分析指令 | 执行指令 |||| | 3 | | | 取指令 | 分析指令 | 执行指令 ||| | 4 | | || 取指令 | 分析指令 | 执行指令 || | 5 | || || 取指令 | 分析指令 | 执行指令 | 效率的提升的计算(假设取分析执行需要的时间一样,都为t) 串行执行m条指令需要的时间:T
1
=3t*m 流水线执行m条指令需要的时间:T
2
=t*(m+2) 当m趋向于无穷大时,可以看出流水线的效率是串行的三倍 # 计算篇 ## 进制运算的基础知识 ### 进制概述 进制:是一种计数方式,亦称之为进位计数法或位值计数法,是用有限种数字符号表示无限的数值的一种方法,使用的数字符号的数目称之为这种进制的基数或底数 常见的进制:十进制,八进制,十六进制,二十进制【玛雅文明的玛雅数字,因努伊特的数字】,六十进制【时间,坐标,角度等量化数据】,二进制 ### 二进制运算的基础 对于正整数N(由n个数字组成),基数为r,有以下等式(d
n-1
指的是从右向左的第n个数字) N=d
n-1
d
n-2
...d
1
d
0
=d
n-1
\*r
n-1
+d
n-2
\*r
n-2
+...+d
1
r+d
0
如1024=1\*10
3
+2\*10
1
+4 一、【整数】二进制转十进制(按权展开法) N=(01100101)=1\*2
6
+1\*2
5
+1\*2
2
+1\*2
0
=101 二、【整数】十进制转二进制(重复相除法) 用整数重复除以2,直到商为0为止,然后从下到上,将余数连起来,就是对应的二进制 | 重复除以2 | 得商 | 取余数 | | ------------ | ------------ | ------------ | | 101/2 | 50 | 1 | | 50/2 | 25 | 0 | | 25/2 | 12 | 1 | | 12/2 | 6 | 0 | | 6/2 | 3 | 0 | | 3/2 | 1 | 1 | | 1/2 | 0 | 1 | 三、【小数】二进制转为十进制(按权展开法) 小数部分的权是从-1开始的 N=(0.11001)=1\*2
-1
+1\*2
-2
+1\*2
-5
=25/32=0.78125 四、【小数】十进制转为二进制(重复相乘法) 用小数重复乘以2,直到积的为整数为止,然后从上到下,将取整部分连起来,就是对应的二进制 | 重复乘以2 | 得积 | 取整数部分 | | ------------ | ------------ | ------------ | | 25/32 * 2 | 50/32 = 1+9/16 | 1 | | 9/16 * 2 | 18/16 = 1+1/8 | 1 | | 1/8 * 2 | 2/8 = 0+1/4 | 0 | | 1/4 * 2 | 2/4 = 0+1/2 | 0 | | 1/2 * 2 | 2/2 = 1 | 1 | ## 二进制数据的表示方法 ### 二进制原码表示法 原码表示法:0表示正数,1表示负数,规定符号位位于数值的第一位(最左边) 原码表示法的问题: 1. 0有两种表示方法,00,10,会产生歧义 2. 原码进行运算非常复杂,特别是两个操作数符号不同时 ### 二进制补码表示法 定义: 1. 如果x>0,则x的补码=原码 2. 如果x<0,则x的补码=2
n+1
+x,其中n表示的是x的位数(不含符号位),结果需要将符号位带上,因为此时x是负数,符号位肯定是1 > 计算机的运算都是使用补码的 ### 二进制反码表示法 定义: 1. 如果x>0,则x的补码=原码 2. 如果x<0,则x的补码=(2
n+1
-1)+x,其中n表示的是x的位数(不含符号位) 反码=原码除符号位按位取反 补码=反码+1 ### 小数的二进制补码表示法 与整数是一致的 1. 如果x>0,则x的补码=原码 2. 如果x<0,则x的补码=2+x,其中n表示的是x的位数(不含符号位) ## 二进制数据的运算 ### 定点数与浮点数 一、定点数的表示方法 * 小数点固定在某个位置的数称之为定点数 * 纯整数小数点在数值位的最后,纯小数小数点在符号位和数值位中间 * 其他数字需要乘以比例因子,使得数值部分变成纯小数或纯整数,以满足定点数保存格式 二、浮点数的表示方法 将数值以科学计数法的方法表示和存储(区别是科学计数法尾数要求的范围是:[1,10),而浮点数的尾数必须是纯小数 ) 浮点数表示:阶码符号位 阶码数值位 尾数符号位 尾数数值位 * 单精度:4字节32位表示浮点数 * 双精度:8字节64位表示浮点数 三、定点数与浮点数的对比 * 位数相同时,浮点数的范围更大 * 尾数为规格化时,浮点数的精度更高 * 浮点数的运算包含阶码和尾数,运算更复杂 ### 定点数的加减法运算 > 数值位和符号位一同运算,并将符号位产生的进位自然丢掉 一、整数加法:A
补码
+-B
补码
= \[A+B\]
补码
(mod2
n+1
) 二、小数加法:A
补码
+-B
补码
= \[A+B\]
补码
(mod2) > 减法的运算是通过转换为加法来完成的(A
补码
-B
补码
= A
补码
+(-B)
补码
) > -B
补码
=B
补码
连同符号位按位取反,末位+1 两个负数相加的结果是整数?发生了溢出 > 判读溢出:双符号位判断法,符号位使用双位表示(00为正,11位负)双符号位产生的进位丢弃,结果的双符号位不同(10或者01)则表示溢出 ### 浮点数的加减法运算 一、对阶 目的:使得两个浮点数的阶码一致,使得尾数可以进行运算 阶码按照小阶码看齐大阶码的原则 二、尾数求和 使用补码进行运算 三、尾数规格化 如果符号位和最高位不一致,则不需要规格化,否则需要通过左移(同时阶码相应变化)以满足规格化 一般都是通过左移完成规格化,但是当双符号位不一致时(定点运算溢出的情况)需要右移,右移的话,需要进行舍入操作 四、舍入 0舍1入法(二进制的四舍五入),右移时最后一位如果是0则舍去,如果是1则进位 当右移后进位导致溢出时,需要再次进行右移舍入操作 五、溢出判断 定点运算双符号位不一致则为溢出 浮点运算尾数双符号位不一致不算溢出(因为可以通过右移解决双符号位不一致的问题),是通过阶码的双符号位判断是否溢出的,如果规格化后,阶码双符号位不一致,则认为是溢出  -separator-