以通用串行总线USB(Universial Serial Bus)为例子来理解什么是总线,
首先它提供了对外的链接接口,不一样的设备(鼠标、键盘、U盘、移动硬盘)经过这个接口均可以进行链接,USB也成为了链接标准,促使外围设备接口的统一。除此之外还有PCI总线,Thunderbolt总线等等,总线是为了解决不一样设备之间的通信问题。html
总线分为片内总线和系统总线两类。算法
总线仲裁主要是解决了不一样组件使用总线的优先级。
经常使用的总线总裁的方法有以下三种:缓存
常见的输入设备分为字符输入设备和图像输入设备。服务器
字符输入设备
最多见的字符输入设备是键盘,键盘能够分为薄膜键盘、机械键盘按照不一样的段落感、声音、压力和键程序分为黑轴、红轴、青轴、茶轴四种和电容键盘。架构
图形输入设备
最多见的图形输入设备有鼠标、扫描仪。框架
图像输出设备
最多见的图形输出设备有液晶显示器,打印机以及投影仪。dom
输入输出接口的通用设计主要有如下几点异步
数据线:是IO设备与主机之间的信息交换传输线,按照用途不一样分为单向传输线和双向传输线。性能
状态线:IO设备状态向主机报告的信号线,主机能够经过状态线查询设备是否已经正常链接并就绪,同时还能够查询是否已经被别的设备占用。学习
命令线: CPU向设备发送命令的信号线,例如读写信号、启动、中止信号。
设备选择线:主机选择与IO设备进行操做的信号线,对链接在总线上的设备进行选择。
CPU与IO设备的通信方法主要有程序中断的方法以及DMA(直接存储器访问)两种
程序中断提供低速设备通知CPU的一种异步方式,CPU能够高速运算的同时兼顾低速设备的响应,可是CPU速度与IO设备速度不匹配,因此会下降CPU的效率。
存储器的分类按照存储介质能够分为半导体存储器和磁存储器
常见的半导体存储器有内存、固态硬盘。
常见的磁存储器有磁盘。
存储器按照存取方式分类能够分为以下三种:
随机存储器(RAM),能够随机读写,存储的时间和位置没有关系。
串行存储器,存储的时间和位置有关系,
只读存储器(ROM),只读不写,例如手机的固件,电脑的BIOS。
在选配磁盘时考虑的一般是读写速度以及磁盘的容量和价格三大因素,而存储器的层次结构能够分为缓存、主存和辅存。
缓存是CPU的寄存器和高速缓存,容量最低,速度最快,价格最高
主存就是计算机的内存,容量适中,速度适中,价格适中
辅存就是计算机的外部存储设备,例如磁盘、移动硬盘等。 容量最高,速度最慢,价格低
在计算机存储结构中,CPU能够和高速缓存、主存直接进行通信,高速缓存和主存能够直接进行通信,这种层次结构被称为缓存-主存层次,其实现方式就是在CPU和主存之间加一层速度快可是容量小的高速缓存, 用于解决CPU和主存速度不匹配的问题。
其实现原理就是局部原理:CPU访问存储器时,不管是存取指令仍是存取数据,所访问的存储单元都趋于汇集在一个较小的连续区域中,CPU将程序常常访问的内存数据加载到缓存中,而后直接访问缓存便可。
主存和辅存直接进行通信,这种层次被称为主存-辅存层次,其实现就是在主存以外增长辅助存储器,其目的是解决主存容量不足的问题。
计算机的主存储器也被称为随机存储器(Random Access Memory)即内存,RAM经过电容存储数据,必须每隔一段时间刷新一次,若是掉电,那么一段时间后将丢失全部数据。
内存由半导体存储体、驱动器、译码器、读写电路和控制电路组成。
CPU经过内部的主存数据寄存器(mdr)经过数据总线访问读写电路,同时CPU的主存地址寄存器(MAR)经过地址总线指定数据的位置,而后经过数据总线传输数据。
不一样的操做系统对内存的支持是不同的,目前最经常使用的操做系统分为32位和64位。
32位系统最大支持4GB内存。所以32位系统的地址总线只有32位数
而64位系统支持超过4GB的内存,例如笔记本的8GB-64GB,服务器一般是16GB-256GB。
目前计算机中经常使用的辅助存储器有磁盘、移动硬盘。
计算机的高速缓存位于CPU和主存之间,其出现的目的是为了解决CPU与主存速度不匹配,提升CPU效率。
为了了解高速缓存的工做原理,首先须要了解主存的相关概念:字和字块
字:存放在一个存储单元的二进制代码组合,一个字能够表示数据、指令或者字符串
字块:存储在连续的存储单元中而被看作一个单元的一组字,即字块包含了多个字。
假设一个字有32bits,一个字块共有B个字,主存共有M个字块。
那么主存总字数=BM,而主存总容量=BM*32bits
而字的地址包含两个部分,前m位表示字块在内存中的地址,后b位指定字在当前字块的地址。所以2m=M(总字块),2b=B(总字数)。
假设主存的用户空间为4G,字块大小为4M,字长位32位,则对于字地址中的块地址m和块内地址b的位数,至少应该是多少?
首先求出字块数:4G/4M=4*1024M/4=1024
字块地址m: log2(1024)=10
log2(1024)属于对数运算,其计算结果可使用Windows10自带的计算器获取,
首先切换至科学型,默认是标准型,而后分别输入102四、log、/、二、log、=便可以求出结果
块内字数:4M/32bit=1048576
块内地址:log2(1048576)=20
log2(1048576)也是属于对数运算,其计算结果可使用Windows10自带的计算器实现获取,
首先切换至科学型,默认是标准型,而后输入104857六、log、/、二、log、=便可以求出结果
根据计算结果m≥10,b≥20得知字地址的块地址至少是10位,字地址的块内地址至少是20位。
高速缓存和主存的存储逻辑结构相似,缓存相对于主存容量较小,速度更快等特色。
CPU访问高速缓存的两种状况
命中率和访问效率是衡量缓存的重要性能指标
理论上CPU每次都能从高速缓存中获取数据的时候,命中率为1,可是因为高速缓存的容量远远小于主存的容量,所以命中率不可能为1。
命中率(h)计算的公式: 访问高速缓存的次数占总次数的比例
访问主存的次数:Nm
访问Cache的次数Nc
h=Nc/(Nc+Nm)
访问效率:e
访问主存的时间:tm
访问缓存的时间为tc
访问Cahe-主存 系统平均时间:ta=h*tc+(1-h)*tm
e=tc/ta=tc/h*tc+(1-h)*tm
缓存的命中率和访问效率例子:
假设CPU在执行某段程序时,共访问了Cache命中2000次,访问主存50次,已知Cache的存取时间为50ns,主存的存取时间为200ns,求Cache-主存系统的命中率、访问效率以及平均访问时间。
命中率计算公式:
h=Nc/(Nc+Nm)
h=2000/(2000+50)≈0.97 即缓存的命中率为97%
访问效率计算公式:
e=tc/ta=tc/htc+(1-h)tm
e=tc/ta=tc/htc+(1-h)tm=50/(0.97*50+(1-0.97)200)=50/(48.5+0.03200)=50/54.5≈0.917
CPU访问存储系统的平均访问时间
ta=0.97*50+(1-0.97)200)=48.5+0.03200=54.5ns
在CPU执行程序时,为了提升执行效率,应该尽可能从高速缓存中获取数据,也就是提升缓存的命中率和访问效率,此时须要良好的替换策略,高速缓存的替换时机是CPU须要的数据不在高速缓存中,此时须要从主存中获取数据,此时按照相关的策略替换高速缓存的数据,经常使用的高速缓存替换策略有以下几种策略。
假设缓存一共能够缓存1-8一共8个字块,CPU运行程序时某次任务触发了缓存替换,须要将第9个字块存储到高速缓存中,此时根据FIFO的特性,第一个字块的数据将会从高速缓存中移除,而后将第九个字块放到高速缓存中。
最不常用法(LFU)
LFU优先淘汰掉最不常用的字块,所以须要额外的空间记录字快的使用频率,假设在某个时刻触发替换的行为,此时会将命中频率最低的字块替换掉。
最近最少使用算法(LRU)
LRU优先淘汰一段时间内没有使用的字块,有多种实现方法,一般使用双向链表实现,把当前访问的字块节点至于链表的前面,保证链表头部的字块是最近使用的,当须要淘汰的时候将链表尾部的字块淘汰掉。
机器指令由操做码和地址码两部分组成。
其中操做码指明了指令所要完成的操做,操做码的位数反映了机器的操做种类,例如操做码有8位,即有2^8=256种操做。
地址码是给出操做数或者操做数的地址,由于机器指令本质上是操做数据,CPU根据数据或者数据的地址进行相应的运算,地址码分为三地址指令、二地址指令和一地址指令。
三地址指令的机器指令包含操做码(OP),地址1(addr1),地址2(addr2),地址3(addr3),三地址指令一般会完成(addr1)OP(addr2)->(addr3),以操做码为加法为例子,将add1和add2对应的值相加,而后将相加的结果存放在addr3中。
二地址指令的机器指令包含操做码(OP),地址1(addr1)和地址2(addr2),二地址指令一般会完成(addr1)OP(addr2)-->(addr1)或者->(addr2),即将addr1和addr2按照操做码进行相关的运算后将结果存储在addr1或者addr2中,二地址指令则能够理解为相似a=a+b这样的操做。不过这个只是从较为宏观的角度去理解指令了。在计算机内部,a=a+b可能会分红多个指令去执行,好比:先将变量从内存加载到通用数据寄存器,而后从通用数据寄存器移动到ALU的缓冲寄存器,而后再作运算,而这里的数据移动也能够理解为二地址指令(源地址->目的地址)。
一地址指令的机器指令(addr1)OP->(addr1)或者(addr1)OP(ACC)->(addr1),一地址指令最经常使用的操做就是自增运算,只有一个操做数。
除了有地址指令以外还有一种零地址指令,即在机器指令中无地址码,例如空操做、停机操做和中断返回操做等等。
机器指令的操做类型主要有数据传输类型,算术逻辑操做类型,控制指令类型三种。
数据传输包含寄存器之间、寄存器与存储单元以及存储单元(高速缓存、主存、辅存)之间传输,而数据读写、交换地址数据、清零、置一等操做都是数据传输类型。
算术逻辑操做包含 操做数之间的加减乘除运算,与或非等逻辑运算以及移位运算(左移(乘以2),右移(除2)操做。
控制指令包含等待指令、停机指令、空操做指令、中断指令等等。
机器指令的寻址方式包含指令寻址和数据寻址两种方式
指令寻址包含顺序寻址和跳跃寻址
顺序寻址就是按照指令的顺序依次执行,而当遇到跳转指令时须要跳转寻址。
数据寻址主要有当即寻址、直接寻址和间接寻址三种方式。
当即寻址:指令能够直接包含操做数,即无须要访问存储器,直接从指令获取操做数 例如指令 OP addr1 6,优势是速度很是快,可是地址码位数限制操做数的表示范围。
直接寻址:机器指令直接给出操做数在主存的地址,直接寻址寻找操做数简单,无需计算数据的地址,优势是速度较快,缺点是地址码的位数限制操做数的表示范围。
间接寻址:指令地址码给出的是操做数地址的地址,例如指令 R1(OP)(add2),add2是主存操做数地址的地址,所以须要访问一次或者屡次主存来获取操做数。优势是操做数的寻址范围大,缺点是速度慢。
计算器控制器的做用是协调和控制计算机运行,计算机控制器包含以下几部分组成
程序计数器
程序计数器主要是用来存储下一条指令的地址,当程序运行时,CPU循环从程序计数器中获取指令,当指令被拿出时,程序计数器会指向下一条指令,程序计数器是提供给其余控制单元当前须要执行指令的地址。
时序发生器
时序发生器属于电器工程领域,用于发送时序脉冲,CPU依据不一样的时序脉冲有节奏的进行工做。生活中学习各类乐器根据节拍器学习,而时序发生器就是相似于乐器的节拍器。
指令译码器
计算机指令由操做码和地址码组成,指令译码器会翻译操做码对应的操做以及控制传输地址码对应的数据。
寄存器
总线
用于控制器和其余组件通信
计算机的运算器主要是用来进行数据的运算,由以下部分组成
数据缓冲器
数据缓冲器分为输入缓冲和输出缓冲,输入缓冲暂时存放外部设备输入的数据,输出缓存暂时存放送往外部设备的数据
算术逻辑单元:(ALU)
ALU能够完成算术运算、逻辑运算、位运算,至于ALU是如何运算,请听下回分解。
状态字寄存器
状态字寄存器用于存放运算的状态,例如条件码、进位、溢出、结果正负等等,同时能够存放运算的控制信息,例如调试程序时的调试跟踪标记位以及容许中断位等等。
通用寄存器
主要是用于暂时存放或传送数据或指令,同时能够保存ALU运算的中间结果,容量比通常专用寄存器大。
总线
用于运算器和其余组件通信
计算机指令执行主要包含取指令、分析指令、执行指令三个步骤,这三个步骤由高速缓存(缓存数据和指令)、运算器、控制器完成,而CPU内部的高速缓存、运算器和控制器和由片内总线链接,为了演示指令执行的过程,首先将指令执行过程当中使用的相关的设备和测试数据罗列出来。
高速缓存
数据缓存测试数据
地址 | 数据 |
---|---|
1 | 188 |
2 | 199 |
3 | 110 |
4 | 120 |
地址缓存测试数据
地址 | 操做码 | 地址码 |
---|---|---|
101 | MOV | R0,R1 |
102 | LAD | R1,6 |
103 | ADD | R1,R2 |
104 | ADD | R1,R3 |
105 | JMP | 102 |
运算器
控制器
这里以执行地址缓存测试数据为101的指令:将R0的值移动到R1中 为例,说明指令执行的过程
高速缓存缓存数据(数据、指令)->程序计数器存储指令地址->指令缓存 根据指令地址获取操做码、地址码->指令寄存器缓存操做码、地址码->指令译码器译码->程序计数器加1->运算器->寄存器->ALU->状态字寄存器->数据缓冲器。
CPU在执行程序时,首先将内存中的机器指令的数据以及指令缓存在CPU的高速缓存中,而后从高速缓存中获取指令执行。首先程序计数器将当前执行的指令地址为101缓存起来,可是程序计数器只知道指令的地址,而不知道指令具体的内容,程序计数器能够根据指令的地址经过总线访问高速缓存的指令缓存来获取指令地址为101的操做码(MOV)和地址码(RO,R1),再经过片内总线访问指令寄存器,将指令的操做码(MOV)和地址码(R0,R1)缓存起来,由于指令寄存器不知道指令的具体内容,同时还须要将指令发送到指令译码器,发送指令以后程序计数器要加1,此时程序计数器存储下一条执行的指令102,指令译码器拿到地址为101的指令负责译码(理解指令的具体内容:将R0寄存器的数据移动到R1寄存器中去)后发出控制信号,指令译码器经过片内总线进入运算器中,运算器获取控制信号后将R0加载到ALU中去进行相关的运算,再把R0的数据经过数据总线传输到数据缓冲器,数据缓冲器将R0的值覆盖到R1,此时R1的值就是100,此时高速缓存地址为101的指令完成。
取指令
CPU在执行程序时,首先将主存中的机器指令缓存在高速缓存中,而后从指令缓存中获取指令,并将指令送到指令寄存器。
分析指令
首先从指令寄存器取出指令传输到指令译码器进行译码操做,识别区分不一样的指令类别和各类操做数据的方法。而后指令译码器发出控制信号,同时程序计数器加1,指向下一条指令。
执行指令
首先装载数据到寄存器,经过ALU处理数据,若是有进位、溢出会经过状态字寄存器记录运算状态,最后将运算结果返回。
在指令的执行过程当中取指令和和分析指令是由控制器完成的,而执行指令主要是由运算器完成的,也就是运算器和控制器不能同时工做,这样会致使CPU的综合利用效率不高,所以咱们须要改进指令执行的过程来提升CPU的效率。
CPU的流水线设计相似于工厂的装配线,其特色是工厂的装配线使得多个产品能够被加工,在同一个时刻,不一样的产品位于不一样的加工阶段。
在未使用流水线设计以前,若是想要执行两条指令的流程以下
取指令->分析指令->执行指令->取指令->分析指令->执行指令 串行执行的。
在使用流水线设计以后,若是想要执行多条指令的流程以下
指令 | 时间片 | 时间片 | 时间片 | 时间片 | 时间片 | 时间片 | 时间片 | 时间片 | 时间片 |
---|---|---|---|---|---|---|---|---|---|
1 | 取指令 | 分析指令 | 执行指令 | ||||||
2 | 取指令 | 分析指令 | 执行指令 | ||||||
3 | 取指令 | 分析指令 | 执行指令 | ||||||
4 | 取指令 | 分析指令 | 执行指令 | ||||||
5 | 取指令 | 分析指令 | 执行指令 | ||||||
6 | 取指令 | 分析指令 | 执行指令 | ||||||
7 | 取指令 | 分析指令 |
因为每一个时间片都有一条或者多条指令正在执行,CPU流水线设计的执行指令效率是串行执行效率的三倍左右,公式以下所示
串行执行m条指令: T1=3t*m
流水线执行m条指令: T2=t*(M+2)
效率计算方式以下所示:
H=T2/T1=t*(m+2)/3tm=1/3+1/(3m)