一、 计算机系统概述
- MAR 用于寻址,其位数反映最多可寻址的存储单元的个数。如MAR为10 位,则最多有2^10=1024 个存储单元,记为 1K。MAR 的长度与 PC 的长度相等。
- PC(程序计数器)总是指向下一条将要取指的指令地址。
- MDR 的位数通常等于存储字长,一般为字节的2次幂的整数倍。
- 机器字长:能够直接处理的二进制数据的位数。
- 指令字长:一个指令中包含的二进制代码的位数。
- 存储字长:一个存储单元存储二进制数据的位数。
计算机语言和程序
翻译程序
将高级语言程序转换为机器语言程序通常把进行这种转换的软件系统称翻译程序。
翻译程序有以下三类:
- 汇编程序(汇编器)。将汇编语言程序翻译成机器语言程序。
- 解释程序(解释器)。将源程序中的语句按执行顺序逐条(行)翻译成机器指令并立即执行。
- 编译程序(编译器)。将高级语言程序翻译成汇编语言或机器语言程序。
答案:C
答案:C。
计算机语言
- 机器语言,是计算机唯一可以直接识别和执行的语言。
- 汇编语言,用英文单词或其缩写代替二进制的指令代码,更容易为人们记忆和理解。如:mov edx, length message ; 消息长度
- 高级语言,高级语言(如C、C++、Java 等)。通常高级语言需要经过编译程序编译成汇编语言程序,然后经过汇编操作得到机器语言程序,或直接由高级语言程序翻译成机器语言程序。
答案:C
答案:D
解析:
答案:A
计算机性能指标
- 吞吐量:指系统在单位时间内处理请求的数量,因此系统吞吐量主要取决于主存储器的存取周期。
- 主频(CPU 时钟频率):最直观的理解就是每秒有多少个时钟周期,因此,主频与时钟周期是倒数关系。
- CPU 时钟周期 =1/主频,主频通常以 Hz(赫兹)为单位,10Hz表示每秒 10 个时钟周期。
- CPI(Cycle Per Instruction),即执行一条指令所需的时钟周期数。
- IPS(Instnuctions Per Second),即每秒执行多少条指令,IPS= 主频/平均 CPI。
- CPU 执行时间 =CPU 时钟周期数/主频 =(指令条数xCPI)÷主频,上式表明,CPU 的性能(CPU 执行时间)取决于三个要素:主频、CPI和指令条数。
- MIPS(Million Instructions Per Second),即每秒执行多少百万条指令。MIPS= 指令条数÷(执行时间x10^6 )= 主频÷(CPIx10^6)。
答案:D
在不同类型计算机上,时钟周期大小可能不同,相同程序,可能产生不同的指令条数。
答案:D
答案:D
答案:D
答案:C
二、 数据的表示与运算
定点数的表示
1.真值和机器数
- 带“+”或“-”符号的数称为真值,如+15、-8等。真值是机器数所代表的实际值。
- 将数据的符号数字化,通常用“0”表示“正”,用“1”表示“负”。这种把符号“数字化”的数称为机器数。常用的有原码、补码和反码表示法。如 0,101(这里的逗号“,”仅为区分符号位与数值位)表示+5。
2.机器数的定点表示
- 在现代计算机中,通常用补码整数表示整数,用原码小数表示浮点数的尾数部分,用移码表示浮点数的阶码部分。
- 定点小数是纯小数。
- 定点整数是纯整数。
- 事实上,在机器内部并没有小数点,只是人为约定了小数点的位置。因此,在定点数的编码和运算中不用考虑对应的定点数是小数还是整数,而只需关心它们的符号位和数值位即可。
原码、补码、反码和移码
1.原码: 先将真值的绝对值转二进制,然后符号位取对应的二进制。
2.反码: 将原码除符号位外,整体取反。
3.补码:
- 正数补码和原码相同,负数的补码 =反码末位+1。
- 负数补码转原码 简洁法:符号位不变,从低位开始数,将第一个1到符号位之间的数全部取反即可,如([x]补=1101 , [x]原=1011),负数原码转补码也是一样的 。
- 与原码和移码相比,补码运算规则比较简单,且符号位可以和数值位一起参加运算。
注意:
- [-x]补 = 将 [x]补 连同符号位整体取反,再末位+1。
- [2x]补 = 将 [x]补 左移一位。(符号位不动!)
- 原码和反码对数值0都有两种表示形式,而补码只有一种。
答案:B
答案:D, 考虑x=0
4.移码: 补码符号位取反。
原码、补码、反码和移码表示范围
- 与原码和反码相比,补码比原码和反码多表示一个最小负数。
- 计算机中的有符号整数都用补码表示,故n位有符号整数的表示范围即补码范围。
答案:B
答案:D
答案:B
补码和移码判断大小
- 补码:数值部分越大,真值越大。
- 移码:保持了原有大小顺序,可以直接比较大小。(比较时,将符号位也当做数值位)
答案:A, [x]原码+偏置值=[x]移码。
答案:C,x补码的数值部分大于 -32 补码的数值部分即可。
答案:C
答案:D
变形补码
- 变形补码是一种采用双符号位的补码表示,也称模4补码。假定变形补码的位数为n+1(其中符号位占2位,数值位占n-1位)。
- 模4补码双符号位 00 表示正,11 表示负。
- 注意:双符号位仅仅是在ALU里执行算数运算,真正存储时还是单符号位。
C语言中的整数类型及类型转换
1.C语言中的整型数据类型
- char,8位,char 默认是无符号整数
- short 或 shont int,16 位 (216 = 65536,215 = 32768)
- int,32 位
- 长整型(long 或 long int,在 32 位机器中为 32位,在 64 位机器中为 64 位)
signed/unsigned
整型数据都是按补码形式存储的,只是 signed 型的最高位代表符号位,而在unsigned 型中表示数值位,因此这两者所表示的数据范围也有所不同。
2.有符号数和无符号数的转换
- 强制类型转换的结果是保持位值不变,仅改变了解释这些位的方式。
- 由 short 型转换到 unsigned short 型的情况:
- 若同时有无符号数和有符号数参与运算,则C语言标准规定按无符号数进行运算。
3.不同字长整数之间的转换
-
当大字长变量向小字长变量强制类型转换时,系统把多余的高位部分直接截断,低位部分直接赋值,因此也是一种保持位值的处理方法。
-
再看小字长变量向大字长变量转换的情况。小字长到大字长的转换时,不仅要使相应的位值相等,还要对高位部分进行扩展。若原数字是无符号整数,则进行零扩展,扩展后的高位部分用0填充,否则进行符号扩展。
答案:D
求出 usi 在计算机里存储成的二进制信息 (这里用十六进制表示 FFFF H)。
然后将其看成有符号数,重新进行解释。由于是负数,故要将补码转换为原码。
答案:A,别忘了将 负数的补码 转化为对应的十进制信息。
定点数的运算
逻辑移位
- 逻辑移位将操作数视为无符号整数。
- 逻辑移位的规则:左移时,高位移出,低位补0; 右移低位移出,高位补0。
- 对于无符号整数的逻辑左移,若高位的1移出,则发生溢出。
算术移位
- 算术移位需要考虑符号位的问题,即将操作数视为有符号整数!
- 算术移位的规则:左移时,高位移出,低位补0,若移出的高位不同于移位后的符号位,即左移前后的符号位不同,则发生溢出;右移时,低位移出,高位补符号位,若低位的1移出,则影响精度。
注意: 由以上我们可以看出,算数左移和逻辑左移操作是相同的,因此,在不发生溢出的前提条件下,它们的结果必然是相同的。
判断溢出
判断溢出(4种方法)
法1:
法2:
法3:
模4补码又称为变形补码
概念是:用两个二进制位来表示符号位,其余位与补码相同,
法4:
答案:C
运算标志
- 零标志ZF: ZF=1表示结果F为0。对于无符号数和有符号数的运算,ZF都有意义。
- 溢出标志 OF: 判断有符号数运算是否溢出,它是符号位进位与最高数位进位的异或结果,对于无符号数运算,OF 没有意义。
- 符号标志 SF: 表示结果的符号,结果负,则SF=1,即F的最高位。对于无符号数运算,SF 没有意义。
- 进/借位标志 CF: 表示无符号数运算时的进位/借位,判断是否发生溢出。
计算机是根据OF判断是否发生溢出,OF = 最高位的进位 与 次高位的进位 进行异或运算
答案:A
判断CF时,要把两者都看作无符号数。
加法器
答案:B
ALU
浮点数的表示与运算
答案:C
浮点数的规格化:
- 尽可能多地保留有效数字的位数。所谓规格化操作,是指通过调整一个非规格化浮点数的尾数和阶码的大小,使非零浮点数在尾数的最高数位上保证是一个有效值。
- 基数不同,浮点数的规格化形式也不同。当浮点数尾数的基数为2时,原码规格化数的尾数最高位一定是1。当基数为4时,原码规格化数的尾数最高两位不全为0。
答案:B
答案:D
小数转二进制
一般格式
IEEE 754格式
转化过程:
- 十进制转二进制,然后规格化。
- 阶码=阶数+偏置值(单精度偏置值 127,双精度偏置值 1023)
- 归位!(尾数最高有效位隐藏)
答案:A
IEEE 754规格化浮点数所能表示的最大值和最小值
答案:B
阶码全0、全1的特殊用途
答案:C,阶码下溢可以通过非规格化数来表示。
答案:A
定点、浮点表示的区别
- 数值的表示范围: 若定点数和浮点数的字长相同,则浮点表示法所能表示的数值范围远大于定点表示法。原因: 坑位虽然相同但利用方式却不同,可以对比 32位定点数与浮点数表示的最大值。
- 精度: 因为浮点数在右规过程中可能会发生舍入,而定点数没有舍入概念(只有溢出)。对于字长相同的定点数和浮点数来说,浮点数虽然扩大了数的表示范围,但精度降低了。
- 数的运算: 浮点数包括阶码和尾数两部分,运算时不仅要做尾数的运算,还要做阶码的运算,而且运算结果要求规格化,所以浮点运算比定点运算复杂。
- 溢出问题: 在定点运算中,当运算结果超出数的表示范围时,发生溢出; 在浮点运算中,运算结果超出尾数表示范围却不一定溢出,只有规格化后阶码超出所能表示的范围时,才发生溢出。(浮点数尾数超出范围时,可以通过左规或右规进行纠正,因此,在这个过程中,只需要关心阶码是否下溢或上溢。
)
答案:D
浮点数的加减运算
步骤:
- 对阶(小阶向大阶对齐,尾数对应右移)。
- 尾数加减: 将对阶后的尾数按定点原码小数的加(减)运算规则进行运算。因为 IEEE 754 浮点数尾数中有一个隐藏位,因此在进行尾数加减时,必须将隐藏位还原到尾数部分。
- 尾数规格化
- 舍入: 在对阶和尾数右规时,可能会对尾数进行右移,为保证运算精度,一般将移出的部分低位保留下来,参加中间过程的运算,最后再将运算结果进行舍入,还原表示成IEEE754 格式。
例题:(过程仅供参考,按自己的思路来。)
答案:A
IEEE754标准中的4种舍入模式
1、就近舍入:
即十进制下的四舍五入。但是也会出现以下几种情况:
多余数字是1001,它大于0.5,故最低位进1。
多余数字是0111,它小于0.5,则直接舍掉多余数字。
多余数字是1000,正好是等于0.5的特殊情况;那么此时最低位为0则舍掉多余位,最低位为1则进位1。
注意这里说明的数位都是指二进制数。因为这是尾数,所以在计算这些二进制和0.5的关系的时候,也即转为10进制的时候,我们用每一位的权重乘以2^(-i)
然后求和即可。
2、朝0舍入:
即朝数轴零点方向舍入,所以我们直接截尾即可。
3、朝正无穷舍入:
对正数而言,多余位全为0则直接截尾,不全为0则向最低有效位进1;
负数的话不管多余位是多少直接截尾即可。
4、朝负无穷舍入:
对负数而言,多余位全为0则直接截尾,不全为0则向最低有效位进1;
正数的话不管多余位是多少直接截尾即可。
举例
要求保留小数点后3位
1、就近舍入:
对于1.001_1001,舍入处理后为1.010(去掉多余的4位,加0.001)
对于1.001_0111,舍入处理后为1.001(去掉多余的4位)
对于-1.001_1000,舍入处理后为-1.010(去掉多余的4位,加0.001,因为此时最低位为1)
对于-1.010_1000,舍入处理后为-1.010(直接去掉多余的4位,因为此时最低位为0)
2、朝0舍入:
//正数直接截尾
对于1.001_1001,舍入处理后为1.001(直接去掉多余的4位)
对于1.001_0111,舍入处理后为1.001(直接去掉多余的4位)
//负数直接截尾
对于-1.001_1000,舍入处理后为-1.001(直接去掉多余的4位)
对于-1.010_1000,舍入处理后为-1.010(直接去掉多余的4位)
3、朝正无穷舍入:
//正数多余位不全为0进位1
对于1.001_1001,舍入处理后为1.010(去掉多余的4位,加0.001)
对于1.001_0111,舍入处理后为1.010(去掉多余的4位,加0.001)
//正数多余位全为0直接截尾
对于1.001_0000,舍入处理后为1.001(直接去掉多余的4位)
//负数直接截尾
对于-1.001_1010,舍入处理后为-1.001(直接去掉多余的4位)
4、朝负无穷舍入:
//正数直接截尾
对于1.001_1001,舍入处理后为1.001(直接去掉多余的4位)
对于1.001_0111,舍入处理后为1.001(直接去掉多余的4位)
//负数多余位全为0直接截尾
对于-1.001_0000,舍入处理后为-1.001(直接去掉多余的4位)
//负数多余位不全为0进位1
对于-1.001_1010,舍入处理后为-1.010(去掉多余的4位,加0.001)
答案:C, 舍入情况:右规、对阶
浮点数溢出判断
指数溢出问题:
- 若一个正指数超过了最大允许值(127 或 1023),则发生指数上溢,产生异常。
- 若一个负指数超过了最小允许值(-149=-126-23 或-1074=-1022-52,别忘了 尾数还可以再左移23位!),则发生指数下溢,通常把结果按机器零处理。
C语言中的浮点数类型
int 型和 foat 型的精度和范围的分析:
- int 型转换为 foat 型时,虽然不会发生溢出,但foat 型尾数连隐藏位共 24 位,当 int 型数的第 24~31 位非0时,无法精确转换成 24 位浮点数的尾数,需舍入处理,影响精度。(float只能将1~23位看作尾数,再往后,只能归于阶码和符号位)
答案:D
IV: 不合法有两种情况:溢出、对阶导致发生舍入
由于double尾数52位,故不可能溢出
这题对阶最离谱导致一个数右移31位,而尾数能容纳52位,因此,也不可能舍入。
数据的大小端和对齐存储
- 大端方式: 先存储高位字节,后存储低位字节。字中的字节顺序和原序列的相同。
- 小端方式: 先存储低位字节,后存储高位字节。字中的字节顺序和原序列的相反。
答案:A
答案:A
数据按“边界对齐”方式存储
- 数据按边界对齐方式存放要求其存储地址是自身大小的整数倍。
- 半字地址一定是2的整数倍,字地址一定是4的整数倍,这样无论所取的数据是字节、半字还是字,均可一次访存取出。
在 C 语言的 struct 类型中,“边界对齐”有两个重要要求:
- 每个成员按其类型的大小对齐,char 型的对齐值为 1,short 型的对齐值为 2,int 型的对齐值为 4,单位为字节。
- struct 的长度必须是成员中最大对齐值的整数倍(不够就补空字节)。
答案:A
答案:D
三、存储系统
存储器概述
按存取方式分类
- 随机存储器(RAM):存储器的任何一个存储单元都可以随机存取,而且存取时间与存储单元的物理位置无关。
- 只读存储器(ROM):存储器的内容只能随机读出而不能写入。ROM 和 RAM 的存取方式均为随机存取。 注意: 广义上的只读存储器已可通过电擦除等方式进行写入,其“只读”的概念没有保留,但仍保留了断电内容保留、随机读取特性,但其写入速度比读取速度慢得多。
- 串行访问存储器:顺序存取存储器(如磁带)和直接存取存储器(如磁盘、光盘)。
- 顺序存取存储器的内容只能按某种顺序存取,存取时间的长短与信息在存储体上的物理位置有关。
- 直接存取存储器既不像 RAM 那样随机地访问任何一个存储单元,又不像顺序存取存储器那样完全按顺序存取,而是介于两者之间。存取信息时通常先寻找整个存储器中的某个小区域(如磁盘上的磁道),再在小区域内顺序查找(随机+顺序)。
答案:D
性能指标
存储器有三个主要性能指标,即存储容量、单位成本和存储速度。
- 存储容量 = 存储字数x字长(如 1Mx8位)。单位换算:1B(Byte,字节)=8b(bit,位)。
存储字数表示存储器的地址空间大小,字长表示一次存取操作的数据量。 - 单位成本:每位价格=总成本/总容量。
- 存储速度:数据传输速率(每秒传送信息的位数)=数据的宽度/存取周期。
答案:C
多级层次的存储系统
- Cache——主存层主要解决 CPU 和主存速度不匹配的问题,主存和 Cache 之间的数据调动是由硬件自动完成的,对所有程序员均是透明的。
- 主存-辅存层主要解决存储系统的容量问题,主存和辅存之间的数据调动是由硬件和操作系统共同完成的,对应用程序员是透明的。
主存储器
- 主存储器主要由 DRAM 实现。
- 靠近处理器的那一层(Cache)则由 SRAM 实现。
- 通常把存放一个二进制位的物理器件称为存储元,它是存储器的最基本的构件。地址码相同的多个存储元构成一个存储单元。若干存储单元的集合构成存储体。
对比SRAM和DRAM
DRAM的刷新方式
DRAM 电容上的电荷一般只能维持 1~2ms,因此即使电源不断电,信息也会自动消失,所以需要刷新。
- 集中刷新: 在一个刷新周期内,利用一段固定的时间,依次对存储器的所有行进行逐一再生,在此期间停止对存储器的读/写操作,称为死时间,也称访存死区。
- 分散刷新: 将一个存储器系统的工作周期分为两部分,前半部分用于正常的读/写操作,后半部分用于刷新,说人话就是:每进行一次读写,就进行一次刷新。这种刷新方式增加了系统的存取周期,如存储芯片的存取周期为0.5us,则系统的存取周期为1us(因为两次存取操作之间的时间间隔变为了 1us)。优点是没有死区。
- 异步刷新: 在一个刷新周期内每行仅刷新一次。假设刷新周期为2ms,一共有128行,则2ms内每行刷新1次即可,2ms内需要产生128次刷新请求每隔 2ms/128=15.6us 一次每15.6us内有0.5us的“死时间”。
注意:
- 刷新对 CPU 是透明的,即刷新不依赖于外部的访问。
- DRAM 的刷新单位是行。
- 刷新操作类似于读操作(读内存,找源数据),但又有所不同。
- 刷新时不需要选片,即整个存储器中的所有芯片同时被刷新。
- 虽然 DRAM 的刷新和再生都是恢复数据,但刷新与再生的过程并不完全相同。刷新是以行为单位,逐行恢复数据的,而再生仅需恢复被读出的那些单元的数据。
- 构成存储器的所有芯片同时按行刷新。
答案:C
答案:A
答案:D, 死区
DRAM的地址复用技术
为什么要采用地址复用技术?
答:
- 如果不采用地址复用技术,那么,如果有2n 个存储单元,就需要 n根地址线,代价太大。
- 采用地址复用技术后,2n 个存储单元按行列排列成 2(n/2) * 2(n/2) ,只需要连接每行即可,即只需要 (n/2) 根地址线 。
- 区分地址线与选通线,3根地址线可以对应 8根选通线,因为23 可以产生8种状态。
- 由于 DRAM 按行刷新,为减少刷新开销,应使行数较少。
答案:B
答案:B
答案:B
行缓冲器、突发传输、容量
- 传统 DRAM与 CPU 采用异步方式交换数据,在读/写完成之前,CPU 不能做其他工作。
- SDRAM 与 CPU 采用同步方式交换数据,CPU 在其读/写完成之前可进行其他操作。
- SDRAM 支持突发传输方式。第一次存取时给出首地址,同一行的所有数据都被送到行缓冲器。
- 行缓冲器 其大小为“列数x位平面数”,通常用 SRAM 实现。
答案:A
RAM类型
- 掩模式只读存储器:MROM 的内容由半导体制造厂按用户提出的要求在芯片的生产过程中直接写入,不可改变。
- 一次可编程只读存储器:PROM 是可以实现一次性编程的只读存储器。允许用户自己写入,一旦写入,内容就无法改变。
- 可擦除可编程只读存储器:EPROM 可以对其内容进行多次改写。EPROM 虽然既可读又可写,但它不能取代 RAM,因为 EPROM 的编程次数有限,且写入时间过长(因为需要进行电擦除)。
- Flash 存储器:Flash 存储器是在 EPROM 的基础上发展起来的,擦除重写的速度快。
- 固态硬盘(Solid State Drive,SSD):由控制单元和存储单元(Flash芯片)组成。
MAR 和 MDR 位数与地址线/数据线数的关系
- MDR 的位数与数据线的位数相同,MAR的位数与地址线的位数相同。
- 数据线的位数通常等于存储字长,因此 MDR 的位数通常等于存储字长;若数据线的位数不等于存储字长,则 MDR的位数由数据线的位数决定。
多体并行存储器
多体并行存储器分为高位交叉编址和低位交叉编址两种。
高位交叉编址: 顺序编址(如图)。
低位交叉编址: 交叉编址(如图)。
高位交叉编址与低位交叉编址 效率对比:
设每个存储体存取周期为T存取时间为r,假设 T=4r。
连续访问:00000 ,00001,00010,00011,00100
- 高位交叉编址:耗时 5T。
- 低位交叉编址:耗时 5r+3r = 2T。注意: 存取周期为T,存取时间为r,为了使流水线不间断,应保证模块数 m>=T/r。
注意:
交叉存储器可以采用轮流启动或同时启动两种方式
- 若每个模块一次读/写的位数正好等于数据总线位数,采用轮流启动方式。
- 若所有模块一次并行读/写的总位数正好等于数据总线位数,则可以同时启动所有模块进行读/写。
- 两种方式所花费的总时间是一样的。
答案:C
答案:D
答案:C
答案:C
解析:
B: 由于总线宽度64位,所以想要一次传输64位数据,只能采用低位交叉编址的同时启动模式,对8个226 * 8位的DRAM同时读取。
主存储器与CPU的连接
位扩展
当CPU的系统数据线数多于存储芯片的数据位数时,必须对存储芯片扩位,使其数据位数与CPU的数据线数相等。
字扩展
系统数据线位数等于芯片数据线位数,系统地址线位数多于芯片地址线位数。
字位扩展
答案:A
以4字节为编址单位,说明存储字长为32位,那么32KB的存储体 == 8K * 32b。
答案:D
译码器和芯片地址范围
CPU要实现对存储单元的访问,首先要进行片选,然后在选定的芯片中选择具体的存储单元,以进行数据的读/写,即进行字选。
地址线多出的高位部分作为译码器的输入线,低位部分作为字选线。
片选信号的产生方法分为线选法和译码片选法。
译码片选法
线选法
- 选哪个芯片,就让对应的地址线为0,因此,不存在全0或全1。
答案:A
答案:C
答案:B
答案:D
由于片选信号低电平有效,所有下面这个表达式结果为0时,才是有效的片选信号,也就是说,此移码空间对应地址的高位部分,一定能使表达式为0。
答案:D
MAR 的位数决定了计算机的寻址能力,为了满足以后扩展,MAR取它能取到的最大值。
外部存储器
磁盘存储器
磁盘存储器由磁盘驱动器、磁盘控制器和盘片组成。
- 磁盘驱动器:驱动磁盘转动并在盘面上通过磁头进行读/写操作的装置。
- 磁盘控制器:磁盘驱动器与主机的接口,负责接收并解释 CPU 发来的命令,向磁盘驱动器发出各种控制信号,并负责检测磁盘驱动器的状态。
存储区域
一个磁盘含有若干记录面,每个记录面划分为若干圆形的磁道,而每条磁道又划分为若干扇区,扇区(也称块)是磁盘读/写的最小单位,即盘按块存取。
- 磁头数:即记录面数,一个记录面对应一个磁头。
- 柱面数:表示磁盘每面盘片上有多少条磁道。在一个盘组中,不同记录面的相同编号(位置)的诸磁道构成一个圆柱面。
- 扇区数:表示每条磁道上有多少个扇区。由于每条磁道扇区数相同,故位密度从最外道向里道增加,磁盘的存储能力受限于最内道的最大记录密度。
- 磁盘高速缓存:在内存中开辟一部分区域,用于缓冲将被送到磁盘上的数据。优点:写磁盘时是按“簇(块)”进行的,可以避免频繁地用小块数据写盘;有些中间结果数据在写回磁盘之前可被快速地再次使用。
磁盘的性能指标
- 记录密度:通常以道密度、位密度和面密度表示。道密度是沿磁盘半径方向单位长度上的磁道数。位密度是磁道单位长度上能记录的二进制代码位数,面密度是位密度和道密度的乘积。
- 磁盘的容量:磁盘容量有非格式化容量和格式化容量之分。
计算公式:
非格式化容量=面数x道数(面)x每个磁道的容量
格式化容量=面数x道数(面)x扇区数(道)x字节数(扇区)
由公式之间的区别我们可知,格式化就是对磁盘进行扇区划分,扇区之间存在缝隙。
磁盘存取时间的计算
- 存取时间: 由寻道时间(磁头移动到目的磁道的时间)、旋转延迟时间(磁头定位到要读/写扇区的时间)和传输时间(传输数据所花费的时间)三部分构成。
- 寻道时间和旋转延迟时间通常取平均值(平均寻道时间取从最外道移动到最内道时间的一半,平均旋转延迟时间取旋转半周的时间)。
- 数据传输率:
答案:D
最大数据传输率= 传输数据的总量 / 单纯传输数据所花费的时间。
答案:B
答案:B
磁盘地址
磁盘阵列
- RAID0 没有容错能力。
- RAID1 使两个磁盘同时进行读/写,互为备份,若一个磁盘出现故障,可从另一磁盘中读出数据。两个磁盘当一个磁盘使用,意味着容量减少一半。
固态硬盘
- 固态硬盘(SSD)是一种基于闪存技术的存储器。它与U盘并无本质差别,只是容量更大,存取性能更好。
- 一个 SSD 由一个或多个闪存芯片和闪存翻译层组成
- 闪存翻译层将来自 CPU 的逻辑块读/写请求翻译成对底层物理设备的读/写控制信号,因此,这个闪存翻译层相当于代替了磁盘控制器的角色。
- 数据是以页为单位读/写的。
- 写比读慢,因为写之前要擦除,若写操作试图修改一个包含已有数据的页P,则这个块中所有含有用数据的页都必须被复制到一个新(擦除过的)块中。
SSD磨损均衡:
闪存的擦写寿命是有限的,一般是几百次到几千次。
- 动态磨损均衡。写入数据时,自动选择较新的闪存块。老的闪存块先歇一歇。
- 静态磨损均衡。这种技术更为先进,就算没有数据写入,SSD也会监测并自动进行数据分配,让老的闪存块承担无须写数据的存储任务,同时让较新的闪存块腾出空间,平常的读/写操作在较新的闪存块中进行。
答案:C
磁盘读/写数据:先随机查找磁道,然后再磁道内顺序查找扇区,类似与 直接存储器,故寻道时间与转速无关。
存取时间: 由寻道时间、旋转延迟时间和传输时间三部分构成。
缓存Cache
CPU访存时,先访问Cache,如果没有找到,再访问主存,同时,将数据所在的数据块调入Cache。
假设现在要访问 虚拟地址 VA,写出流程:
①将虚拟地址VA转成物理地址PA。
②CPU先根据PA查Cache(按照映射方式,看标志位和有效位),不命中,再访存。
局部性原理
- 时间局部性:强调一个内存位置被多次使用。如例3.2定义的变量。
- 空间局部性:强调若一个内存地址被访问,它相邻的位置也会很快被访问。如例3.2数组元素。
答案:D
Cache 的基本工作原理
- Cache 和主存都被划分为大小相等的块,每块由若干字节组成。
- 注意:Cache行包含Cache块,如图
Cache 命中率的计算
- 先访问Cache,再访问主存,计算平均访问时间。
- 同时访问Cache和主存,计算平均访问时间。
答案:C
答案:C
Cache 和主存的映射方式
1.全相联映射
主存中的每一块可以装入 Cache 中的任何位置。
例题:基于全相联映射, CPU访问主存地址1…1101 001110:
- 主存地址的前22位,对比Cache中所有块的标记;
- 若标记匹配且有效位=1,则Cache命中,访问块内地址为001110的单元。
- 若未命中或有效位=0,则正常访问主存。
答案:D
2.直接映射
由定义可知,若Cache总块数=2n ,则主存块号末尾n位直接反映它在Cache中的位置,因此,Cache的标记位可以只存放主存块号的 高(主存块号位数 - n)位。
直接映射,CPU访问主存地址:0…01000 001110
- 根据主存块号的后3位确定Cache行。
- 若主存块号的前19位与Cache标记匹配且有效位=1,则Cache命中,访问块内地址为 001110的单元。
- 若未命中或有效位=0,则正常访问主存
答案:D
答案:A
3.组相联映射
- 将 Cache 分成Q个大小相等的组,每个主存块可以装入固定组中的任意一行,即组间采用直接映射、而组内采用全相联映射的方式。
- 当Q=1时变为全相联映射,当Q=Cache 行数时变为直接映射。
- 假设每组有r个 Cache 行,则称为r路组相联。
2组相联映射,CPU访问主存地址:1…1101001110
- 根据主存块号的后2位确定所属分组号。
- 若主存块号的前20位与分组内的某个标记匹配且有效位=1,则Cache命中,访问块内地址为 001110的单元。
- 若未命中或有效位=0,则正常访问主存。
答案:C
答案:B
答案:B,注意,题目说的是主存单元不是主存块
组相联映射中比较器的个数和位数(2022)
- 直接映射因为每块只能映射到唯一的 Cache 行,因此只需设置1个比较器。而r路组相联映射需要在对应分组中与r个Cache 行进行比较,因此需设置,个比较器。
- r路组相联映射每次需要同时跟r项标记位比较,故需要r个比较器。
Cache容量
Cache 的总容量=存储容量+标记阵列容量(有效位、标记位,脏位和替换算法位)。
Cache行结构
这里解释一下替换信息位:实际上就是替换优先级,如二路组相联映射,替换位为1bit。
Cache的替换算法
- 全相联映射:Cache完全满了才需要替换需要在全局选择替换哪一块。
- 直接映射:由于位置唯一确定,故,如果对应位置非空,则毫无选择地直接替换(无需考虑替换算法)。
- 分组内满了才需要替换需要在分组内选择替换哪一块
抖动现象: 频繁的换入换出现象(刚被替换的块很快又被调入)
1.先进先出(FIFO):
2.近期最少使用算法 LRU
每次替换最近最少访问的主存块,从后往前看即可。
采用全相联映射,依次访问主存块(1,2,3,4,1,2,5,1,2,3,4, 5}
答案:A
答案:C
答案:B
3.最不经常使用算法:(LFU)
Cache 的一致性问题(写)
-
因为 Cache 中的内容是主存块副本,当对 Cache 中的内容进行更新时,就需选用写操作策略使 Cache 内容和主存内容保持一致。
-
写策略:
-
全写法(直写法):当 CPU 对 Cache 写命中时,必须把数据同时写入 Cache和主存,显然不需要 “脏位”。
-
写缓冲:为减少全写法直接写入主存的时间损耗,在 Cache 和主存之间加一个写缓冲(Write Bufer),如下图所示。CPU 同时写数据到 Cache 和写缓冲中,写缓冲再将内容写入主存。写缓冲是一个FIFO 队列,写缓冲可以解决速度不匹配的问题。但若出现频繁写时,会使写缓冲饱和溢出。
-
回写法:当 CPU 对 Cache 写命中时,只把数据写入 Cache,而不立即写入主存,只有当此块被替换出时才写回主存。给每个 Cache 行设置一个修改位(脏位)。若修改位为 1,则说明对应 Cache 行中的块被修改过,替换时须写回主存,若修改位为0,则说明对应 Cache 行中的块未被修改过,替换时无须写回主存。
-
写分配法:当CPU对Cache写不命中时,把主存中的块调入Cache,在Cache中修改。通常搭配写回法使用。
-
非写分配法(not-write-allocate)–当CPU对Cache写不命中时只写入主存,不调入Cache。搭配全写法使用。
分离Cache
虚拟存储器
- 主存和辅存共同构成了虚拟存储器,二者在硬件和系统软件的共同管理下工作。对于应用程序员而言,虚拟存储器是透明的。虚拟存储器具有主存的速度和辅存的容量。
答案:D
页式存储系统
- 一个程序(进程)在逻辑上被分为若干个大小相等的“页面”,“页面”大小与“块”的大小相同。每个页面可以离散地放入不同的主存块中。
- 逻辑地址(虚地址)程序员视角看到的地址。
- 物理地址(实地址)实际在主存中的地址。
逻辑地址结构为:逻辑页号+页内地址。
物理地址结构为:主存块号+块内地址。
由于逻辑页和物理块的大小相同,故,页内地址和块内地址我们可以取相同的对应值。
因此,我们只需要知道逻辑块号对应的主存块号是啥(引入页表,由于页表在内存中,为了提高效率,又引入了快表),就可以根据逻辑地址找到对应的物理地址。
逻辑地址到物理地址的变换
答案:B
答案:C
段式虚拟存储器
- 段式虚拟存储器–按照功能模块拆分
段页式虚拟存储器
- 先分段,然后段内分页。
虚拟存储系统
- 每次只是将要用的数据调入内存。
之前的页表是不完整的,下面是完整的。
- 访问位是为了实现页面替换算法。
- 脏位: 如果一个页面在主存中被修改了,我们还需要对应更新辅存的内容。
答案:C
答案:C
TLB(快表)、Page(页表)、Cache 三种缺失的可能组合情况
- TLB是Page的备份。
- Cache是主存的备份,Page缺失意味着要访问的页面不在主存里(逻辑页号没有对应的主存块号,意味着逻辑页不在主存里)。
答案:D
四、指令系统
概述
指令集体系结构 ISA
答案:D
指令的基本格式
- 操作码指出该指令应执行什么操作以及具有何种功能。
- 地址码给出被操作的信息(指令或数据)的地址。
答案:A
根据指令中操作数地址码的数目分类
- 零地址指令
- 一地址指令
- 二、三地址指令
- 四地址指令
按指令字长分类
按操作码的长度分类
通过操作码的位数,确定有多少条指令。
按操作类型分类
答案:D
答案:B,单地址指令是根据地址码个数去划分的,与指令长度无关。
扩展操作码
答案:C
在设计扩展操作码指令格式时,必须注意以下两点:
- 不允许短码是长码的前缀,即短操作码不能与长操作码的前面部分的代码相同。
- 各指令的操作码一定不能重复。
答案:D
答案:A
指令的寻址方式
分类
- 基址寻址: 以程序的起始存放地址作为“起点”,应用于程序的浮动,基址寄存器是面向操作系统的,用户不可改变内容。
- 变址寻址: 程序员自己决定从哪里作为“起点”,应用于数组循环遍历,变址寄存器是面向用户的,可由用户改变。
- 相对寻址: 以程序计数器PC所指地址作为“起点”
答案:D
答案:B
答案:B
寄存器寻址:寄存器放的是操作数。
寄存器间接寻址:寄存器放的是操作数的地址。
答案:C
答案:C
答案:A
答案:A
答案:D,C
答案:D
答案:C
答案:C
答案:D
答案:B
数组首地址作为形式地址固定不变,每次改变偏移量的值。
机器级代码
机器级代码:
- 机器语言:二进制代码
- 汇编语言:助记符
x86CPU有哪些寄存器
常用的x86汇编指令
算数运算指令
AT&T 格式 与 Intel格式对比
转移指令
选择语句(if)的机器级表示
用条件转移指令和loop指令实现循环
函数调用
函数调用指令:call 函数名
函数返回指令:ret
如何访问栈帧
注意:x86栈帧大小默认4B
函数调用时,如何切换栈帧
enter + leave
一个栈帧内可能包含的内容
总结:
CISC(复杂指令集)和RISC(精简指令集)
五、CPU
计算机的工作过程
CPU的组成
1. 运算器:
2. 控制器:
注意: PC里存放的实际上是虚拟地址,经过地址转换,变为物理地址后才会送入MAR。
- PC将要执行的指令的地址通过CPU内部总线传到MAR
- MAR通过外部地址总线,将指令地址传入主存
- 主存将对应地址的指令通过数据总线,传入MDR
- MDR通过内部总线将指令传入IR
- IR将指令的操作码部分传入ID,ID分析操作码,决定产生的操作信号。
CPU内,用户可见和不可见的部分
- 用户可见的寄存器:通用寄存器组、程序状态字寄存器PSW、程序计数器PC
- 用户不可见的寄存器:MAR、MDR、IR、暂存寄存器
答案:B
指令的执行过程
指令周期
- CPU 每取出并执行一条指令所需的全部时间称为指令周期。
- 指令周期常常用若干机器周期来表示,机器周期又叫CPU周期。
- 1个机器周期又包含若于时钟周期(也称为节拍、T周期或CPU时钟周期,它是CPU操作的最基本单位)。
- 下图的取指周期这些,大小为一个机器周期。
- 定长机器周期与不定长机器周期
- 每个 指令周期内机器周期数可以不等,每个机器周期内的节拍数也可以不等。
指令的执行流程
CPU 可以通过触发器的状态,判断当前指令所处阶段。
- 取指周期(FE) 的数据流向
- 间址周期(IND)(将操作数的有效地址从内存中读出来)的数据流向
- 执行周期(EX):不同指令的执行周期操作不同,因此没有统一的数据流向。
- 中断周期(INT):执行完当前指令后,不在顺序执行下面的指令,而是转向去执行其它任务。
答案:A
答案:B
由于指令按字边界对齐存放,且存储字长和指令字长均为4B,因此,每个指令的起始地址都必须是4的整数倍,故合法地址数量为 :232 / 22,即 总地址数量/4。
答案:B
答案:B
使用字地址,意思是按字边界对齐存放。
答案:C
答案:B
答案:B
一台计算机可能有不同长度的指令,其取指操作可能是不同的。
例如,双字指令、三字指令与单字指令的取指操作是不同的。
答案:A
控制器根据在不同阶段(取指、间址…)对内存的访问确定访问的是指令还是数据。
答案:A
注意:无论机器字长是多少,每次取指大小均为一个存储单元。
因为,如果机器字长的长度超过了MDR和IR的位数,那么,按机器字长取指后,压根无法存放这些二进制位。因此,每次取指的大小并不是由机器字长决定的。
指令的执行方案
-
单指令周期(单周期处理器)
对所有指令都选用相同的执行时间来完成。指令之间串行执行。指令周期取决于执行时间最长的指令的执行时间。 -
多指令周期(多周期处理器)
对不同类型的指令选用不同的执行步骤来完成。指令之间串行执行。可选用不同个数的时钟周期来完成不同指令的执行过程。 -
流水线方案(流水线处理器)
在每一个时钟周期启动一条指令,尽量让多条指令同时运行,但各自处在不同的执行步骤中。指令之间并行执行。(在第一阶段启动第一条指令,在第二阶段启动第二条指令,第二条指令可以使用第一条指令在第一阶段使用的资源)
答案:A
数据通路
数据在指令执行过程中所经过的路径,包括路径上的部件,称为数据通路。
单总线数据通路
注意:单周期处理器(CPI=1)不能采用单总线方式,因为单总线将所有寄存器都连接到一条公共总线上,一个时钟内只允许一次操作,无法完成一条指令的所有操作。
专用数据通路
CPU的控制器
硬布线控制器
- 每个指令的执行分为若干阶段,每个阶段包含若干机器周期,每个机器周期包含若干节拍,CU在一个节拍发出一个微命令,完成对应的微操作。
- FE&T1 含义是对于任何一个指令,如果位于取指阶段且是T1节拍,那么发出 M(MAR)——> MDR 这个微操作对应的命令,其它部分含义以此类推。
硬布线控制器的设计
-
1.
-
2.采用定长机器周期。
-
3.重要,要理解!!!
-
4.
微程序控制器
- 程序由指令序列组成,指令也可以看成由微指令序列组成。
- 一个微指令可以有多个不冲突的微命令,一个微命令对应一个微操作。
微程序控制器基本结构
- 一个微程序又可以划分成微程序段,如取指周期微程序段…
- 由于取指周期所有微指令操作相同,因此可以将它看作一个公共微程序段。
- n条机器指令可以至少对应 n+1 个微程序段,因为执行周期各不相同,取指周期为公共周期。
- n条机器指令对应 n 个微程序。
微指令格式:
水平型微指令编码方式:
微指令地址的形成:
微程序控制单元的设计:
硬布线控制器与微程序控制器的比较:
指令流水线
流水线的性能指标
- 吞吐率
- 加速比
- 效率
五段式指令流水线(RISC)
不同指令在五段式指令流水线中的执行流程:
若采用 RISC,则只有 load和store指令可以访存。
- 运算类指令
- LOAD指令
- STORE指令
- 条件转移指令:在M阶段并没有访存,只是安排在这个时间段完成。
- 无条件转移指令:
影响流水线的因素
结构相关
数据相关
答案:C
控制相关
流水线的分类
流水线的多发技术
- 超标量技术
- 超流水技术:例子中,指令几乎可以看成是三条同时启动,并行执行
- 超长指令字
多核处理器的基本概念
注意:
硬件多线程:
六、总线
总线概述
什么是总线?
说白了,就是主板上用光刻机刻的线路。
总线特性
机械特性:尺寸、形状、管脚数、排列顺序
电气特性:传输方向(如地址信息由CPU传向主存)和有效的电平范围
功能特性:每根传输线的功能(地址、数据、控制)
时间特性:信号的时序关系
总线分类
串行总线与并行总线:
片内总线、系统总线、通信总线:
总线的性能指标
答案:B
答案:C
总线操作和定时
总线定时实际上就是让进行数据交换的主设备和从设备协调地进行工作。
答案:B,总线工作频率是指每秒有多少总线周期
答案:C
B:时钟频率不一定等于总线工作频率,也就是时钟周期大小不一定等于总线周期大小,没问题。
七、IO操作
IO系统地基本概念
IO接口
IO端口的编址方式:
IO方式
程序查询方式
中断的作用和原理
多重中断
多重中断需要注意让 保护现场和屏蔽字、回复现场和屏蔽字 是一气呵成的。
中断屏蔽字:就是有多个中断请求时,哪些中断请求应该被屏蔽。
下图一定要理解!
程序中断方式
大体工作流程:
①D接受启动命令然后将字符传送到IO端口。
②IO端口收到字符后申请一次中断。
③中断响应+执行中断服务程序。
④中断服务程序的第十五条指令再次启动D,循环前面的过程,传送剩下的字符,注意:执行完第十五条指令D才被启动。
DMA方式
之前DMA能否访存,有CPU决定,引入三总线结构,可改变这一现状。
主要问题
关于I/O系统你还记得哪些?
1.计组里面着重讲三种I/O控制方式,操作系统里面着重讲I/O软件的处理过程,软硬件究竟是怎么协同工作的呢???
2.不同的I/O控制方式对应不同的设备驱动程序工作流程上到底有什么样的区别呢?
3.设备驱动程序和中断处理程序到底是什么呢?有什么区别呢?是什么关系呢?傻傻分不清楚?
4.什么是设备控制器?用户缓冲区?内核缓冲区?数据究竟是怎么一步一步的输入输出的呢?每一个过程是由什么程序来控制的呢?
5.系统调用在I/O里面起了什么作用呢?中断软件机制和中断硬件是怎么协同工作的呢?
深入理解中断机制-从中断控制器出发
基本思想:
当外设准备好时,便向CPU发中断请求,CPU响应后,中止现行程序的执行,转入一个“中断服务程序”进行输入/出操作,实现主机和外设接口之间的数据传送,并启动外设工作。“中断服务程序”执行完后,返回原被中止的程序断点处继续执行。此时,外设和CPU并行工作。
简而言之:原本的CPU在执行一个进程P,此时外设已经准备好了,于是向CPU发送一个中断请求,于是CPU开始执行中断服务程序,去启动外设,启动成功后,CPU再返回原断点继续执行进程P,此时,CPU与外设平行工作。
理解中断控制器的结构:
中断响应优先级:A>B>C
中断处理优先级:C>B>A
假设CPU在运行A的中断服务程序,此时中断请求寄存器中B、C的中断有效信号有效,CPU能否检测到中断信号是由INTR(中断请求信号寄存器)决定的,而INTR是否有效又是由中断屏蔽寄存器决定的,中断屏蔽寄存器设置的是中断处理优先级,因此,CPU是由能检测到中断信号是由中断处理优先级决定的。
CPU检测到中断信号后,通过判优线路(设置的是中断响应优先级)决定响应那个中断,故,CPU开始执行B的中断服务程序。
然后B执行关中断,当B保存完现场(PC、PSW)和中断屏蔽字后,执行 开中断 后,由于C的中断还没有被处理,并且C的中断处理优先级大于B,于是响应并处理C。
处理完C后,在处理B、A。
例题:
Printf - 从系统调用开始
轮询方式:
注意:代码不重要,重要明白逻辑和流程!
用中断实现:
显然,中断方式实现的 sys_write() 与轮询方式实现的主要区别是:仅仅输出第一个字符,当外设收到字符后,向CPU发出中断请求,由中
断服务程序输出剩余字符。
显然,如果不将字符串提前从用户缓冲区复制到内核缓冲区,执行中断服务程序(进程B)时,就无法访问字符串。
用DMA方式实现:
答案:A、B、B
Scanf
答案:C
答案:
(1)②⑥④③①⑤
(2)②①
(3)③
(4)阻塞态,内核态