计算机组成原理的部分笔记(主要来源天勤计组)
1.计算机系统概述
-
计算机的发展历程:
- 第一代计算机(电子管时代):主要特点:电子管作为开关器件,使用计算机语言,可以存储信息,输入/输出很慢
- 第二代计算机(晶体管时代):主要特点:晶体管代替电子管,采用磁心存储器,汇编语言取代机器语言
- 第三代计算机(中小规模集成电路时代):主要特点:中小规模集成电路代替晶体管,操作系统的问世。
- 第四代计算机(超大规模集成电路时代):主要特点:采用集成度很高的电路,微处理器问世。
-
第一代到第四代的计算机,计算机体系机构都是相同的,即为由控制器,存储器,运算器,输入设备和输出设备组成,成为冯诺依曼结构。
-
机器字长:值得是一次整数运算给能够处理多少二进制数据的位数
-
有关于存储器的概念解释:
存储的概念类 说明 存储元 也成为存储元件和存储基元,用来存放一位二进制信息 存储单元 由若干个存储元组成,能存放多位二进制信息 存储体 许多的存储单元构成存储体 存储字 每一个存储单元中二进制代码的组合即为存储字,可以代表数值,指令和地址等 存储字长 每一个存储单元中二进制的代码的位数是存储字长 -
运算器:运算器是对信息处理和运算的不见,主要功能是进行算术和逻辑运算,其核心是逻辑单元(ALU)。
-
控制器:控制器是整个计算机的指挥中心,它使得计算机分各个部件自动协调工作,计算机有两种信息在流动,一种是控制信息,另一种是数据信息。控制器是由程序计数器PC,指令寄存器IR,和控制单元CU组曾。PC用来存放当前的预执行指令的地址,可以自动+1形成下一条指令的地址。他与MAR之间有一条直接通路。IR用来存放当前的指令,其内容来自MDR。指令中的操作码字段OP送至CU,用以分析指令发出的各种位操作命令序列。指令中的地址码字段Ad送至MAR获取操作数。
-
计算机如何判断去除的是数据还是指令?因为数据和指令要送往不同的地方吗?
- 通常完成一条指令可以分为取址阶段和执行阶段,在取址阶段,通过访问存储器可以取出指令,在执行阶段,通过访问存储器可以取出操作数,这样,虽然指令和数据都是以二进制代码的形式放在存储器中,但是CPU可以判断在取址周期访问存储器取出的是指令,在执行阶段访问存储器取出的是数据。
-
编译程序,解释程序的区别:
- 解释程序:是高级语言翻译程序的一种,它将源语言书写的源程序作为输入,解释一句就交给计算机执行一句,并不形成目标程序。
- 编译程序:把高级语言的源程序作为输入,进行翻译转换,产生出机器的目标程序,然后在让计算机去执行这个目标程序,得到计算结果。
- 可见,编译程序于解释程序的最大区别的就是:编译程序生成目标代码,解释程序不生成。此外,编译程序产生的目标代码执行速度比解释程序的执行速度快。
-
CPU周期:又称为机器周期,在计算机中,为了方便管理,把一条指令的执行分为若干个阶段。每一个阶段完成一个基本操作,完成一个基本操作所需要的时间成为机器周期,通常一个指令周期由若干个CPU周期组成。CPU周期和CPU时钟周期不一样,后者是CPU主频的倒数。
2.数据的表示和运算
我猜这一块可能真不考,不写了
3.存储器的层次结构
-
存储器的分类:按照存取方式,可以分为随机存取存储器,只读存储器,顺序存储器和直接存储器。
- 随机存取存储器:随机存储器RAM,在随机存储器中存取信息,存取时间于和存储位置没有关系。优点是读写方便,使用灵活,缺点是断电后信息丢失。分为静态RAM(SRAM)和动态RAM(DRAM)静态RAM通常作为高速缓冲存储器,动态RAM常作为主存。
- 只读存储器:只读存储器(ROM)。顾名思义,只读存储器的内容只能随机读出但是不能写入。并且其内容断电后仍可以保留。所以把一些固定的,不变的程序放在这里,只读存储器ROM于随机存储器RAM一起构成了主存。只存储器主要包括了掩膜型只读存储器(MROM),可编程只读存储器(PROM)可擦除只读存储器(EPROM)。电可擦除只读存储器(EEPROM)和快擦除读写存储器(Flash Memory)。
- 串行访问存储器:串行访问存储器对存储单元进行读或者写操作时,需要按照物理位置的先后顺序一次访问,主要包括顺序存取存储器(磁带),和直接存取存储器(磁盘)。磁盘是属于半串行的,因为磁盘在寻找数据时,先要寻道,这个寻道是直接找磁道的,不需要按照顺序查找,所以属于随机访问。寻道之后要在磁道旋转,顺序寻找需要找的信息,因此有时串行访问。将这种前端直接访问,后端是穿行放问的存储器称为直接存取存储器。
-
ROM是采用随机存取的方式继续宁信息的访问,为什么这里将存储器分为只读存储器和随其存取存储器?随机存取是什么意思?难道ROM不是随机存取存储器吗?
- 随机存取是表示可以随时的访问存储器的任意单元地址,就好型数组可以通过下标来访问目标元素一样,而链表就需要一个一个的去找,因此数组是随机存取,而链表不是随机存取。
- ROM确实可以算是随机存储器,因为RON就是采用随机存取的方式访问信息,但是随机存储器一般定义是必须要满足可以随机进行存取,但是ROM只能进行取操作,不能进行存操作,所以一般将ROM与RAM分开
-
注意,CDROM不是随机访问存储器,CDROM属于光盘,没有随机访问的特性。
-
读周期:指的是芯片连续两次读操作的最小时间间隔,读时间表是进行一次存储器的读操作的时间。显然小于读周期。
-
写周期:指的是芯片连续两次写操作的最小时间间隔,读时间表是进行一次存储器的读操作的时间。显然小于写周期。
-
DRAM存储器的刷新:DRAM的存储原理:采用电容的方式存储,电容中充满了电荷和电容中没有电荷正好对应了1和0的两种状态,根据电路的基础知识吗,电容中的电荷不能永久保留,而是会随着时间慢慢流逝,这是时间如果考研中没有做特殊说明,一般是2ms(即为每个基本存储单元在2ms内都要刷新一次,否则会使得电荷流逝,进而导致存储信息出错。)
-
通常刷新方式有三种,集中刷新,分散刷新和异步刷新。
- 集中刷新:一般来说,电容上的电荷基本只能维持2ms,在2ms内必须要刷新一次,将2ms看成一个刷新周期,假设存储周期为0.5us,那么在一个刷新收起里有4000个存储周期,假设该矩阵有32行,则对32行集中刷新徐娅16us,在刷新期间内是不能进行读操作或者写操作的,故程刷新时间为死时间。又称为访存的死区。这个死去的占用比例为32/4000=0.8%
- 分散刷新:在分散刷新中,存储周期已经不再是传统的存储周期了,也就是说,此时存储周期不再等于读(写)周期,这里对操作的定义:存储时间=读或写周期+刷新一行的时间。此处的刷新一行的时间又可以看成等于存储周期的。分散刷新将存储器的存储周期认为的延长了,因此严重的降低了系统的速度。
- 异步刷新:异步刷新时把存储矩阵的每一行分散到2ms内刷新,但是又不是集中刷新。而是平均分配。这能保证当刷新完第一行后,再经过2ms又可以完成对下一行的刷新。异步刷新的死时间为一个读/写周期。
-
对于刷新的补充:
- 对于集中刷新:死时间很好求,就是那一段集中刷新的时间。
-
对于分散刷新,刷新占据了时间,而且刷新时间内不能进行读或写对的创造,那不就是”死时间”吗?但是为什么有些教材上说分散刷新没有死时间?
死时间是存储器为的不能进行读或者写操作的刷新时间。而且这段死时间,要连续不能累积的。因此,对于分散刷新来说,由于刷新时间被存储器包含了,它在内而不在外,所以死时间是不存在的。
- 对于异步刷新来说,由于死时间是不能累加的,因此与不刷新的死时间就是一个读或者写周期。或者是没又异变的存储周期。
- 存贮芯片是按照一行一行来刷新的,不是一个一个刷新的。
-
闪存Flash存储器:闪存虽然是内存的一种,但是又不同于内存众所周知,如果没有电流的供应,计算机内存中的内容会立刻消失,而闪存能在没有电流的条件下长久的保存数据。其存储特性相当于硬盘,这项特性是是闪存得以成为携带数字设备的存储介质的基础。一般来说,闪存是按照块来存取数据的,不是字节。
内存类型 非易失性 可写 闪存 是 是 SRAM 不是 是 DRAM 不是 是 ROM 是 不是 PROM 是 不是 EPROM 是 是 EEPROM 是 是 -
存储器的扩充:存储器的扩充,假设存储器的形式位a*b的形式,表示又a个长度位b的存储单元:
- 位扩充:增加b,指的是扩充存储字长
- 字扩充:增加a。
-
多体并行存储器:多题并行存储器的就是采用多个模块组成的存储器,每一个模块都有相同的容量和存取速度,每个模块都有独立的地址寄存器,数据寄存器,地址寄存器和读写电路。每个模块都可以看作是一个独立的存储器。
- 高位交叉编址的多体寄存器:每个模块被的地址顺序是连续的,因此被称为顺序存储。(就是低位地址是存储器内的地址,高位地址是存储体的地址)。优点:有利于存储器的扩充,只要将存储单元的编号往后加即可。缺点:每一个模块都是串行工作,因此存储器的带宽受到了很大的限制。
- 低位交叉编址的多体存储器:低位地址表示位体号,高位地址表示位块内地址,这样连续的地址就放在不同的存储体中,而每一这存储体中的地址都是不连续的。对于连续字成块的传送,低位交叉编址的多体寄存器可以实现多模块流水线式的并行存取,可以大大的提高存储器的带宽。
-
低位交叉编址存储器的分析:
- 讨论的前提是模块的字长等于数据总线的宽度。假设模块存储周期位T,总线传输周期为t,且存储器是由m个模块组成,如果T=mt,那么要低位交叉存储器的模块数目必须大于或者等于m以保证当经过mt的时间后再次启动存储体,它的上一次的存取操作已经完成。
-
高速缓存Cache:在多体并行存储器中,外部设备优先级最高,这样会导致CPU等待外部设备访存的现象,导致CPU空等一段时间,甚至是等待几个主存周期,从而降低了CPU的工作效率。为了不免CPU与IO设备争抢缓存,可以在CPU与IO之间加上一个Cache。这样,如果外部设备正在和主存交换信息,CPU就可以不同等待,直接从Cache中取得信息。
- Cache地址:Cache地址由两部分组成,高c标识Cache块号,低b位为块内地址。Cache一共由2^c块。
- 命中的概率:CPU访问信息在Cache中的比例。
- 平均访问时间:假设命中概率为h,tc为命中时访问Cac和的时间,tm为未命中时访问主存的时间,则Cache-主存系统的平均访问时间ta为:ta=h*tc+(1-h)*tm
- Cache-主存系统的效率:e=tc/ta
- CPU与Cache之间的数据攒送的基本单位时字,而主存与Cache之间的数据传送单位为块。
- CPU访问主存时,会同时的把地址给Cache和主存,Cache的逻辑依据地址判断此字是否在Cache中,若此字在Cache中,立刻传送给CPU,否则,用主存读周期把此字从主存读出并传从到CPU,与此同时,把含有这个字的一整块数据从主存读出,并传送到Cache中。
- Cache放的时主存信息的副本,所以不会增加系统的存储容量。
-
Cache与主存之间的映射关系:
- 直接映射:i=j mod C 其中,i为Cache的块号,j为主存的块号,C为Cache的块数。根据上面的公式就可以将主存中第j块的信息复制到第i个Cache块中。优点:简单,缺点:不够灵活,冲突概率高(抖动)
- 全相联映射:全相连映允许主存中的每一个块映射到Cache中的任何一个位置。优点:Cache的命中率高,减小了Cache中的冲突率,提高了Cache中的命中率。缺点:tag的位数增加,访问Cache时主存子块需要和Cache的全部标记进行比较,才才能判断所访问的内容是否在Cache中,这种比较通常采用按内容寻址的相连存储器来完成。
- 组相联映射:组相连映射时对直接映射和全相联映射的一种折中的方式,假设把Cache分成Q组,每一个组有R块,i=j mod Q其中,i为Cache中的组号,j为内存中的块号,Q为Cache中的组数。通俗的说,就是把第j块的内容复制到Cache中的第i组,至于是第i组中的那一块,就随意放即可。
-
组相联映射的补充:
- 当相连中只有一组时,此组相联映射就相当于全相连映射,当每一个组只有一块时,该组相联映射就相当于直接映射。
- 在组相连映射中,主存从高位到低位一共划分3部分,标记tag,组号和内存地址。块内地址=log2(块大小),组号=log2(Cache组数),标记tag=主存剩余的其他位。
- 假设每一组中有N块,就称为N路组相联。
-
Cache中的替换算法:只有使用全相联映射与组相联映射时才会使用到替换算法。一般常用的有先进先出算法,最近最少使用算法,随机算法。其中,随机算法随机的选出一个被替换的块,没有用到局部性原理,所以不能提高Cache的命中率。
-
Cache的写策略:由于Cache的内容是主存中的副本,所以它因该与主存保持一致,而CPU对Cache的写入改变了Cache的内容,就会导致Cache的内容与主存的内容不一致,如何让Cache与主存的内容保持一致就是写策略需要完成的事。
- 写回法:写回法要求当CPU写Cache命中时,只要修改Cache中的内容,而不是立刻的写会主存。这种方式可以减少访存次数,但是实现这种方式需要设置一个修改位,当某一行被换出时,根据此行的修改位是0还是1,来决定将该行的内容写回主存还是简单的弃去。注意,上面考虑的是Cache命中时,那没有命中的时候呢?如果CPU要对Cache中的某一位进行就该,但是此时此字恰好没有在Cache中,就需要从主存中找到包含该字的数据块,千万注意:CPU不会再主存中直接修改,而是找到之后直接复制到Cache中进行修改。等从Cache中换出此块时,再复制到主存中。(修改只发生再Cache中)
- 全写法:当写Cache命中时,Cache与主存同时修改,因而较好的保持了Cache与主存的一致性。很明显,此时的Cache不需要在每一行中都设置修改位,当写Cache未命中时,直接在主存中修改。至于在主存中修改后需不需要再复制到Cache中,这个视情况而定。可以复制也可以不复制。
- 写一次法:写命中与没有写命中时的处理办法与写回法基本相同,仅仅是第一次写命中时要同时写入主存。
-
虚拟存储器: 这个再操作系统中有比较详细的记录,和这里基本相同,这里只做一点补充:
- 虚拟存储器是一个逻辑模型,并不是一个实际的物理存储器。
- 虚拟存储器必须建立再主存-辅存的基础上,但是两者有差别,虚拟存储器允许使用比主存大得多的地址空间,虚拟存储器每一次访问时,都要进行虚实地址变换,而非虚拟存储器则不必。
- 虚拟存储器的作用是分割地址空间,解决主存容量问题以及实现程序的重定位。
- 虚拟存储器的容量由计算机地址总线的数量来决定。
-
两个转换关系(天勤计算机组成原理中的):
- 逻辑地址(虚拟地址)是由程序员给出的,经过查询快表(TLB),页表(很多书中对于这两者的先查谁还是同时查没有给出标准,编者给出的解释是,现代的电路技术已经完全可以实现同时查询,如果TLB命中,就直接输出由TLB中的页表查询所得到的物理地址,如果TLB没有命中,就根据页表输出物理地址)得到物理地址。但是现在的物理地址并不一定是最终的地址。如果Cache命中,就需要转换为Cache地址,转换后的Cache地址才是最终的物理地址。但是如果Cache没有命中,还需要经过TLB或者是页表得到的地址来直接访存。因此,再不命中的情况下,两个转换关系就变成了一个,即逻辑地址->物理地址。
-
TLB命中,页表必然命中,但是Cache的命中与TLB或是页表的命中没有必然关系。
-
CPU执行一次存储访问操作最少需要访问几次主存?
- 在具有Cache并采用动重定位的存储系统中,一次访存的大致操作如下:
- 第一步:根据虚页号查找快表,如果块表中由对应的页表项,则取出页框号形成物理地址,转到第二步,如果快表中不存在对应虚页的页表项,则发生TLB确实,转换到第三步。
- 第二步:判断物理地址中的标记是否和Cache中的标记相等且有效位是否为1,若为1,则Cache命中,从Cache中读出数据或者写数据到Cache中(全写的方式下,同时也要写主存。)若不为1,则发生Cache缺失,转到第四步。
- 第三步:当TLB缺失,根据页表基址寄存器的值和虚页号找到主存中对用的页表项,判断有效位是否为1,若是,则说明虚页存在主存中,此时把页表项转入到TLB中,并取出页框号作为物理地址,转到第二步。如果不是,说明该虚页不在主存中,即为发生了缺页异常,此时调出系统中的缺页异常处理程序,实现从磁盘中读入一个页面的功能,缺页处理后,重新执行当前的指令,这一次一定能在主存中找到。
- 第四步:Cache缺失时,CPU根据物理地址到主存读一块信息到Cache,然后读入CPU或者CPU写信息到Cache中。
- 由此可见,当CPU进行一次访存操作时,最好的情况下不需要访问主存(TLB命中,Cache命中),最坏的情况下不仅要多次访问主存,还要访问磁盘(Cache缺失,TLB缺失,缺页异常)
-
TLB,页表,Cache,主存之间的访问关系
TLB 页表 Cache 是否可能发生 命中 命中 命中 可能 命中 命中 不命中 可能 命中 不命中 命中 不可能(因为TLB是页表的子集) 命中 不命中 不命中 不可能(因为TLB是页表的子集) 不命中 命中 不命中 可能(数据在主存,不在Cache) 不命中 命中 命中 可能 不命中 不命中 命中 不可能(因为数据不在主存) 不命中 不命中 不命中 可能(因为数据不在主存)
4.指令系统
-
一条指令首先要告诉机器,用户要干什么(操作码),还有就是要直到对谁操做(地址码)。因此,一条指令由操作码和地址码组成。地址码需要做的事情:
- 需要指出操作数的地址,即为用哪里的数来操作。
- 需要指出操作后的结果存放在哪里,即为给出存放结果的地址。
- 需要给出该条指令执行结束后因该怎么办,即为给出下一条指令的地址。
-
零地址指令:零地址指令只给出操作码字段OP,没有地址码字段,主要包括两种情况:
- 不需要操作数的指令:如空操作指令,停机指令,关中断指令
- 堆栈计算机中的零地址指令:堆栈计算机中参与运算的两个操作数隐含的从栈顶和次栈顶弹出,送到计算机中进行运算,运算的结构在隐含的压入栈顶中。
-
一地址指令:一地址指令中的指令字段只有一个,主要包括两种情况:
- 只有目的操作数的单操作数指令,从A1中读取操作数,进行OP操作后,返回
A1,操作码通常为+1,-1,求反码,求补码等操作。(书上没有说访存几次,貌似是只用访存一次即可,就是取指的一次) - 隐含约定目的地址的双操作数指令,按指令地址A1可读取源操作数,指令可以隐含约定另一个操作数由累加器ACC提供,运算结果也保存在ACC中。(书上没有说要访存几次,不过貌似是两次,取指,取操作数)
- 二地址指令:OP, A1, A2,A1为源操作数的地址,A2为目的操作数的地址。常见于加减乘除运算中,运算的结果保存在A2所指定的存储单元中。(书上没有说要访存几次,不过貌似是四次,取指,去操作数*2,存放结果)
- 三地址指令:指令格式为OP,A1,A2,A3(结果)。其中A1,A2为两个源操作数地址,A3为运算结果地址。此类指令如果地址字段都是主存地址,则需要四次访存。(取指,取操作数*2,存放结果)
- 四地址指令:指令格式:OP,A1,A2,A3(结果),A4(下一指令地址)。和三地址指令一样,同样需要进行四次访存
- 只有目的操作数的单操作数指令,从A1中读取操作数,进行OP操作后,返回
-
指令寻址:找到下一条要执行指令的地址,称为指令寻址,指令寻址基本上是按执行顺序存放在主存中的,执行过程中,指令总是从内存单元被渠道指令寄存器IR中。一般来说,指令寻址只有两种方式,顺序执行时,用指令计数器(PC) +1 来获取下一条指令的地址,跳转执行时,通过转移指令的寻址方式,计算出目标地址,送入PC即可。目标转移地址的形式有三种,立即寻址,相对寻址和间接寻址。
-
数据寻址方式1-立即寻址:op # A 这个寻址方式是直接给出操作数,不需要给出地址去其他地方找操作数,其中的#为立即寻址特征,A不是操作数的地址,而是操作数本身。通常把#放在立即数前面,以标识寻址方式为立即寻址,如#20H,其他寻址方式则不用特殊符号来标识。
- 优点:只要取出指令,便可以立即获得操作数,采用立即寻址特征的指令只要在取指令时访问存储器,而在执行阶段不必访存储器。
- 缺点:因为A是立即数,所以A的位数限制了立即数的范围。例如,A占8为,则立即数表示范围为-128-127(立即数都是用补码来表示)。
- 立即数寻址的用途1:例如,需要传送一个循环次数给某一个专用寄存器,就可以用立即数寻址将循环次数作为立即数送入。
- 立即数寻址的用途2:例如,需要将某程序的首地址送入程序计数器中,而且程序的首地址可以看成是一个操作数,则可以使用通过立即寻址将该程序的首地址作为立即数送入。
- 用途总结:立即寻址方式通常用于对某一个寄存器或者内存单元赋初值。
-
数据寻址方式2-直接寻址:LAD 寻址特征码 A,其中A是操作数的有效地址,不不需要进行地址变换。有效地址EA=A
- 优点:简单,取出操作数只需要一次访存。
- 缺点:操作数的有效地址由A决定,但是A的位数一般比较小,因此寻址范围比较小。
-
数据寻址方式3-隐含寻址(了解即可,天勤上就是这么写的…)隐含寻址指指令字中不明显的给出操作数的地址,其操作数隐含在操作码或者某个寄存器中,其中最典型的例子就是一地址指令的加法指令,操作码是ADD,说明其至少要由两操作数才能做加法,而地址码只给出了一个操作数的地址,其另外一个操作数在ACC中。也就是说一地址格式的算术运算指令的另一个操作数隐含在ACC中。
-
数据寻址方式4-间接寻址:OP 寻址特征码 A,直接寻址的A比较小,所以寻址范围非常小。间接寻址给出的是操作数有效地址的地址。间接寻址又分为一次间接寻址和多次间接寻址。对于一次间接寻址来说,EA=(A)。
- 优点,便于子程序返回和查表(不需要深究,书上就是这么写的)。
- 缺点:一次间接寻址需要在执行阶段访问两次存储器,第一次是取操作数的有效地址,第二次是取操作数。而N次间接寻址需要访存N+1次。(注意,这里的访存说的是在执行阶段,如果把取指令也算上的话貌似还要再加上一次取指令时访存。)
- 用途:在寻找终端服务程序的入口就是使用间接寻址。
-
数据寻址方式5-寄存器寻址:和直接寻址相似,在直接寻址中,地址码给出的时主存地址,在寄存器寻址方式中,地址码给出寄存器的编号Ri,操作数的有效地址EA=Ri。
- 优点:由于操作数在寄存器中,因此在执行阶段不需要访存,减少了执行时间。
- 减少了指令字的长度(选择题可能会出)。
-
数据寻址方式6-寄存器间接寻址:就是寄存器中的不是操作数,而是操作数所在主存单元的地址号。有效地址EA=(Ri)。
- 优点:便于编制循环程序。
-
数据寻址方式7-基址寻址。字面意思就是操作数的有效地址需要加上某一个基础地址来形成,这个基础地址放在一个基址寄存器(BR)中,其操作数的有效地址EA=A+(BR)。
- 基址寄存器可以采用隐式和显式两种,所谓的隐式,就是指在计算机内专门设置一个基址寄存器(BR),使用时用户不必明显的指出该基址寄存器,只需要指令的寻址特征位反应出基址寻址即可。显式是值在一组通用寄存器中,用户指明哪个寄存器作为基址寄存器,存放基地址。
- 优点:扩大寻址范围。比如原来只能寻址300-304,但是在基址设置成200后,就能寻址500-504了。
- 便于解决多道程序问题。(书上说知道即可)
- 注意:基址寄存器内容由操作系统给出,在程序的执行过程中用户不能随意的改变。
- 虽然基址寄存器的内容不能由用户改变,但是采用通用寄存器组来作为基址寄存器时,用户有权知道到底使用了哪个通用寄存器来作为基址寄存器。
-
数据寻址方式8-变址寻址:和基址寻址类似,有一个变址寄存器IX,有效地址EA=A+(IX)。
- 注意,在变址寻址中,变址寄存器的内容是由用户设定的,在执行过程中其值是可以改变的,但是指令的形式地址A是不可以改变的。这一点恰好的基址寄存器相反。
- 优点:扩大寻址范围。
- 非常适合处理数组和循环的问题:由于编制寄存器的内容是可以由用户改变的,因此在处理数据问题时,只需要将指令字中的形式地址设置位数组首地址,然后用户只需要不断地改变变址寄存器IX中地内容即可。
- 基址寄存器与变址寄存器地区别:两种方式的有效地址都是寄存器内容+偏移地址,但是在基址寻址中,程序源操作的时偏移地址,基址寄存器中的内容由操作系统控制,在执行过程中动态调整(不是一直不变的,用户不能改不代表系统不能改)。而变址寻址中,程序员操作的时变址寄存器,偏移地址是固定不变的。
-
数据寻址方式9-相对寻址:相对寻址基于局部性原理,相对寻址的有效地址是将程序计数器(PC)中的内容与指令字的形式地址A相加而成的。EA=(PC)+A。
- 相对寻址的用途1:用于转移类指令,转移后的目标地址与当前指令由一段距离,称为相对位移量,此位移量由指令字的形式地址给出,故A又称为位移量。位移量可正可负,通常用补码表示。
- 相对寻址的用途2:用于编制浮动程序:即程序的正确运行不受程序所在的物理地址的限制。
- 基址寻址,变址寻址,相对寻址都可以看成是偏移寻址。
-
(可能会考到)在各种寻址方式中,指令的地址码字段可能出现的情况如下:
- 寄存器的编号(寄存器间接寻址)
- 设备的端口地址(IO指令)
- 存储器的单元地址(直接寻址,间接寻址)
- 数值(立即寻址)
-
寻址方式的总结:
寻址方式 有效地址的计算方式 用途和特点 立即寻址 用于给寄存器赋初值 直接寻址 EA=A 隐含寻址 缩短指令字长 一次间接寻址 EA=(A) 扩大寻址范围,易于完成子程序返回 寄存器寻址 EA=Ri 指令字长比较短,指令实行速度快 寄存器间接寻址 EA=(Ri) 扩大寻址范围 基址寻址 EA=A+(BR) 扩大操作数的寻址范围,适用于多道程序涉及,常用于为程序或者数据分配存储空间 变址寻址 EA=A+(IX) 主要用于处理数组问题 相对寻址 EA=A+(PC) 用于转移指令和程序浮动 先间址再变址 EA=(A)+(IX) 先变址再间址 EA=(A+(IX)) -
CISC和RISC的基本概念:CISC为复杂指令系统(complex),RISC为精减指令系统(reduce)。CISC常常于多,大,不固定等词语一起出现。但是有一个特殊的抵挡,就是RISC的寄存器多。
-
RISC的主要特点总结:
- 选取使用频率较高的一些简单指令以及一些很有用但是不复杂的指令,让复杂指令的功能能由使用频率较高的简单指令的组合来实现。
- 指令的长度固定,指令的种类少,寻址方式种类少。
- CPU中有多个通用寄存器(比CSIC的多)
- 只有取数\存数指令访问存储器,其他指令的操作都在寄存器中完成。
- 采用流水线技术(注意,RISC一定是采用流水线),大部分指令在一个始终周期内完成,采用超标量和超流水线技术,可以使得每一条指令的平均时间小于一个时钟周期。
- 控制器采用组合逻辑控制,不用微程序控制。
- 采用优化的编译程序。
-
CISC的主要特点总结:
- 指令系统负责庞大,指令的数目一般多大200-300条。
- 指令的长度不固定,指令的种类多,寻址的方式多。
- 可以访存的指令不受限制。(RISC中只有取数,存数指令访问寄存器)
- 由于80%的程序使用其20%的指令,因此CISC各种指令的使用频率差距大。
- 各种指令的执行时间相差很大,大多数指令需要多个时钟周期才能完成。
- 控制器大多数采用微程序控制。
- 难以优化编译生成高效率的目标代码程序。
(百度了一下,Intel和AMD的电脑cpu和服务器cpu貌似基本都是CISC的,手机和嵌入式用的CPU大多数是RISC的。)
-
RISC与CISC的比较:
- RISC比CISC更能提高计算机的运算速度。例如,由于RISC寄存器多,因此就可以减少访存次数,其次,由于指令数和寻址方式少,因此指令译码比较快。
- RISC比CISC更便于设计,可降低成本,提高可靠性。
- RISC能有效的支持高级语言程序。
- RISC设计者主要把经理放在那些常用的指令上,尽量是他们具有简单高效的特性。对于不常用的功能,通过组合简单的指令来完成。因此,RISC机器上实现特殊的功能时,效率可能比较低,但是可以采用流水线技术和超标量技术来弥补。而CISC的指令比较丰富。有专用的指令来完成特定的功能。因此处理特殊的任务效率高。
比较内容 CISC RISC 指令系统 复杂,庞大 精简,简单 指令数目 一般大于200 一般少于100 寻址方式 一般大于4 一般小于4 指令字长 不固定 等长 可访存指令 不限制 只有Load与Store指令 各种指令使用频率 相差很大 相差不大 各种指令的执行时间 相差很大 绝大多数在一个周期内完成 优化编译实现 很难 较容易 寄存器个数 少 多 控制器实现的方式 绝大多数为微程控制 绝大多数为硬布线控制 软件系统开发时间 较短 较长
5.中央处理器
-
CPU的功能:
- 控制器能自动的形成指令的地址,并能发出取指令的命令,将对应地址的指令取到控制器中,称为指令控制
- 取到指令之后,应产生完成每一条指令所需要的控制命令,称为操作控制。
- 控制命令产后,需要对各种控制命令加上时间上的控制,称为时间控制。
- 在执行命令的过程中,可能需要进行算术运算和逻辑运算,称为数据加工。
- 最后还要有处理中断的能力,称为中断处理。
-
CPU的基本结构:控制单元CU,数据加工ALU,中断处理系统,寄存器。
-
运算器中的寄存器:
- 暂存寄存器:暂存寄存器用于存放从主存读来的数据,这个数据不能放在通用寄存器中,否则会破坏其原有的内容。暂存寄存器对程序员是透明的
- 累加寄存器(acc):它是一个通用寄存器,其功能是为ALU提供一个工作区,累加寄存器暂时存放ALU运算结果的信息。显然,运算器中至少要有一个累加寄存器。目前,CPU中的累加寄存器一般达到了16个到32个,甚至更多。当使用多个累加器时,就变成了通用寄存器堆的结构,其中任何一个可以存放一个源操作数,也可以存放结果操作数,在这种情况下,需要在指令格式中对寄存器编号加以编制。(书上没有说是否透明,我认为时不透明的,因为可以编制,那肯定是要感知到它的存在。)
- 通用寄存器组:主要用于存放操作数(包括源操作数,目的操作数和中间结果)和各种地址信息等,常见的通用寄存器有AX,BX,CX,DX,以及堆栈指针SP等。通用寄存器对程序员不透明。
- 状态条件寄存器(PSW):保存由算术指令和逻辑指令运行或测试结果建立的各种条件码,如进位结果标志,运算溢出标志等..对程序员不透明(百度查的)。
-
控制器中寄存器
- 程序计数器PC:在程序开始执行时,必须将程序的起始地址,也就是程序第一条指令所在的地址送入程序计数器,当执行指令时,CPU将自动修改PC中的内容,以便于使其保存的总是下一条政令的地址,由于大多数指令都是顺序执行的,所以所谓的修改就是简单的将PC+1。当遇到转移指令时,后继指令的地址必须从指令的地址段获得,在这种情况下,下一条从内存中取出的指令将由转移指令来规定。因此,PC具有寄存信息与计数两种功能。PC对程序员不透明。
- 指令寄存器:用来保存当前正在执行的指令。对程序员透明。
- 存储器数据寄存器MDR:用来暂存从主存读出的一条指令或者是数据。对程序员透明。
- 存储器地址寄存器MAR:用来存储当前CPU访问的内存单元的地址。对程序员透明。
寄存器 对程序员是否透明 暂存寄存器 透明 累加寄存器 (不透明) 通用寄存器 不透明 PSW 不透明 PC 不透明 IR 透明 MDR 透明 MAR 透明 (带括号的没有找到资料,我猜测的,不要当真) -
取址周期:
(PC)->MAR // 将要执行的指令的地址放到MAR。
1->R //发出读命令,这里可以不写
M(MAR)->MDR //将要执行的指令从存储器中读出到MDR,其中(MAR)表示MAR中的内容,M(MAR)就是表示从主存中此地址的内容,即为要执行的指令本身。
(MDR)->IR //将要执行的指令放入指令寄存器
OP(IR)->CU // (IR)表示IR中的内容,就是指令的本身,OP(IR)表示指令的操作码,AD(IR)表示指令的地址码(下面会看到)
(PC)+1->PC// 形成下一条指令的地址。
- 间址周期:主要是为了取出操作数的有效地址,然后到对用的存储器中去取操作数。注意,不是所有的指令执行都对有间址周期,比如立即寻址的指令。
Ad(IR)->MAR //将指令字中的地址码送入MAR
1->R //发出读命令
M(MAR)->MDR //将有效地址从主存送入MDR
- 执行周期
- (以加法指令为例):假设一个操作数在累加器,另一个操作数在主存单元A中,并且运算结果送入累加器。
Ad(ID)->MAR // 将指令的地址码送入主存地址寄存器中
1->R //启动存储器读命令
M(MAR)->MDR //将MAR所指向的主存单元中的内容(操作数)经过数据总线读到MDR
(ACC)+(MDR)->ACC //给ALU发出加命令,将ACC中的内容和MDR中的内容相加,结果存到ACC
- 存数指令的例子:假设要将上面的ACC的结果放入主存中A地址单元
Ad(IR)->MAR // 将指令的地址码送入主存地址寄存器
1->W // 启动存储器写
(ACC)->MDR // 将累加器的内容送入MDR
(MDR)->M(MAR) //将MDR中的内容放进指定的贮存单元中
- 中断周期:执行周期结束后,CPU要查询是否有请求中断的事情发生,如果有,就进入中断周期。假设程序的断点保存至主存的0号单元,且采用硬件向量法寻找入口地址。
0->MAR // 将主存0 号单元的地址送入主存寄存器中
1->W //启动存储器写
(PC)->MDR //将PC中的内容(程序断点) 送入主存数据寄存器
(MDR)->M(MAR) //将MDR中的内容送到对指定的地址单元
向量地址->PC //将向量地址形成部件的输入送至PC
0->EINT //关中断,将允许中断触发器清零
- 如果断点存入的不是主存,而是存入堆栈,那么微程序命令0->MAR改为
(SP)-1->SP
(SP)->MAR
-
组合逻辑控制(或称为硬布线逻辑控制):由基本的门电路组合实现。这种方式实现的控制器的处理速度快,但是电路复杂,制造周期长,不灵活,可维护性差。
-
微程序控制:仿照程序设计的方法编制每个机器指令对应的微程序,每个微程序有若干个微指令构成,各微指令包含若干条微命令。所有的指令对应的程序只放在只读存储器中,当执行到某一条指令时,取出微程序中各条微指令,译码产生对应的微命令,送到机器相应的地方,控制其动作。这个只读存储器称为控制存储器,微程序控制方式下,控制单元的设计简单,指令添加容易灵活,可维护性好,但是速度较慢。
-
微程序控制的相关概念:
- 微命令与为操作:一条机器指令可以分解为一个微操作序列,这些为创造u欧式计算机中最基本的,不可再分割的操作。在微程序控制的计算机中,将控制部件向执行部件发出的各种控制命令称为微命令,它是构成控制序列的最小单位。微命令和微操作是一一对应的,微命令是微操作的控制信号,微操作是微命令的执行过程。
- 微指令与为周期:微指令是若干微命令的集合,存放微指令的控制存储器单元地址称为微地址。微指令包含两大部分的信息:操作控制字段,又称为操作码字段,用来产生某一步操作所需要的各种操作控制信号。顺序控制字段:又称为微地址字段,用来控制产生下一条要执行的微指令的的地址。
- 主存储器与控制存储器:主存储器用于存放程序和数据,在CPU外部,用RAM实现,控制存储器用于存放微程序,在CPU的内部,用ROM来实现。
- 程序与微程序:程序是指令的有序集合,用于完成某种特定的功能,微程序是微指令的有序集合,一条指令的功能是由一段微程序来实现的。
-
微指令的基本格式:微指令分为两个字段,一个是操作控制字段,该字段发出各种控制信号,另一个是顺序控制字段,该字段可指出下地址,以控制微指令序列的执行。这个是类似于PC的。
-
微指令的编码方式:微指令的编码方式又称为微指令的控制方式,他是指如何对位指令的控制字段进行编码,以形成控制信号。
- 直接编码方式:在微指令的微命令字段中每一位都代表一个微命令,设计微指令时,选用或者不选用某一个微命令,自选要将表示该微命令的对应位设置为1或者0即可。因此微命令的产生不需要译码器。直接编码的优点就是简单,直观,执行速度块,操作的并行性好,其缺点时微指令字过长,造成控制存储器的容量极大。
- 字段直接编码方式:将微指令的微命令段分成若干个小字段,把互斥性的微命令(在同一个微指令周期中不能同时出现的微命令称为互斥性微命令)组合在同一个字段中,把相容性的微命令组合在不同的字段中。每一个字段都独立编码,每一种编码代表一个微命令且字段编码的含义单独定义,与其他的字段无关。这种方式可以缩短微指令的字长,但是因为要用过译码电路后再发出微命令,所以比直接编码的方式慢。注意:一般每一个小段还要留出来一个状态,表示本段不发出任何现行指令。因此,当某段字段的长度为3位时,最多只能表示7个互斥的微命令,通常用000表示不操作。
- 字段间接编码方式:一个字段的某些微命令需要另一个字段中的某些微命令来解释,由于不是字段直接编码的方式发出微命令,故称为字段间接编码,又称为隐式编码。这种方式可以进一步缩短微指令的字长,但是削弱了微指令的并行控制能力。因此通常做为字段直接编码的一种辅助手段。
- 混合编码方式:混合编码方式由直接编码于字段编码混合使用。
-
微指令序列地址的形成:
- 第一种方式:后续的微指令的地址可以由微指令的下地址字段直接给出。这种方式称为断定方式。
- 第二种方式:后续微指令的地址还可以根据机器指令的操作码形成,微地址形成部件实际是一个编码器,其输入为指令操作码。即为将机器指令的操作码送入地址译码器进行译码,输出的结果就是对机器指令微程序的首地址。然后拿着首地址去微命令寄存器找到相应的微命令。
-
微指令的格式:
|比较项目|水平型微指令|垂直型微指令|
|--------|-----------|-----------|
|并行性|好|不好|
|执行指令需要的微指令数目|少|多|
|和机器指令的相似度|差别很大|相似|
|最后陈述|用较短的微程序结构换取较长的微指令结构|用较长的微程序结构换取较短的微指令结构| -
指令流水线会发生的三种问题:资源相关(结构相关),数据相关(数据冒险),控制相关(控制冒险).
-
资源相关:所谓的资源相关就是多条指令进入流水线以后在同一个机器时钟周期使用了同一个功能部件所发生的冲突。
-
数据相关:在一个程序中,如果必须等待前一条指令执行完毕后,才能执行后一条指令,那么这两条指令就是数据相关的。数据相关分成三类:
- 写后读(RAW):本来因该先写入再读取,但是现在没有写入就读取了(读取了旧的数据),出现了错误。
- 读后写(WAR):本来因该先读取在写入,但是现在是先写入再读取(本来因该是读取旧的数据,但是现在读取了新的数据),出现错误。
- 写后写(WAW):本来因该前面一条指令先写数据,后面一条指令再写数据,但是现在相反,导致了错误。
-
解决数据相关的技术:最简单的技术是操作延后,但是一般采用数据旁路技术来解决。数据旁路技术就是设置相关的专用通路,即不等前一条指令把计算结果写回寄存器组,而是之际把前面一条指令的计算结果作为输入交给下一条需要此结果的指令。使得本来需要暂停的操作可以继续执行。
-
控制相关:控制相关是由于转移指令引起的,当执行转移指令时,依据转移指令的产生结果,可能顺序的执行下一条指令,也可能转移到新的目标地址取指令,从而使流水线发生断流。解决方法:采用猜测法技术,机器先选定转移分支中的一个,按它取指令并且处理,条件码生成后,如果猜测正确,那么流水线继续进行下去,否则之前预先取的指令失效。
-
流水线的性能指标:
- 吞吐率:单位时间内流水线所完成的指令或者输出结果的数量。
- 加速比: 不使用流水线所用的时间 / 使用流水线所用的时间
- 流水线的效率:时空图上有任务的面积 / 时空图的总面积
-
NB的流水线技术:
- 超标量流水线:一个时钟周期能并发的执行多条指令。
- 超级流水线:将机器指令划分为更多级操作,后面的指令只要等待前面的指令完成某一小步后就可以执行,而不是像以前一样要等待一个机器周期。
- 超长指令字:发掘指令潜在的并行性。将多条并行操作的指令组成一条具有多个操作的代码字段的超长指令字。
- 动态流水线:多种运算可以同时运行,而静态流水线只是一种运算完成再进行下一种运算。
6.总线
-
总线的传输周期:指的是CPU通过总线对存储器IO端口进行一次访问所需要的时间。包括总线申请阶段,寻址阶段,传输阶段和结束阶段。
-
按照链接部件不同可以分为片内总线,系统总线,通信总线等…
- 片内总线:顾名思义指的是芯片内部的总线,如在CPU芯片内部,寄存器与寄存器之间,寄存器与算术逻辑单元之间都是片内总线链接的。
- 系统总线:链接五大部件(运算器,控制器,存储器,输入设备,输出设备)之间的信息传输线。按照系统传输信息的不同,可以分为数据总线,地址总线和控制总线。其中,数据总线是双向的,地址总线的单向的。地址总线上的代码用来指出CPU欲访问的存储单元或者IO设备的地址,由CPU给出
- 通信总线:用于计算机系统之间或者计算机系统与其他系统之间的通信。分为串行通信和并行通信。并行通信适用于近距离传输,并行通信适用于串行传输。握手(应答)信号必须在通信总线上传输。
-
总线的性能指标:
- 总线宽度:通常指的是数据总线的根数。用bit来表示
- 总线带宽:单位时间内在总线上传输的数据的位数。
- 总线服用:地址总线与数据总线共用一组。
- 信号线数:地址总线,数据总线和控制总线3种总线数的和。
-
单总线结构:单总线结构与就是将CPU,主存,IO设备都链接在一组总线上,允许IO设备之间,IO设备与CPU之间或者IO设备与主存之间直接交换信息。单总线的特点:由于IO设施与主存共用一组总线,因此主存与IO设备之间是统一编址的。CPU可以像访问内存设备一样的访问外部设备。
-
双总线结构:双总线结构就是将速度较低的IO设备从单总线中分离出来,形成主存与IO总线分开的结构。
-
三总线结构:与双总线结构相比,三总线结构增加了一条专门用于IO高速设备与主存直接交换信息的DMA总线。在三总线结构中,任意时刻只能使用一种总线,主存总线与DMA总线不能同时对主存进行存取。IO总线只有在CPU执行IO指令时才能用到。
-
集中仲裁方式:总线上所链接的各类设备,按照其对总线有无控制功能可以分为主设备和从设备。主设备对总线有控制权,从设备只能相应从主设备发出的总线命令,对总线没有控制权。总线上的信息的传送是由主设备启动的,如果某个主设备欲与另一个设备进行通信,首先由主设备发出总线请求信号,若多个主设备要同时使用总线,就由总线控制器判断。仲裁逻辑按照一定的优先顺序确定哪一个主设备能使用总线。只有获得总线使用权的主设备才能开始传送数据。总线的判优控制有三种:连视查询,计数器查询,独立请求查询。
-
链式查询:一共就3根控制线,BS总线忙,BR总线请求,BG总线同意。其中BG链式的链接所有IO接口。
- 链式查询优先级判别方式:离总线控制器越近的部件,其优先级越高,离着总线控制器越远的部件,其优先级越低。
- 链式查询的优点:只需要3根控制线就能按照一定的优先级实现总线的控制。结构简单,易于扩充。
- 链式查询的缺点:1对电路故障敏感 2高优先级的设备如果频繁使用总线,那么低优先级的设备将长期不能使用总线。
-
计数器查询方式:计数器定时查询方式采用一个计数器控制总线的使用权,相对于链式查询的方式多了一组设备地址线,少了一根总线同意线。各个设备共用一个请求线。
- 计数器查询的优先级判别方式:当总线控制器接收到总线请求信号判断总线不忙时,计数器开始计数,计数值通过一组地址线发向各个部件。当地址线上的计数值于请求使用总线设备的地址一致时,该设备获得总线控制权,同时,终止计数器及查询工作。
- 计数器有两种控制方式,每次从0开始计数与每次从上一个数字开始计数。当使用第二种方法时,所有设备使用总线的优先级相等。计数器的初值可以用程序设置,所以优先级顺序是可以改变的。
- 计数器查询方式的优点:各个设备的优先级可以改变,且对电路故障不敏感。
- 计数器查询方式的缺点:增加了控制线,多了log2N条地址线,控制器也比较复杂。
-
独立请求方式:每一个设备都有一对总线请求信号BR和总线同意信号BG。
- 独立请求优先级的判别方式:当总线上的部件都需要使用总线时,经各自的总线请求线发送总线请求的信号,在总线控制器种排队。当总线控制器按照一定的优先顺序决定批准某个部件的请求时,则给该部件发送总线响应信号。该部件接收到了此信号就获得了总线的使用权,开始传输数据。
- 独立请求方式的优点:响应速度块,对优先级控制相当灵活。
- 独立请求方式的缺点: 需要2n+1根控制线。总线控制更复杂。
-
同步定时方式:同步定时方式是指采用一个统一的时钟信号来协调发送方和接收方的传送定时关系。时钟信号通常是由CPU的总线控制器发出,然后送到总线上的所有部件。
- 同步通信方式的优点:传输速度快,具有较高的传输速率。
- 同步通信方式的缺点:同步方式必须按照最慢的模块来设计公共时钟,当总线上的模块存取速度差别很大时,便会大大的损失总线的效率,并且不知道被访问的外部设备是否真正的响应,所以可靠性较低。(以前复习貌似遗漏了这个点,我一直以为可靠性因该是最高的…)
- 同步通信的使用范围:总线长度较短,总线所链接的部件存取时间都比较接近。
-
异步通信方式:
- 不互锁方式:主模块的请求信号和从模块的回答信号之间没有制约关系。主模块发出请求信号后,不必等待从模块的应答信号。而是经过一段时间后,自动撤销。(默认从模块收到了该信号)
- 半互锁模式:主模块发出请求信号后,必须接收到从模块发出的应答信号才会撤销请求信号。
- 全互锁模式:主模块发出请求信号后,从模块收到该信号,然后一直向主模块发出应答信号,主模块收到应答信号后撤销请求信号,同时再发送一个回答信号,从模块收到该应答信号后才会撤销应答信号。
-
异步通信方式可以用于串行或者并行传输。
-
系统总线标准:
- ISA:工业标准体系结构总线,最早出现的微型计算机的系统总线标准。
- EISA:扩展的ISA总线,是配合32为CPU而设计的总线扩展标准。完全兼容ISA。
- VESA:VESA局部总线标准是一个32位标准的计算机局部总线,是针对多媒体PC要求高速传输活动图像的大量数据应运而生的。
- PCI:PCI局部总线式高性能的32位或64位总线,是为高速集成的外部部件,扩充查办和处理器/存储器系统而设计的互联机制。支持即插即用并且可以对数据和地址进行奇偶效验。
- PCI-Express:最新的总线和接口标准,这个标准将全面取代现在的PCI和AGP,最总实现总线标准的统一。
-
设备总线标准:
- IDE:集成设备电路是一种IDE接口磁盘驱动器接口类型,用于处理器和磁盘驱动器之间。
- AGP:加速图形接口是一种视频接口标准,用于链接主存和图形处理器。
- USB接口:串行接口,可以并联,热拔插,即插即用。
- SATA:一种硬盘接口规范。
7.IO
- 突然发现在操作系统最后一节的总结基本都包含这部分内容了,这里就不再重复了....
把数制也写一下吧老哥
这个太多了..而且乘除加减法之类的确实不太好描述,也没出过啥大题.....把浮点数表示方式和运算时各种寄存器的表示记一下,剩下的等考前1个月再看一下我感觉就够了
我也不太清楚为什么加了代码块以后序号就乱了,不过本地的编辑器预览效果没有乱.....