第1章 计算机系统概述
完整的计算机系统:
- 硬件系统
- 外部设备(除主机之外的硬件装置)
- 主机(运算器、控制器、主存储器)
- 软件系统
- 程序
- 数据
- 文档
数据流驱动是基于数据的处理,程序会根据输入的数据流产生输出的数据流,数据是主导因素,程序会自动响应输入数据的变化而更新输出的数据。
控制流驱动时程序控制的处理,程序根据实现定好的逻辑步骤来流程化的处理问题。
多指令多数据流(MIMD)是一种计算机体系结构,并行多条指令分别处理多条数据。
冯诺依曼机按照指令的执行序列依次读取指令,根据指令所含的控制信息,调用数据进行处理。
不同设备,汇编语言对于不同的机器语言指令集。
翻译程序,把高级编程语言程序转换成机器语言程序的软件。有以下三类:
- 汇编程序:也称汇编器,实现将汇编语言源程序翻译成机器语言目标程序。
- 解释程序:也称解释器,实现将源程序中的语句暗器执行顺序逐条翻译成机器指令并立即执行。
- 编译程序:也称编译器,实现将高级语言源程序翻译成汇编语言或机器语言目标程序。
其中需要注意的是,目标程序即目标代码文件,而解释程序无目标程序生成。
总结如下:
- 所有用户可见:PC,PSW,通用寄存器,ACC
- 对汇编程序可见(编写汇编程序需要的,用户可见的汇编程序员也可见):、
- 中断字寄存器(可以修改中断的优先级)
- 基址寄存器(基址寻址)
- 变址寄存器(变址寻址,如数组的访问需要)
- 对所有用户不可见:
- MAR
- MDR
- IR
- uIR(微指令控制器里面的应该都看不到吧)
- Cache
CPU周期也成机器周期,由多个时钟周期组成。指令周期可由若干个机器周期表示。中断周期是指令周期的最后一个周期。
CPI是一条指令所需的时钟周期数。时钟频率表示一秒钟由多少个时钟周期,此指标不能对指令的属性起什么作用。
计算机系统的性能指标主要分为以下几类:
- 机器字长
- 数据通路带宽
- 主存容量
- 运算速度
- 吞吐量和响应时间
- 主频和时钟周期
- CPI
- CPU执行时间
- MIPS
- FLOPS(单位逐步提高为MGTPEZ)
- 基准程序
CPU速度提高 50 % 50\% 50%,并不是运行时间减少一半,具体等式应该为 t c p u 1 × v 1 = t c p u 2 × 1.5 v 1 t_{cpu1} \times v_1=t_{cpu2} \times 1.5v_1 tcpu1×v1=tcpu2×1.5v1,求出 t c p u 2 t_{cpu2} tcpu2即可。
此类题目有待总结。
第2章 数据的表示和运算
137.5
,小数部分转化为二进制为.1
,八进制需要三位二进制作为一组,将其扩展为0.100
,为八进制中的.4
。
绝对值最大的负数,也即最小的负数,考虑到二进制表达为高位第一位为1
,其余位全为0
,即100...000
(1位1
,63位0
),根据对补码的看法,该数表示
−
2
63
-2^{63}
−263(位数和该位的位权的幂次相差1,1
在第64位,表示2的63次方)。
补码和移码表示的位数相同,移码在补码的基础上将符号位取反。补码从0000 0000
开始,表示最小补码1000 0000
(-128);到最大移码1111 1111
结束,表示最大补码0111 1111
(127)。对于最小移码真值-128,取负后,没有对于真值128的补码,也无移码。
移码的数值大小跟正常看上去的大小差不多,即0000 0000
最小,1111 1111
最大,只不过表示的数值不是该二进制表示的值,需要减去偏置值。
此类题目,需要注意的就是代码中各变量的类型,无符号数和有符号数。short int float double
默认都是有符号数,char
默认无符号数。同时要对特殊的数值敏感,如
2
16
=
65536
,
2
15
=
32768
2^{16}=65536,2^{15}=32768
216=65536,215=32768。
模4补码由模2补码的全部优点,且更易检查出加减运算的溢出问题。存储模4补码仅需一个符号位,只在ALU中采用双符号位。因为任何一个正确的数值,模4补码的两个符号位总是相同的。只有在把两个模4补码的数送往ALU完成加减运算时,才把每个数的符号位的值同时送到ALU的双符号位中。
原码乘法中,符号位不参与运算,单独处理,将两个操作数的符号位相异或(相同为0
,不同为1
)。
在手算过程中,确实是0100 0101
+1101 1010
进行计算,但是在电路中,加法器一端只有取反电路,并不会进行末位加1,加1操作通过输入的低位进位信息1
来加上。
由于OF标志位对有符号数有效,CF标志位对无符号数有效,则分别使用对应的计算方法,计算后看是否超过数据的最大表示范围。如,有符号数的计算,有负数也直接计算即可,10-(-20)=30
未超过32位有符号数的表示范围,无溢出。对于无符号数,遇到负数需要将加上对应的模,10-(-20+2^32)=30-2^32
小于无符号数的最小表示0,溢出。
长度相同,格式不同的浮点数,阶码越长,可表示的范围越大;尾数越长,表示的精度越高。
长度、格式相同,基数不同的浮点数,基数越大,范围越大,精度越低。因为两者可表示的数的数目一样多,那么基数大的浮点数表示的数的离散度越高,间隔越大。
浮点数的对阶,只有小阶向大阶靠拢,阶码只会增大不会减小。
浮点数的尾数位数,决定浮点数的有效位数,有效位数越多,数据表示的精度就越高。规格化就是尽可能多保留有效数字的位数。IEEE 754的隐藏位也是使得精度更高。
正数的原码、补码和反码都是一样的。
对于IEEE 754的非规格化数表示为阶码全零(该数很小),尾数不为零(但是还不是0),此时隐藏位变为0
而不是1
,同时阶码固定为-126
。同时有一些其他的非常规数,解释如下:1)阶码为零(该数很小),尾数为零(就是0),此时表示为数值0,根据符号位的不同,有+0和-0之分。2)阶码全1(该数超大),尾数为零,此时表示该数为无穷大,有正负之分。3)阶码全1,尾数不为零,该数不是数,表示为无定义数。
对于定点数,没有舍入的概念。对于浮点数,只有对阶和右规时可能会舍入。左规是尾数左移,也即小数点右移,阶码减小;右规是尾数右移,也即小数点左移,阶码增大。
注意代码的执行顺序,执行m/2
时,只是普通的整型除法,不会有小数的保留,直接截断。还需注意printf
语出的输出规格,输出格式默认保留小数点后6位。
此题中,单精度浮点数尾数不够,对阶后,有效位数全部被右移舍去了。
对机器数展开后,发现阶码全0,尾数不为0,此时表示该数很小,隐藏位为0而不是1了。
第3章 存储系统
随机存取存储器的任一单元都可随机存取。顺序存取存储器只能按某种顺序读取(磁带)。直接存取存储器是先寻找整个存储器的某个小区域,再在小区域内顺序查找(磁盘、光盘)。
集中刷新,必然存在死时间。分散刷新是将一个存储系统的工作周期分成两个部分,前半部分正常读写,后半部分用于刷新,优点是没有死区,缺点是增加了系统的存取周期。异步刷新则结合了前面两种方法,一个刷新周期内仅刷新一次,死时间更分散,但是仍然存在。
DRAM速度没有SRAM快,主存使用DRAM的原因是SRAM成本高。DRAM使用栅极电容存储信息,每个存储元制造成本更低,集成度高,功耗低。而SRAM使用双稳态触发器存储信息,每个存储元制造成本更高,集成度低,功耗大。
主存就是由ROM和RAM构成,但是统一编址。
U盘是在EEPROM上发展起来的,是ROM的一种。可以随机存取的存储器不一定是随机存取存储器,ROM是随机存取的。
EPROM可以改写,但是改写烦琐,写入时间长,改写次数有限,速度较慢,不适合作为随机存储器。
刷新读出不是读入CPU,也不是CPU向主存存入信息。刷新读出是读出信息,通过一个刷新放大器后又重新存回存储单元,刷新放大器集成在RAM上,只进行了一次访存。
我本以为至少的话,行列数不相等,最少也是两倍,但是题目似乎不是这样,行列都是两倍,直接是四倍。那这样就没有至多还是至少的区别了…
画下图更能发现问题,不要光靠脑子想。题目意思是连续6个地址单元分别是存储器123412、123412…这样会需要等待两个周期在每轮的中间。
多模块存储器分为单体多字存储器和多体并行存储器,是一种空间并行技术,利用多个结构完全相同的存储模块的并行工作来提高存储器的吞吐率,主要解决的是访存速度的问题,并不是解决主存容量大小的问题。
注意题目的问的是DARM芯片,只需要关心单个芯片的属性即可,无需考虑存储器的属性,虚晃一招罢了。
四个八位芯片刚好32位,即芯片为同时启动的工作方式,按字节编址,一次读取一行,注意不能跨行读取,根据地址分析,数据起始位置并不在一行的开始,结合类型分析,数据横跨三行,需要三次读取。
注意题目条件中所示,
A
15
A_{15}
A15是低位,低位是字选信号,高位是片选信号。
注意地址空间的计算,43FF-4000+1=400H
转为十进制则是1024
个地址单元。1024/4=256。
根据图示可以写出关于有效输出的表达式,要求 A 18 , A 17 A_{18},A_{17} A18,A17至少一个为1,其余都为1( A 14 , A 16 A_{14},A_{16} A14,A16任意)。
MAR的位数决定主存地址空间的大小,实际的主存容量不能代表地址线位数,因为后续可以扩展。
空间大小计算如下3F FFFF-00 0000+1=40 0000H
,转十进制为
2
22
2^{22}
222个存储单元,芯片数有2^22*32 / 512*2^10*8=32个芯片。
又是U盘,是基于EEPROM,ROM的一种。RAID是指将多个独立的物理磁盘组成一个独立的逻辑盘,不会影响磁记录密度,也不会提高磁盘利用率。
磁盘以成批(组)的方式进行数据读写,CPU中没有这么多的寄存器用于存放交换的数据,且磁盘与通用寄存器的速度相差过大。
平均时间分为寻道时间、旋转延迟时间、传输时间。旋转延迟即题中转速的一半。10000 r/m转换成6ms/r,一半就是3ms/r。传输时间通过传输速率与读取大小进行计算,得0.2ms。
条带化是一种将数据分片,分别存储在不同的磁盘,提高读写速度的技术。优点是读写速度快,缺点是没有冗余,一块磁盘损坏,数据会丢失。
7200 r/m转换成 (1/120)s/r。旋转延时为其一半,传输时延在其基础上除以1000。最后相加即可。
全写法和回写法都是写命中是引用。写分配法和非写分配法都是在写失效时应用。写分配法把主存调入cache中修改,非写分配法只修改主存。
当某一主存块被多次修改时,回写法的写操作少于写直达法。
多级cache,当最后一级cache也未命中时才计算缺失。
地址阵列表即是标记阵列,包括标记位,有效位共13位,64块也即64行,所有地址映射表大小为64*1bit。
未说明采用了虚拟存储器,则使用物理地址。
32K(行数) * [30(标记)+1(脏位)+1(有效位)+32(数据)]=2048k
不想鸟这个题。
需注意,执行一次循环体内语句,会有两次访问数据a,一次是取数,一次是赋值。
17(标记)+1(脏位)+1(有效位)+32*8(数据区)=257。
比较器的个数,看一组中有多少行,8路组相联,一组8行需要8个比较器。比较器比较标记位,位数为32(地址位数)-6(块内偏移)-6(行号)=20。
虚拟存储系统利用的是局部性原理。I/O操作与虚存无关。程序大小较小可以更多的并发执行。顺序指令多可以增强程序的局部性。
BCD都是局部性原理的某个方面。访问不均匀的理解是,当前使用的数据再未来较大概率会再次使用,当前访问的空间的邻近空间在未来较大概率被访问。
操作系统通过页表或其他数据结构来维护虚拟地址到物理地址的映射,并且在程序执行过程中自动处理这些映射关系。硬件(如MMU)会根据操作系统的页表进行地址转换。
缺页是CPU在执行指令的过程中进行取指令或者读写数据是发生的一种故障,属于内部异常。
快表查得快是来源于硬件本身,它采用相联存储器实现,能够根据虚拟页面号快速查找到对应的物理页面号。由于相联存储器允许并行比较所有的条目,所以查找速度非常快。慢表则是存储在主存中的完整页表,当快表中没有找到相应的项时,才会访问慢表。慢表的查找通常较慢,因为它需要顺序地访问主存中的页表项,慢表更需要采用优化的搜索算法。
4K字数据,一块4个字,总共1k个块,字内偏移有 2 4 2^4 24个地址。32位地址,10位行号,4位内偏移,剩余18位标记位。位数为(18+1+1+4*32)*1K=148k。
第4章 指令系统
ISA规定的内容主要包括:
1)指令格式,指令寻址方式,操作类型,以及每种操作对应的操作数的相应规定。
2)操作数的类型,操作数寻址方式,以及是按大端方式还是按小端方式存放。
3)程序可访问的寄存器编号、个数和位数,存储空间的大小和编址方式。
4)指令执行过程的控制方式等,包括程序计数器、条件码定义等。
ISA确实定义了指令集,包括指令的操作码、操作数格式等,但它并没有直接规定执行每条指令时的控制信号。控制信号是由处理器的设计者确定的,属于微架构的一部分,而不是ISA本身的一部分。
先从地址最多的指令分析,29条三地址指令,最少需要5位二进制位表示,剩余3条指令。二地址指令有3*2^6条指令大于107,满足条件。初步判断至少有5+3*6=23位。由于计算机按字节编址,那么指令字长一般置为字节的整数倍,24位。
隐含寻址不明显给出操作数的地址,可以起到简化地址结构的作用。
变址寻址是将形式地址与变址寄存器的值相加得到有效地址,变址间址寻址是在变址基础上再间接寻址。
转移指令地址为4000H
,取指后PC自动加“1“,字长16位,按字编址,转移指令两个字节即一个字,PC值为4001H
,再加上相对偏移量。
97种操作,需要7位二进制表示,六种寻址方式需要3位二进制表示,存储字长16位,剩余6位作为偏移量,补码表示,可表示范围为(-32,31)。
转移指令、子程序调用与返回指令用于解决程序变动中指令执行次序的要求。数据调用次序的问题主要由加载(Load)和存储(Store)指令来解决(来自GPT的解释)。
8位操作码,4位寄存器,32定长指令剩余16位偏移量,注意16位补码,可表示范围为 − 2 15 ∼ 2 15 − 1 -2^{15} \sim 2^{15}-1 −215∼215−1。
注意PC值自动加”1“,最后转移目标地址为804846cH+2+0dH=804847bH
(题目是做题本的题,选项录错了)。
第5章 中央处理器
控制器中有MAR、MDR、时序电路、微程序发生器、PC、IR。程序状态字寄存器PSW是位于运算器中的。
执行转移指令时,如果目标转移条件不满足则不会发生转移,那么PC的值不会修改。
机器指令中不能显式的使用PC。PC一般都是隐式使用的,由PC自增修改或者转移指令进行设置。指令顺序执行时,通常说的PC自动加1都是广义的1,表示一条指令的长度,而不是真的数字1。
标志寄存器是专用寄存器,不需要编号,也不能在指令中编号访问。C项缺失主语用户,用户不能直接修改标志寄存器的值,其值是CPU根据执行结果生成的标志信息。
PSW是可编程寄存器,可编程分为直接编程和间接编程,用户不能直接使用指令对PSW寄存器值进行修改,但是可以间接影响到其值。
存取周期是存储器两次独立存储操作所需的最小间隔时间,DMA直接与主存之间的传输也遵守该情况,一次传输需要一个存取周期。
把一条指令的执行过程划分为若干个阶段,每一阶段完成一个基本操作,完成一个基本操作所需要的时间称为机器周期,通常选取需要时间最长的阶段时间作为机器周期。
不采用CPU内部总线的数据通路即专用数据通路,此法性能高,但是硬件量大。对于CPU内部总线,其结构简单,实现容易,但是性能较低,存在较多的冲突。
水平型指令能定义并执行几种可以并行的基本操作,所以它长,一条指令由多个操作。垂直型指令只能定义并执行一种基本操作,导致微程序长,指令堆得高。
控制信号经过编码产生是一种控制字段得编码方法,属于水平型指令,即说明哪些操作并行的字段。强调并行控制功能是一种控制字段的设计目标,也是属于水平型指令。垂直型微指令的微指令格式实际上并不是垂直表示的,只是相对于水平型指令,它显得很垂直。
微处理器是相对于一些大型处理器而言的,与微程序控制器没有什么关系。直接编码不需要译码,执行效率高。水平型指令定义了多个可以并行执行的操作,确实充分利用了数据通路的并行结构。
状态条件寄存器在上面已经错过了。
控制器出错、存储器校验错都是严重错误,程序停止执行。
Cache全部由硬件实现,干啥都不用程序管,其缺失由CPU硬件实现。而对于缺页异常,需要由硬件+操作系统完成处理。
注意题目问不属于外部中断,即属于内中断的是什么,内中断又称异常,是与当前执行的指令有关的错误。
进程切换确实由操作系统内核程序实现,但是对于异常中断的响应,注意是响应而不是处理,是由硬件实现的。
外部中断,是在当前指令执行完的中断周期进行响应处理的,处理完成后应该是返回下一条待执行的指令地址。终止…都不返回吧。
这就是上面说的,终止异常不会返回执行。
与当前执行的指令有关的东西发生错误都是异常,显然A是异常。
标量流水线处理机,就是正常的流水线机子,是属于SISD。
控制部件就是CPU,一个就是SI,处理单元处理数据,多个就是MD。
这个知识点可能还得熟悉一下。
第6章 总线
D项包括了A项。地址总线上的代码用来指明CPU要访问的存储单元或者I/O端口的地址。
串行传输是指数据的传输在一条线路上按位进行。并行传输是指每一个数据位有一条单独的数据线,所有数据位同时传输。这与题干描述不同,不同信号在同一条信号线上分时传输是总线复用的方式。
多通道存储器技术是在动态随机存储体和存储器控制器芯片组之间,增加更多的并行通信通道,以增加数据发送的带宽。理论上每增加一条通道,数据发送性能相较于单通道而言会增加一倍。此题依次进行解答,有1333 M* 64 * 3 / 8=31992 MB/S。
异步方式主要用在不同的设备之间进行通信,可以保证两个工作速度相差很大的部件或设备之间可靠地进行数据信息交换。需要注意的是,同步方式虽然适用于速度相近的设备,但是也可以用于不同速设备,只是不能发挥其中快速设备的高性能。
128位数据在32位总线上传输需要4个周期,同时开始还需要一个地址信息传输过来,总共5个周期,根据时钟频率算一下就可以了。
同步总线双方采用一个控制信号,但一次总线事务不一定在一个时钟周期完成。异步总线采用握手方式进行通信,每次握手过程完成一次通信,但一次通信会交换多位而不是一位数据。
第7章 输入/输出系统
统一编址下,没有专门的I/O指令,用访存指令实现I/O操作,靠各自不同的地址码区分存储单元和I/O设备。独立编址下,专门的I/O指令实现操作。
磁盘驱动器,就是平常说的磁盘本身,包括磁头、磁盘、读写电路,不属于I/O接口。
普通中断请求是在一条指令执行结束的中断周期去检查响应的。对于DMA请求的检测,发生在任意一个机器周期结束的时候(取值、间值、执行周期后均可)。在没有机器周期可选的情况下,毋庸置疑是只能选总线周期的。
两种理解方式,对于DAM请求的响应:1)从传送方式的角度来理解,DMA的传送方式是“周期窃取”,采用周期窃取方式,cpu不使用总线的时候,DMA控制器可以直接使用,并不需要等到CPU机器周期结束。2)从中断的角度来理解,在预处理时刻CPU响应DMA请求中断,这种中断的优先级比外中断高,要求CPU尽快响应,但是CPU总得把手里面最基本的事情做完才能响应这个很着急的特殊中断,也就是机器周期后响应DMA。
没有DMA接口,它啥也干不了。
用户程序需要输入/输出时,需要调用操作系统提供的接口,此时需要系统由用户态转为核心态。
熟记CPU响应中断需要满足的条件:1)中断源有中断请求;2)CPU允许中断且在开中断状态(异常可不可屏蔽中断受此限制);3)一条执行执行完毕(异常不受此限制),且没有更紧迫的任务。
中断触发器置0即为关中断。在单重中断中,只有一次关中断,由中断隐指令(硬件)完成。对于多重中断,在恢复现场和屏蔽字时,此时关中断操作由关中断指令完成。
DMA控制器的主要功能,接受外设发出的DMA请求,并向CPU发出总线请求。
其他主要功能还有:2)CPU响应并发出总线响应信号,DMA接管总线控制权,进入DMA操作周期。3)确定传送数据的主存起始地址及长度,并自动修改主存地址计数和传送长度计数。4)规定数据在主存和外设间的传送方向,发出读/写等控制信号,执行数据传送操作。5)向CPU报告DMA操作结束。
DMA请求比外中断优先级高。
DMA完全由硬件电路实现。
注意中断服务程序内部的执行顺序,且是单重中断,已经被中断隐指令关中断。中断服务程序要做的是:1)保护现场和屏蔽字;2)执行;3)恢复现场和屏蔽字;4)开中断;5)中断返回。
与上面那个刚好是不同的部分,保存通用寄存器的内容就是保护现场。
周期挪用,挪用的是存取周期,无多模块存储器的情况下,一个周期传输一个字。整个数据块由多个字,需要挪用多次周期,显然CPU可以在传输完一个字后访问主存。
中断服务程序需要在内核态执行,而多重中断中断的就是中断服务程序,不可能仅在用户态才能响应中断。