计算机组成原理笔记——大一上自学
一计算机硬件
1.0初步了解
计算机硬件中通过高电平和低电平分别代表二进制中的1和0
印刷电路板背后的纹路就是传递电平的“电线”,传递1和0
CPU和内存条下的针脚,可以接受这些电平信号
计算机进行加减这类的运算,本质上是在处理电信号
1.1计算机的发展
计算机系统=硬件+软件
计算机性能的好坏取决于“软”、“硬”件功能的总和
软件又分为系统软件和应用软件,其中系统软件用来管理整个计算机系统,应用软件则是按任务需要编制成的各种程序
硬件的发展
用来处理电信号的最小的基本单元叫做逻辑元件,第一台电子数字计算机采用电子管作为逻辑元件
早期时程序员采用机器语言进行编程,在纸带机上进行编程,纸带上有孔的地方代表零,没孔的地方代表一,这里就引出了为什么采用bug来当作故障的原因,因为如果一只小虫子死在了你的纸带上,那么就会是一个黑色的小点,纸带机在读取你的纸带时,就会出现错误,于是乎就用bug来指故障
用电子管当逻辑元件的特点是体积超大、耗电量也超大
贝尔实验室出现了采用晶体管充当逻辑元件的计算机,很大程度的减少了占地面积和功耗,同时在这个时期出现了面向过程的程序设计语言FORTRAN
,同时为了让计算机有自我管理的功能,完成一系列的任务,有了操作系统的雏形。但这时的计算机需要几万到几十万个晶体管,人们手工将其焊接在电路板上,有一个焊点出错就会导致整台计算机无法运行,所以还是非常的不可靠
第三代便出现了中小规模的集成电路,集成电路将元件集成在基片上,功耗更小,大小更小,同时也更加可靠,于是乎高级语言迅速发展,并开始有了分时操作系统,但此时的计算机主要用于科学计算等专业用途
第四代便是大规模、超大规模集成电路的时代,例如苹果的A13处理器,它的制造工艺是7nm,也就是说在这块处理器中,每个逻辑元件的宽度为7nm,薄薄一块的A13中有着85亿个晶体管。这时开始出现了“微处理器”(CPU)、微型计算机,同时个人计算机萌芽,操作系统有Windows、MacOS、Linux等。
上图中的Pentium为奔腾处理器
摩尔定律:集成电路上可容纳的晶体管数目,约每隔18个月便会增加一倍,整体性能也将提升一倍
1.2计算机硬件的基本组成
ENIAC虽然在当时已经可以达到5K次/s的计算速度,但是却需要程序员通过手动接线来控制计算,也就是说,程序员手动接线的速度抵消了计算机的计算速度,于是冯诺依曼提出了“存储程序”的概念
存储程序指的是将指令以二进制代码的形式事先输入计算机的主存储器,然后按照其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束
形象生动地说就是,ENIAC需要程序员说一句,计算机做一句,而存储程序使得程序员可以一口气告诉计算机需要做什么,之后计算机去执行相应的指令
世界上第一台采用冯诺依曼结构的计算机为EDVAC
数据或是程序通过输入设备转换成机器可以识别的电平传给运算器,运算器可以把这些数据传给存储器令其进行存放,同时自身也可以进行算术运算(加减乘除)或是逻辑运算(与或非),控制器则是可以通过电信号控制其他部件的功能工作。同时也可以解析来自存储器中的程序指令,比如从存储器中读取了一条加法指令,控制器就会告诉运算器做加法的操作,之后通过输出设备转换成人们熟悉的形式
软件和硬件在逻辑上等效的原因是因为,如果我们想实现一个乘法运算,我们可以设计一种支持乘法运算的硬件电路,这样的优点是速度很快,但成本较大;或者我们也可以利用已有的可以进行加法运算的电路,在其基础上运用加法操作的软件执行多次加法操作来达到乘法的目的,这样的优点是成本较小,但时间就要更长一些
因为冯诺依曼计算机以运算器为中心,我们本来是想把数据存储到存储器中,可现在不得不经过一次运算器,所以导致运算的效率下降;同时本来计算完的数据可以直接从存储器给到输出设备,但现在也要经过一次运算器才能到输出设备,还是一样的毛病
现代计算机改进了冯诺依曼计算机的弊病,采用存储器作为计算机的中心。因为运算器和控制器是联系密切的两个部分,所以超大规模集成电路一般将这两个部分放在一个芯片上,也就是现在的CPU
计组中的主机与现实生活中的主机含义不同,计组中的主机指的是仅包含运算器与控制器(CPU)以及主存储器(内存)的硬件部分,而现实生活中的主机还会有风扇、硬盘等,其次存储器又可分为主存和辅存两种,其中主存即为内存,而辅存则是硬盘(固态、机械),而其中只有主存才属于主机的范畴,辅存则是属于I/O设备,例如手机中的APP则是存储在辅存中,只有当APP进行工作时,才会把数据或程序传到主存中。
1.3各个硬件的工作原理
关于主存储器,可以通过类似菜鸟驿站的方式来理解,CPU即是取件人,将要取走的数据所在的地址告诉给MAR,MAR再从存储体中找到相应的数据存放在MDR中,之后通过线路传给CPU,不同的是,CPU也可以写入数据到主存储器中,CPU将要写入数据到哪个地址放在MAR中,将要存储的数据放在MDR中,再通过控制总线告诉主存储器要进行的是存的操作,这三个部分一起使得主存储器写入这一条数据
存储体中又存在的一个个存储单元,每个存储单元中存放一串二进制代码,而存储单元中二进制代码的组合叫做存储字,存储字长则代表一个存储单元中能存放二进制代码的位数,而存储元则是存储二进制的电子元件(现在是现实世界中的硬件层面),由多个存储元以及一些电路就组成了存储单元,存储元利用电容的方法来存储二进制。MAR通过存放的地址来去相应的存储体中找到数据,所以MAR的位数就反映了存储单元的个数,而MDR则是将找到的数据存放在其中,于是MDR的位数就与存储字长相对应
例如:
MAR=4位->总共有24个存储单元
解释:首先要注意,地址是从0开始计数的,由于MAR为4位,也就是有4个bit,而4位二进制最大的数为1111,也就是15,所以从0000-1111一共16个数字
MDR=16位->每个存储单元可存放16bit,1个字(word)=16bit
一个字节与一个字不同,一个字节有8位;1B=1个字节=8bit,而1b=1bit
例如100Mbps的宽带,就代表ps(per second),每秒钟可以传输100M这么多bit的数据,我们购买100M的宽带,下载速度最多是10MB/s,这是因为下载器中大多数以B为单位,一般情况下两者为十分之一的关系
控制器由CU、IR、PC三部分组成,其中CU为核心部件,其内部有十分复杂的电路,如果我们要完成一条指令,也就是一条代码,我们首先要从PC中通过这条指令的地址去存储器中找到它,之后通过IR存放当前要执行的指令,CU分析这条指令,最后控制单元执行指令
1.首先从主存地址为0的位置开始,将0放在PC中
2.PC通过控制总线使得MAR中存入0,并在存储体中寻找主存地址为0的指令
3.将主存储器中的MAR中所存放的地址所对应的数据放到MDR中
4.MDR再通过线路将指令传给IR,存放当前要执行的指令,要注意的是此步操作进行结束后,程序计数器(PC)的自增功能就已经执行了,此时(PC)=1
5.IR将指令的操作码送给CU,CU通过分析操作码可以得出要执行什么类型的指令
6.CU得知此次要进行的是“取数”操作后,IR通过控制总线将地址码送到MAR,注意此时传输的地址码为二进制,要转换为十进制
7.MAR根据主存地址到存储体中找到相应的指令,将数据传给MDR
8.MDR将存放的数据通过线路传给ACC,ACC记录要进行运算的数据,此时完成了取数的操作
1.上一步操作进行完毕后,PC中存放的数字为1,于是PC通过线路将MAR中的主存地址变为1
2.根据MAR中主存地址为1,去存储体中寻找主存地址为1的指令存放到MDR中
3.MDR将存放的指令存到IR中,IR存入当前要执行的指令
4.IR将其中的指令给到CU中,CU通过分析操作码可以知道此次要进行的是乘法操作,此时PC也进行了自增一的操作
5.得知要进行的是乘法操作后,IR将指令的地址码送给MAR
6.MAR根据收到的地址码在主存储器中寻找对应的主存地址,并将对应的数据存放到MDR中
7.MDR将数据存放至MQ,此时为何将3存放至MQ中,是因为3作为乘数
8.ACC将已存储的上步中的值2存放至X中,X中存放被乘数
9.ALU联系MQ与X进行乘法运算
注意这里乘积太大,需要用MQ辅助存储,因为如果两个16位的数相乘,会得出32位的结果,一个部分可能难以存储,所以要将乘积高位和乘积地位分别存储在ACC和MQ中
1.4计算机的系统层次
我们将编译、汇编、解释程序统称为“翻译程序”
此处的透明指程序员是不知道具体的实现方法的
1.5计算机的性能指标
存储器
Eg:MAR现在有32位,而MDR有8位,则理论上最多的内存为232*8=4G
CPU
主频高的CPU不一定比主频低的CPU快,原因是二者的平均CPI大小是不确定的;当二者的CPI相同时,也不能说主频高的CPU就一定更快,因为有可能A不支持乘法指令,只能用多次加法实现乘法;而B则支持乘法指令
系统整体
二.数据的表示和运算
2.1进位计数制
位权:由位置所确定的权重,例如985.5的位权就是100,8的位权就是101
基数:每个数码位所用到的不同符号的个数,r进制的基数为r
要注意,转换为对应的进制时,要根据所算出的十进制数转换为相应的要转换为的进制数中的数字
2.2BCD码(用二进制编码的十进制)
8421码
8421码即用四位二进制来表示十进制数,抛去剩余的6位冗余。8421分别就是二进制的前四位对应的位权,所以可以与十进制中的1-9一一建立映射关系。但当两个8421码相加的结果不在映射表中时,就需要为结果的8421码加一个六对应的8421码,这时肯定可以进位,后四位正好就是对应的个位数,而最前面的数字进行补位之后正好就是对应的十位数字
2421码中有一个规定,0-4的第一位都是0,而5-9的第一位都是1,这是因为如果要表示5这个数字,可以有4+1和2+2+1这两种实现方式,也就是会有0101和1011这两种,为了防止出现歧义,故做出了这样的规定
2.3字符与字符串
ASCII码
!(https://s4.ax1x.com/2022/01/03/TbCDdH.png)
2.4奇偶校验码
当码距为1时,无检错能力;当码距为2时,有检错能力;当码距大于等于3时,若设计合理,可能具有检错、纠错的能力
采用奇校验码的方式时,需要保证整个校验码中1的个数为奇数,例如1001101,其中1有四位,我们在开头补上一位1,就有了五位1,形成了奇校验码,以此类推,偶检验码则是保证校验码中的1为偶数个即可。需要注意的是,奇偶校验码只能验证发生奇数个位错误情况,当发生偶数个位错误时,同样无法检验出来
2.5海明校验码(汉明码)
海明校验码的思想是,我们可以将信息位分组,为每组进行偶检验,这样就代表每个组都会有一个检验位,也就是说会有多个校验位,最终我们可以通过组合数学的知识来判断出错位置
首先要解决的问题就是如何将n位有效信息位分为k组,k组也将对应k个校验位。而这k个校验位最多可以表示2k种状态,海明校验码整体将有信息位和校验位一起组成,所以共有n+k位,这n+k位都会有可能出错,再加上一种正确的情况,共会有n+k+1种情况,所以校验位要包含的状态数要大于等于n+k+1才可以
假如现在的信息位是1010,也就是说n为4,求解方程组可得k至少要为3才可以,所以我们的k取3,也就是说有三位校验码,校验码只能放置在2i-1这个位置上,也就是1,2,4,8……这些位置上,所以三个校验码会被放置在1、2、4上,之后信息位按照顺序放置在剩余位置即可。
该如何为校验码和信息位分组呢?首先我们将信息位所在的位置用二进制表达出来,比如D1所处在3这个位置,那么用二进制表示就是011,以此类推将所有的信息位表示出来后,从低位向高位进行分组,选取当前位置都为1的几个信息位在一组即可,例如H3、H5、H7的最低位相同,那么这三个位置上的信息位与第一个校验位P1组成一组,而校验位的取值只需要为本组的信息位进行异或运算即可,反复进行这个操作,直到每个校验码都有对应的取值为止
纠错的操作借用偶检验的思想,我们对每组进行一次异或运算,分析出每组得到的结果是0还是1,如果出现了不是都为0的情况,那么说明肯定发生了错误,我们将得到的二进制结果转换为十进制,所对应的就是出错的位置
需要注意的是,上图中的各排序顺序都是从大到小进行排序的,如果题中给出的数据为从小到大进行排序,那么我们只需要将表格反过来即可
同样需要注意的是,海明码只有一位的纠错能力和两位的检错能力,也就是说比如S1S2S3得到的为011,有两个一代表两个位发生了错误吗,但011又可以代表是三这个位置发生了错误,我们无法判断出到底是两位发生了错误还是一位发生了错误,所以我们引进了“全校验码”这个定义,在整组数据的最前面加入一个1,当出现上述这种特殊情况时,同时全体的偶检验为0成功时,说明有两位错误,需要重新进行数据传递了。
汉明校验码(海明校验码)由汉明于1940年工作与贝尔实验室时发现问题,着手开发调试算法,终于在1950年发表汉明校验码的方法,让我们感谢这位科学家
关于汉明码的理解,可以从许多角度入手,如果组合数学的方式无法理解,我推荐从信息论的角度切入,以高屋建瓴的视角看待这个问题,或者也可以观看3b1b的视频,深入浅出,浅显易懂
2.6循环冗余校验码(CRC码)
思想:数据发送、接受双方约定一个除数,若数据出错导致余数改变,即检测到了错误
1.根据生成多项式可以确定接收方与发送方共同确定的余数,即展开为带系数的多项式,将系数提出即可
2.CRC码整体为信息位与校验位,确定校验位个数的方式为生成多项式的最高次幂为多少,校验位就会有多少位,而校验码就将校验位与信息位加起来即可
3.该如何确定校验位的数字呢?我们将信息码低位补充k个0,k为校验位的位数,之后对移位的信息码进行模2除法,计算余数
4.将信息位与得到的校验位拼在一起,得到完整的CRC码
5.发送方将CRC码发送给接收方,接收方接受CRC码后用双方约定的除数进行模2除运算,如果得到的余数为000,即代表没有出错,如果余数中出现了非零位,则代表数据传输出错,但我们不能同海明码一样,将二进制转换为十进制来判断是哪位出错,具体原因如下
首先余数肯定是3位的,也就代表最多只能表示23这么多的情况,抛去正确的000这种情况,还剩下7种错误情况可以表示,当1-7这些位置出错我们可以表示,但之后的位出错就会重复之前的情况,所以我们无法简单的利用二进制转十进制的方式来判断出错位置
注意,上述图片中从第二行开始,接受码的最后一位均应为0
当然了,我们也不能因此就说CRC码不具备纠错能力,实际上只有当信息位的位数选取合适时,才能具有纠错能力;换句话说,上述情况CRC码无法纠错的原因是因为CRC码的总位数超过了校验位的位数,如果当信息位只有4位时,我们总共有7种出错情况,正好可以达到单比特纠错的目的
何为模2除法呢?
1.我们将除数与被除数写在两侧,首先如果被除数的第一位是1,那么我们就商1,如果是0,我们就商0
2.之后我们对后三位进行异或运算,这里的后三位是指当前运算对应着的四位中的后三位
3.异或运算结束后,补一位下来重复进行上述操作即可
4.直到最后得到余数,余数即为校验位,余数一定会是除数的位数减一
那么为什么将CRC叫做循环冗余校验码呢?让我们重新审视一下这张图
如果我们将出错位为1的情况下的余数当作被除数,将其低位补一个0,变为0010,之后与约定的除数进行模2除运算,得到的余数正好为010,也就是下一个出错情况的余数,接着进行除法运算,会得到100,即为第三个出位的余数,反复进行,最终会在1-7这个出错情况内进行循环,这也就是CRC码叫做循环冗余校验码的原因了
2.7定点数的表示
定点数即为小数点位置固定的数,而与之对应的浮点数则为小数点位置不固定的数
如上图所示,我们在用原码表示定点整数时,小数点位置隐含在最后,小数点左侧位权从20开始,一直递增,右侧从2-1开始;表示定点小数时,我们将小数点位置隐含在符号位的右侧
为何机器字长为n+1
位时可以表示的原码整数为如此范围,首先n+1位的机器字长中,抛去1位作为符号位,剩余的n位作为尾数,最多表示2n这么多的数字,但是符号位的1与0会将0这个真值重复一次,+0与-0是相同的两个数字,所以我们减去重复的一个,最终得到2n-1这么多数字
在实际应用中,反码并没有什么卵用,仅仅只是求补码过程中的一个中间量
移码有何实际作用呢?当真值不断增大时,可以发现移码也不断在增大,所以计算机可以利用移码的这种独特性质很方便的比较真值的大小
2.8原码补码移码的作用
注意,此处进行的二进制运算都是模2减运算,即异或运算
2.9移位运算
2.10加减运算和溢出判断
由于想从电路方面实现减法是十分困难的,所以我们采用补码的形式来进行减法运算
一个由负数的补码快速求原码的方法是,从补码的右边开始寻找第一个出现的1,当作分界线划开左右两侧,左侧的数字全部取反,右侧数字不变即可;同样这个方式也可以求一个数的负数的补码、由原码求补码
为何将双符号位补码叫做模4补码:我们可以将双符号位数中的逗号当作分界线,左侧数值的位权以此为20、21,到了22后就不再有数字,而$$xmod4$$的意思即为将4后的二进制数字全部保留,4前的数字全部舍去,也就是说22右侧的数字全部被保留,左侧数字全部去除,所以又叫做模4补码,而单符号位补码也是一样的道理
在实际存储中,我们也不会为双符号位存储两个符号位,仅仅只是在运算时才会为其复制一个符号位
2.11定点数的原码乘法运算
2.12定点数的补码乘法运算
2.13定点数的原码除法运算
2.14定点数的补码除法运算
2.15强制类型转换
C语言中的定点整数是用“补码”存储的
2.16数据的存储和排列
2.17浮点数的表示
2.18浮点数标准 IEEE 754
2.19浮点数加减运算、强制类型转换
反码求原码:符号位不变,其他全部取反,末尾加一
2.20电路的基本原理、加法器设计
三.总线
3.1总线的基本概念
总线(Bus)是连接各个部件的信息传输线,是各个部件共享的传输介质
总线上信息的传送有两种方式,一种是串行,一种是并行
串行的好处是没有线与线之间的干扰,传输信息的可靠度高,适合长距离的信息传输
并行的缺点在于线与线之间存在干扰,长距离的信息传输可能会存在失真,所以有时候将其局限在比如说机箱内部的空间里
在高速状态下,并行口的几根数据线之间存在串扰,而并行口需要信号同时发送同时接收,任何一根数据线的延迟都会引起问题。而串行只有一根数据线,不存在信号线之间的串扰
而且串行还可以采用低压差分信号,可以大大提高它的抗干扰性,所以可以实现更高的传输速率,尽管并行可以一次传多个数据位,但是时钟远远低于串行,所以目前串行传输是高速传输的首选。
3.2总线的分类
按照总线的位置进行分类:
1.片内总线(芯片内部的总线)
2.系统总线(计算机各部件之间的信息传输)
系统总线根据总线上传输信息的不同又可以分为三类,分别是数据总线、地址总线、控制总线
数据总线是双向的,与机器字长、存储字长有关,通常情况下,数据总线的宽度是小于等于机器字长、存储字长的
地址总线是单向的,与存储地址、I/O地址有关,宽度和MAR寄存器的宽度是一样的
控制总线有出有入。存储器读、写操作,总线允许、中断确认(出) 中断请求、总线请求(外部设备信号送给CPU)
3.通信总线(计算机系统之间或计算机系统与其它系统(控制仪表、移动通信)之间的通信)
串行通信总线、并行通信总线
3.3总线特性及性能指标
总线物理实现
在微型计算机中,总线印刷在主板上,主板又称母板
总线特性
1.机械特性
尺寸、形状、管脚数及排列顺序
2.电气特性
传输方向和有效的电平范围
3.功能特性
每根传输线的功能(地址、数据、控制)
4.时间特性
信号的时序关系
总线的性能指标
1.总线宽度
数据线的根数
2.标准传输率
每秒传输的最大字节数(MBps)
3.时钟同步/异步
传输方式同步、不同步
4.总线复用
地址线与数据线复用(减少芯片的管脚数)
5.信号线数
地址线、数据线、控制线总和
6.总线控制方式
突发、自动、仲裁、逻辑、计数
7.其他指标
负载能力(总线上可以挂多少个I/O设备等)
3.4总线结构
现代计算机结构中,CPU的发展速度远快于内存的发展速度,所以在CPU和内存之间增加了一个小容量高速度的cache,对主存中的数据进行缓存,CPU运行时,主要从cache中获取
四总线和上述三总线结构的区别是,四总线结构将低速设备接在了扩展总线上,将高速设备接在了高速总线上
3.5总线仲裁
总线忙的信号不是由总线控制部件去建立,而是由获得了总线控制权的设备去建立的
3.6总线操作和定时
3.7总线标准
局部总线产生的原因是因为高速的外设与其他部分都连接在系统总线上,所以为了提升速度,特意为这些高速外设安排了一条局部总线与其他部分连接
VESA是负责传输视频的一种局部总线
RS-232C为设备总线
除上述三种视频线以外,还有适用于较高传输质量的DP线
四.存储器
4.1概述
一、存储器分类
1.按存储介质分类
半导体存储器(U盘、内存条) TTL(晶体管、功耗高速度快) MOS(晶体氧化物半导体 功耗低集成度高) 主要是MOS
磁表面存储器(磁盘)要用磁头 磁载体
磁芯存储器 硬磁材料、环状元件
光盘存储器 激光、磁光材料
2.按存取方式分类
存取时间与物理地址无关(随机访问)随机存储器(RAM)在程序执行过程中可读可写 只读存储器(ROM)在程序执行过程中只读
存取时间与物理地址有关(串行访问)顺序存取存储器——磁带 直接存取存储器——磁盘
二、存储器的层次结构
1.存储器三个主要特性的关系
2.缓存——主存层次和主存——辅存层次
4.2主存储器
存储器的分类
主存的基本组成
存取周期会略大于存取时间,原因是因为在存储器取完数据之后会刷新恢复数据,存取周期比存取时间多了一个恢复的时间
现代计算机中,MAR和MDR由于与CPU电路相近,一般将这两个寄存器做在CPU中
其中存储矩阵中每一行所能取出的二进制位数称为一个存储字,在上图中存储字为10100011,长度为8bit,一般存储字长取8的整数倍,因此有一个单位为Byte,1Byte=8bit
黑框里的东西封装起来,就成为了一个存储器芯片
按字寻址即为将一行中的三十二个存储元看为一组,总容量为1KB就代表有1024B,三十二个存储元就意味着32b,即4B,所以1024/4=256个字,即四个存储单元为一组的话,整个存储矩阵有256组,换为二进制也就是需要8位来描述组数,所以选取10位地址的前8位来描述组,后面的两位来描述每组中的四个位置,正好够用。其中地址的存放有大端形式和小端形式,大端就是以高位来作为字地址,小端就是以低位来作为字地址
半导体存储芯片的基本结构
地址线:从CPU或I/O设备的控制器指向存储器
芯片容量:如果地址线的位数为10,数据线的位数为4,那么芯片容量为210*4
如果地址线为14位,数据线为1位,就意味着存储矩阵中有14位二进制,表示214个存储单元,而每个存储单元中又只能存放一位数据,因为只有一根数据线,所以总共有16K*1位
片选线:在内存条的两侧都有许多芯片,片选线就是此次操作要选择哪个芯片的线路,片选线分为两种,,其中CS上的一横代表低电平有效,当电平符合时,代表选择这个芯片,而另一个为CE,同样也是低电平有效,不同的芯片上会选择两者中的一个
读/写控制线:可以用一根线来控制读写,也就是WE(上面有一横),这种情况下低电平代表写,高电平代表读;也可以用两根线来表示,是OE(上面有一横),这种情况下低电平表示可以允许读,第二根是WE(上面有一横),即允许写
从0-16K-1分为第一组,16K-32K-1分为第二组,第三组为32K-48K-1为,第四组为48K-64K-1.当地址为65535(64K-1)时,代表最后一组的八片的片选有效,此时其他三组的片选线是无效的,无论CS还是CE,都是高电平,只有最后一组片选线的片选信号是低电平,在八个芯片的地址的同一个位置,分别读出一位,构成一个字节,满足CPU对八位的要求,片选线可以使某一个芯片或者某些芯片同时进行工作
在进行读写操作时,八个芯片是同时进行工作的,且地址并不是芯片中,而是把CPU的地址对应分配到这些芯片
半导体存储芯片的译码驱动方式
1.线选法
地址译码器左侧有四根地址线,即24=16个存储单元,下方有八根数据线,最后为16*8的芯片容量
假设译码器左侧有两根输入线,右侧有四根输出线,假设输入0和1,那么右侧只有和1匹配的线路是有输出的,其他三根均无效,如果输入的是0和0,那么右侧只有0匹配的线路是有效的,其他三个均无效。
在读/写控制电路中,如果读选通,那么数据矩阵中的数据将会对外输出;如果是写选通,就会将数据写入到矩阵中的存储元件中
但现代计算机中不存在上述这么小的容量,假设有1M*8的存储芯片,地址线有20根,经过译码器译码后就会有2的20次方也就是1M根线,每给出一个地址,这1048576条线中只有一条有效,对于容量很大的容器来说,这么密集非常的不好
2.重合法
重合法将地址分为行地址和列地址,左侧为行地址,下方为列地址,同样译码器每次只有一根线可以有效。当行地址和列地址均输入0时,译码后的行地址和列地址均为0,最终0,0这个存储单元中的数据被读或写
如果采用重合法,有二十根地址线,那么行地址十条,列地址十条,那么移码之后,行地址有210即1024条线,列地址也有1024条,加起来只有2048条,大大小于线选法的100W条,芯片的集成度很高
随机存取存储器(RAM)
静态RAM(SRAM)
触发器为双稳态触发器,具有记忆性,有两个输出端,一个原端,一个非端,如果A'端为0,那么A端就为1。当地址选择有时,T5和T6两根管子就会通过,如果在一个芯片中,静态RAM的电路也不会如此简单,其中T1-T6负责存放1和0的部分会在一列上重复多个,列地址选择器可以选择哪一列的存储单元,而配合上行地址选择一行,x和y相配合,最终确定唯一的目标。下方的运用了一个三态门和取反来设计写入数据和写入其非的数据。
静态RAM的读操作:第一步行选电路开,之后列选电路开,读选择有效电路接通,因为之前的T6与T8线路都已通,所以触发器中存储的信息通过线路传到读放中,但同样的触发器的非端也已经接通,所以信息会顺着流到T7,但T7端的信息只能传给写放大器的非端,不能输出
静态RAM的写操作:写操作其实也是相同的,首先行选T5、T6打开,同一行的所有存储单元被选中,之后打开列选,和行选配合选中唯一的存储单元,之后从DIN写选择有效,此时左右两条线路均接通,左侧为写非,右侧为写,之后两侧数据顺着自己的线路,写入相应的存储单元中,在两端分别写入反相后的与原本的数据
静态RAM芯片举例
其中WE为低电平有效的读写控制线,而CS为低电平有效的片选线。A0-A9为地址线,十条地址线译码出1K的存储单元,I/O1-I/O4说明每个存储单元被选中,可以被写入或读出四位信号,每个存储单元有四个基本电路,所以芯片的存储容量为1KX4位,4K个基本单元电路可以布局为32*32的阵列
Intel 2114芯片将64*64的阵列分为了4组,每组有64行,16列,其中列选择信号中的0有效时,分别选中第一组中的第0列,第二组中的第0列,第三组中的第0列,第四组中的第0列,当行地址译码与列地址译码输入的均为0时,第0行的内容均被选中,而列地址译码后只选择每组中的第0行,所以一次选中了0、16、32、48这四列,实现了一次读写四个单元的效果
动态RAM(DRAM)
- 保存0和1的原理是什么?
- 保存0和1的方式在静态RAM中采用双稳态触发器,在动态RAM中采用电容,当电容中存有电荷时,为1,未存有电荷时,为0。
- DRAM需要2ms刷新一次,每次刷新以行为单位,刷新一行的存储单元
因为读出与原存信息相反,所以要在读数据线上加入一个非门
ROM(只读存储器)
ROM一直在不断朝着RAM的方向进行努力,争取实现出又可以断电保存,又能达到RAM读写速度的存储器
主存容量扩展——位扩展
因为一块存储器上只有一条数据线,CPU上有八条数据线,所以要一次性有八块存储器芯片才能给CPU提供八位数据
主存容量扩展——字扩展
不将多个存储芯片的地址线并行的原因是因为,如果当输入的数据均为1时,所有的芯片均被选中,此时数据一起传输,CPU无法分辨出不同的信息
我们可以采用译码器来改进上述方法,例如采用一根A13地址线连接两块地址芯片,当要选中第一块芯片时,A13采用高电平1,经过非门译码后,第二块芯片接收到低电平0不工作,实现了我们想要的结果,反之可以使第一块不工作,而第二块工作。由此可以得知,第一块芯片的地址应为1开头,第二块芯片的地址为0开头,全0全1为最高最低地址
这是一个3-8译码器,通过译码器我们可以实现高效的控制方式,假如我们输入的为010,那么通过真值表可知右侧应为00100000,即除了第三个存储芯片以外的所有芯片均不工作,我们可以通过这样控制八块芯片,实现八位数据
以上为3-8译码器真值表
以上为3-8译码器逻辑运算
上面是设计时采用正常的字扩展形式
上面是考试时才会遇到的非正常形式
实际情况下很多时候要采用字扩展与位扩展同时使用的情况
- 首先分配最容易的数据线,因为CPU的数据线有八根,所以设计完之后的存储器位数应扩展为八位,题目中正好给出了具有8位的RAM和ROM,而题目中不是八位的,我们需要将其扩展位8位即可
- 分析地址空间,系统程序区为6000H~67FFH,二者相减加1可得到容量大小,系统程序区为800H,即$$816²=2³28=2=2K$$,系统程序区用ROM,选择题目中2K*8位的ROM,同样的分析6800H-6BFFH,为400H,即$$4X16²=2²X2^8=1K$$,用户程序区使用RAM,及选择1KX4位的RAM,将其位扩展为八位即可
- 由第二步分析可知,ROM地址线要用11根,RAM地址线要用10根,分别将两组的16进制地址换为2进制地址其中第一行为ROM所对应的地址,需要11根线即11个二进制位,我们选择从后往前的11顺数11位作为地址线,同理从后往前选取10位作为RAM的地址线
- 选片信号的选择为3-8译码器,所以我们需要三位作为选片信号,从选取好的地址线往前再选个数,作为译码器的输入端
- 通过观察不难看出,每组的第一和第二个字母都是0和1,所以我们可以借助这一特点将其放在译码器的使能端令译码器正常工作
要注意,译码器上带小圈的连接为1的,不带圈的连接为0的
双口RAM和多模块存储器
可以类比SQL锁来理解,双端口RAM的好处是可以让两端接口都同时进行操作,提升了效率,但存在同时操作一个单元的情况,这时候就加一个置“忙”信号来解决问题
流水线概念及例题
可以并行工作就意味着,如果总线宽度为mW时,可以同时取出长度为mW的数据
高速缓冲存储器(Cache) 局部性原理性能分析
由于CPU和主存的速度相差巨大,所以人们在不断的找寻新的方法改进主存的速度,但事与愿违,经历了很多的尝试之后,还是无法达到人们所想要的程度,但后来人们发现了程序的局部性原理,并由此设计出了cache-主存结构
如果主存的读写速度为1000ns,那么要执行填充1000位等差数列的操作,需要1000ns的读和写,同时还需要CPU中5ns的计算,一位数加起来就需要2005ns的时间,一共有1000个这样的数,所以一共需要2ms
当采用cache后,我们可以一次性取一片区域内的数字,例如取a[0]-a[9]这十个数字,一般为2的多少次方,1000ns取出10个数字,之后5ns交给CPU,CPU用5ns计算,之后再用5ns给了cache,最后算出应该只需要115微秒的时间
高速缓冲存储器 地址映射方式
其中MB和B的转换过程为:MB=1024KB=1024B,即MB=10242B,而1024为$$2{10}$$,所以256MB应该为$$256*2B$$,且我们用64MB作为一个格子的大小,所以256/64=4=22,最终得出$$2^{22}$$
当将主存内的内容移至Cache中时,为了保证之后放入的数据不再放入已经放入数据的位置,我们引入一个有效位的概念,0为空,1为满,同时为了识别出放入的数据来源于主存中的哪个位置,我们将主存的前22位当作一个识别码,插入到cache的地址中,用总共24位当作cache一个字的地址
第二种方法采用直接映射法(个人感觉类似哈希),首先将主存中的位置按顺序存入cache中,因为主存的位置肯定远大于cache,所以cache的位置是不够的,主存存入下一个数据时,就采用一定的映射方法,例如当前位置的编号除以cache的总数量,得到的除数就是要存入的位置,这样就解决了位置不够的问题。同时因为我们是按顺序存入的,就不需要第一种方法中的三位地址判断是第几个内容,我们只需要存入19位判断组的地址(如上图主存中8个内容为一组),判断出是第组后,通过从上往下数第几个位置就可以判断出是这组的第几个位置了
这样相较于第一种方法的好处是我们不需要存入那么多的地址位数来判断存入的是主存的哪位,但坏处是对于空间会有很大的浪费,比如我们要取第0以及第7位的数据,根据映射方法,中间的位置都会被空着浪费
综合考虑上述两种方法,取长补短,出现了第三种方法——组相联映射。首先我们可以定义cache中的两个位置为一组,八个位置一共有四组,转换成二进制形式正好为cache中的字节地址的前两位,前两个位置均为00开头,所以可以归为十进制转换来的第0组,而后面两个位置以01开头,可以归为第一组,以此类推,正好可以用前两个位子上的数字来分组.这种分组方式将两个位置分为一组,转换为二进制最多只需要1位,所以我们再取主存地址中的一位用来判断是这组的第几个数据。
高速缓冲存储器 替换算法与策略
替换算法——Cache满了如何处理
上述两种方式是当CPU写入的数据命中时,所可以选择的方法,其中全写法会引入一小段名为写缓冲的区域,当CPU向主存中写入数据时,会将数据写入到写缓冲区域中,之后令写缓冲区域与主存进行交互,而CPU此时就得以空闲,进行其他的操作
未命中的策略中的写分配法是先将主存中的内容写入cache,这样再写就是命中了,转换为命中中的写回法
上述图片为多级Cache结构,离CPU越远的部分速度越慢,但容量越大,反之亦然,可以用Ctrl+Shift+ESC在任务管理器的性能面板中查看自己CPU的多级cache分配
Cache例题
- 根据题意画出Cache与主存的示意图,Cache有八个块,由主存空间为1KB可知,主存的地址为10位,又因为一个Cache块大小为16B,由于按字节编址,所以16个Byte扔到主存里就是0-15,所以字块内地址我们需要四位二进制来表示,剩下的六位地址就用来主存字块标记
- 在将主存中的数据向Cache中写入时,要注意Cache中是以块来存储数据的,一个块中可以存0000-1111的数据,且将主存地址前六位当作标记位存入,有效位改写为1
- 在写入Cache的过程中,按顺序从上往下写入即可,若已存在标记为相同的数据,则本次写入算作命中,由于存完数据后不存在需要数据踢出进行替换的过程,所以无论采用哪种替换算法,Cache的命中次数都是两次
- 当采用直接映射时,就无需考虑使用哪种替换算法了,效果是一样的。使用直接映射法,需要主存字块标志、Cache字块地址、字块内地址这三个部分,其中字块内地址还是4位,而Cache有八个块,可以用23来表示,所以Cache字块地址为3位,剩下的三位作为主存字块标志,CPU访问的第一个地址为0001001110,前三位作为标记,后三位作为Cache字块地址,100B转换为十进制为8,存入第4个格子中,将Cache中第四个格子的标记改为000,有效位为1,按照这种方法一直写入,直到第三个访问的地址0001001111,此地址中的数据也将存入到Cache的第四个格子中,并且标记也是000,所以为命中,以此类推,最后可知命中次数为1次
- 当采用二路组相联映射形式时,就需要区分不同的替换算法了。使用二路组相联映射形式需要主存字块地址、组地址、字块内地址;其中字块内地址还是不变的四位,组地址则采用$$8(Cache的块数)/2(一组中的块数)=4$$组的形式,二进制采用两位就可以表示4组的容量,所以组地址为2位,剩下的三位作为主存字块标记。
- 第一个地址为0001001110,其中Cache字块地址为10B,转为二进制则为2,即存入第二组中的第一位,将标记记为0001,直到第三个地址0001001111,在第零组中已经存在标记一样的数据,所以为命中,下一个地址也将存入第零组,但是该组已经满了,所以要采用替换算法进行替换,当采用FIFO算法时,我们踢出最先存入的0001标记的数据,存入当前数据,当采用LRU算法时,我们将最近使用的数据留下,替换出0001这个不是最新使用的数据,存入当前数据。对于本次的替换,结果相同,所以之后的命中次数也不会有影响。最终命中次数为2次
- 如果之后添加1011001001这个地址的数据时,就会产生差别了,如果我们采用FIFO算法,那么最先存入0组的数据为0011,将其踢出,如果采用LRU算法,那么我们保留最新使用的数据,将0101踢出;如果采用LFU算法,那么我们将使用频率最少的数据踢出,即0101,写入当前数据
- 关于Cache容量的计算,首先Cache有八个格子,并且每个格子有标记项与数据,其中数据为16B每块,八块为$$8*16B=128B=1024bit$$。之后是写回法与直写法会产生差异的部分
- 两种方法会在一致性维护位产生差异,写回法需要一位脏位进行判断,所以该方法需要一位的一致性维护位,直写法则不需要,替换算法位课程中留到操作系统部分进行讲解,此处也只能不考虑了……最终写回法中一格所需要的容量为1+4+1=6b,一共为48b,加上之前的数据位,一共1072b,直写法少了8位一致性维护位,所以是1064bit
虚拟存储器
多口RAM和多模块存储器可以提高存储器的工作速度,高速缓冲存储器是通过层次化的设计思想提高了存储系统的工作速度,而虚拟存储器是利用相同的思想提高存储系统的容量
虚拟存储器是一个逻辑概念,由硬件与软件配合实现,并不是一个实在的东西
CPU-Cache-主存 这三者所构成的层次对于操作系统来说是透明的,也就是说操作系统不知道这三者之间是如何互相工作的,只是交给他们中的某部分一个地址,接受传来的地址而已。
根据用户购买的不同的辅助存储器来说,以磁盘来举例,最小单位是扇区,通过传递扇区来传递数据,不同的辅助存储器最小单位也不同,和CPU速度差距极大,所以CPU并不管理这些事务。
- 页式虚拟存储器:虚拟空间与主存空间都被划分成同样大小的页,主存的页称为实页,虚存的页称为虚页。
- 页表、段表均存放在主存中,收到虚拟地址后要先访问主存,查询页表、段表,进行虚实地址的转换,放在主存中的页表称为慢表;为了提高变换的速度,我们可以用cache来存放常用的页表项,这些页表就称之为快表
- 首先通过逻辑地址,等待TLB与Page访问的传回,因为TLB在Cache中,所以传回的速度要快于慢表,当快表命中时,说明Cache中已存有此数据,将其与逻辑地址拼接,等待Cache是否命中,如果Cache命中,那么说明Cache中已存在该数据,在更加快速的Cache中处理数据即可,如果没有命中,那么就到主存中进行对应数据的处理即可。如果一开始TLB没有命中,但是Page命中,后续过程是相同的,无非就是速度慢一些而已,但如果TLB与Page均未命中,那么就说明这个地址还没有写入到表项中,要进行操作系统管理的页面调度操作来更新TLB和Page
- 256MB中的256是28,MB换算为220,所以加起来256MB应对应28位,同理得出虚拟地址32位,页面大小为12位,问题中给出的地址为16进制,一位对应二进制的四位。表格中的标记代表虚页号,页框号代表实页号,问题中要求进行由虚到实的转换,截取虚拟地址的前五位,在表格中的标记一栏找到对应的地址,后面的页框号就是转换后的前五位,拼接上原本后面的部分即可
五.指令系统
4.1指令格式
四地址指令的访问过程存在可优化的空间,也就是说当我们访问地址时,还需要用一个存储单元存储我们下一条要执行的指令在哪个位置,如果我们采用将数据与数据分区,地址与地址分区的策略,本条指令执行完以后,无需让CPU去寻址,而是直接自增到下一个单元,那么就可以省下一个存储单元的空间,将节省的位数留给前面的操作,使操作的范围更大(如果一个操作对应的数据地址为六位,那么他最多只能在64个不同的位置中进行寻址,局限性很大)
当采用三地址指令时,就可以将多出的六位地址平均分给前面的地址码,一个存储单元可以多获得两位,于是乎就有了八位,可以在256个不同的位置进行寻址了
在减少地址数的同时,没有改变指令的长度,这种结构叫做定长指令字结构,相反的改变指令长度的结构叫做变长指令字结构
假设操作码有四位,即可以有16条不同类型的指令,从四地址指令开始,0000-1111均可作为操作码,但此时我们为了扩展的方便,将1111不作为操作码,而是留给三地址指令中的操作码扩展,当前四位为1111时,机器可以识别出我们要进行三地址指令的操作码扩展,加上后面的四位操作码,形成操作码扩展,这四位又有16种不同的形式,但同理,我们还将11111111留下,当作二地址指令的操作码扩展……以此类推
4.2指令寻址
如果起始地址是字长(或按字节算)的整数倍时为边界对齐,反之则为边界不对齐
4.3数据寻址
偏移寻址
浮动程序为无论在主存中的哪个位置放置当前程序的进程,都可以使程序顺利运行,直接寻址的方式只能将程序放置在特定的位置,如果那个位置已经被占用,那么就无法执行,采用基址寻址后,随便挑选一个位置,让基址加上偏移量即可
变址寻址一般用来写数组的循环内操作、遍历……,通过与高级语言对应的汇编语言不难看出,变址中的变址寄存器是用户可以操作的,用户设计每次让变址寄存器X中的数据自增一,并且通过判断X中的数据是否为10(循环操作了多少次),对Z进行赋值,最后通过BNE条件跳转判断进行又一次的重复操作还是跳出循环,大大减少了代码编写量
堆栈寻址(待补)
六.中央处理器
6.1 CPU的功能和基本结构
寄存器一般分为高位和低位两个部分,例如AH代表A中的高位部分,AL代表A中的低位部分,当写作AX时,代表对其全部部分进行操作
在向ACC中循环进行数据的写入时,也可以尝试记录一些计算后的状态,例如本次操作是否导致结果溢出,是否需要进位,数字是正是负等一系列问题
移位器可以做在ALU上方的移位寄存器内
6.2指令周期的数据流
6.3 CPU内部单总线方式
如果一条指令的参数中,一个元件加了括号,就说明操作数的地址存在里面,如果为加括号,就说明操作数直接存在里面
6.4控制器(待补)
控制器是计算机系统的指挥中心,控制器的主要功能有:
- 从内存中取出一条指令,并指出下一条指令在主存中的位置
- 对指令进行译码或测试,产生相应的操作控制信号,以便启动规定的动作。
- 指挥并控制CPU、主存、输入和输出设备之间的数据流动方向
控制单元是一个时序控制单元,有规定的顺序,而逻辑控制单元是用来实现一尘不变的规定的,例如1+1=2
上图为硬布线控制器的结构
七.I/O系统
7.1基本概念
设备控制器负责将机械部分的信号转换为电信号传给I/O接口,I/O接口则负责将设备控制器传过来的电信号转换为主机能识别的电信号
程序中断方式就是CPU启动I/O,之后还照常进行自己的工作,I/O准备完成后向CPU发送一个中断请求,CPU停止自己的工作,着手控制I/O设备与主机之间的传送,结束后继续自己之前未完成的任务
DMA方式就是将程序中断方式中CPU控制I/O设备与主机的一段改为由DMA控制,此段时间内CPU是无法访存的,也就是无法与存储器进行交流,当这段时间结束后,CPU继续之前的工作
7.2输入输出
外部设备也称为外围设备,是除了主机之外的、能直接或间接与计算机交换信息的装置。