用来存放ALU运算结果状态信息的寄存器是
在CPU中有多种专用寄存器,各自承担不同的职责。ALU(算术逻辑单元)是CPU中负责执行算术运算(加、减、乘、除)和逻辑运算(与、或、非、异或)的核心部件。每次ALU完成运算后,除了产生运算结果之外,还会产生一些"状态信息",例如:运算结果是否为零(零标志ZF)、是否产生了进位或借位(进位标志CF)、结果是正还是负(符号标志SF)、是否发生溢出(溢出标志OF)等。这些状态信息需要保存下来,供后续的条件转移指令使用,而保存这些状态信息的寄存器就是标志寄存器(也称为程序状态字寄存器PSW、条件码寄存器或状态寄存器)。
A. 指令寄存器(IR) -- 错误。指令寄存器用来存放当前正在执行的指令。CPU从存储器中取出指令后,将其存放在指令寄存器中进行译码分析,它与ALU运算结果的状态信息无关。
B. 标志寄存器(FLAGS/PSW) -- 正确!标志寄存器专门用来保存ALU运算后产生的各种状态标志位,包括零标志(ZF)、进位标志(CF)、符号标志(SF)、溢出标志(OF)等。这些标志反映了最近一次运算结果的特征,是条件转移指令判断的依据。
C. 通用寄存器 -- 错误。通用寄存器用来存放操作数、中间结果或地址信息等,是程序员可以自由使用的寄存器。虽然ALU的运算结果(数值)会存入通用寄存器,但运算结果的"状态信息"(如是否进位、是否溢出等标志位)不是保存在通用寄存器中的。
D. 程序计数器(PC) -- 错误。程序计数器用来存放下一条将要执行的指令的地址,它的功能是保证程序能够按顺序执行(或在转移时改变执行顺序),与ALU运算结果状态无关。
CPU中几种关键寄存器的功能对比:PC存"下条指令地址",IR存"当前指令内容",通用寄存器存"操作数和运算结果",标志寄存器存"运算结果的状态特征"。记住一句话:标志寄存器是ALU运算的"状态记录员"。
第4章 中央处理器 -- CPU的基本结构与寄存器组
在计算机内部,指令信息采用的表示形式是
计算机是一种电子设备,其内部的所有信息(包括数据和指令)都是通过电信号来表示和处理的。电信号只有两种稳定状态:高电平和低电平,分别对应二进制中的1和0。因此,计算机内部只能识别和处理二进制信息。指令是告诉计算机"做什么"和"怎么做"的命令,在计算机内部同样以二进制序列的形式存储和传输。八进制、十进制和十六进制只是人们为了方便阅读和书写而使用的表示方式,计算机内部并不直接使用这些进制。
A. 二进制序列 -- 正确!计算机内部的一切信息,包括指令和数据,都采用二进制编码表示。这是由计算机的物理特性(电子器件的两种稳定状态:高电平/低电平)决定的。冯·诺依曼体系结构的基本思想之一就是"采用二进制"。
B. 八进制序列 -- 错误。八进制是一种简写形式,常用于某些编程场景中方便人类阅读(每3位二进制对应1位八进制),但计算机内部不以八进制形式存储或处理信息。
C. 十进制序列 -- 错误。十进制是人类日常生活中最常用的计数方式,但计算机内部并不使用十进制。虽然存在BCD码(二进制编码的十进制)等方案,但那本质上仍是用二进制来表示十进制数字。
D. 十六进制序列 -- 错误。十六进制常被程序员用来简写较长的二进制串(每4位二进制对应1位十六进制),但这只是人类的书写习惯,计算机内部仍然使用二进制。
核心结论:计算机内部的一切信息(数据和指令)都以二进制形式表示。原因是计算机由电子器件构成,电子器件只有高电平和低电平两种稳定状态,天然对应二进制的1和0。记住一句话:"计算机内部只认识0和1"。八进制和十六进制只是方便人类书写的"缩写"。
第1章 计算机系统概述 -- 冯·诺依曼体系结构的基本思想
二进制真值为-1101101的8位二进制补码是
补码是计算机中最常用的带符号整数表示方法。在补码表示中,最高位是符号位:0表示正数,1表示负数。对于正数,补码与原码相同;对于负数,补码的求法是:先写出原码(符号位为1,数值位为真值的绝对值),然后符号位不变、数值位按位取反得到反码,最后反码加1得到补码。也可以用一个快捷方法:从右往左找到第一个1(包括这个1),左边的所有数值位取反,符号位保持为1。
A. 1101101 -- 错误。这只有7位,不是8位编码。而且这只是真值的绝对值部分,没有包含符号位信息,也没有进行补码转换。
B. 10010010 -- 错误。让我们验证:真值-1101101的8位原码为11101101(符号位1 + 数值位1101101),反码为10010010(符号位不变,数值位取反)。选项B恰好是反码,而不是补码。补码需要在反码的基础上再加1。
C. 01101101 -- 错误。最高位是0,表示这是一个正数的补码,对应的真值是+1101101。而题目要求的是负数-1101101的补码,符号位应该是1。
D. 10010011 -- 正确!求解步骤如下:(1) 写出8位原码:1_1101101 = 11101101(最高位1是符号位,表示负数);(2) 求反码:符号位1不变,数值位按位取反,得到 10010010;(3) 反码加1得补码:10010010 + 1 = 10010011。所以-1101101的8位补码是10010011。
负数求补码三步法:原码 -> 反码(数值位取反)-> 补码(反码+1)。快捷法:从右往左找到第一个1,这个1及其右边的位不变,左边的数值位全部取反。注意区分反码和补码:反码是取反但不加1,补码是取反后还要加1。本题的B选项就是典型的"忘记加1"的陷阱。
第2章 数据的表示和运算 -- 带符号整数的补码表示
字符C的ASCII码为(1000011)2,采用奇校验方式传送8位编码,首位增加1位奇校验位后的编码是
奇偶校验是一种最基本的数据校验方法,用于检测数据在传输或存储过程中是否出错。其原理是在原始数据位之外额外增加一个校验位(0或1),使得整个编码中"1"的个数满足特定规则。"奇校验"要求整个编码(包括校验位在内)中"1"的总个数为奇数;"偶校验"则要求"1"的总个数为偶数。本题要求在7位ASCII码的首位(最高位)增加1位奇校验位,使8位编码满足奇校验条件。
A. 10000111 -- 错误。后7位是0000111,与字符C的ASCII码1000011不同,数据部分已被改变,不正确。
B. 10000110 -- 错误。后7位是0000110,与字符C的ASCII码1000011不同,数据部分已被改变,不正确。
C. 11000011 -- 错误。后7位是1000011,数据部分正确。校验位为1,整个编码11000011中"1"的个数为:1+1+0+0+0+0+1+1 = 4个,4是偶数,不满足奇校验要求(需要奇数个1)。这个选项适用于偶校验而非奇校验。
D. 01000011 -- 正确!后7位是1000011,正是字符C的ASCII码,数据部分未被改变。校验位为0。验证:整个编码01000011中"1"的个数为:0+1+0+0+0+0+1+1 = 3个,3是奇数,满足奇校验要求。计算过程:字符C的ASCII码1000011中有3个"1",3已经是奇数,因此奇校验位应为0,在首位加0后得到01000011。
奇校验做题步骤:(1) 先数原始数据中有几个1;(2) 如果1的个数已经是奇数,校验位填0(不需要再增加1的个数);如果1的个数是偶数,校验位填1(增加一个1使总数变为奇数)。与偶校验恰好相反。做题时首先要确认数据位不能被改变,排除数据部分与原始ASCII码不同的选项。
第2章 数据的表示和运算 -- 校验码(奇偶校验)
采用寄存器寻址方式的操作数存放在
寻址方式是指CPU如何找到指令中所需操作数的方法。不同的寻址方式,操作数存放的位置不同。寄存器寻址方式(也叫寄存器直接寻址)是指:指令中给出的是一个寄存器编号,操作数就存放在该寄存器中。CPU通过寄存器编号直接从对应的通用寄存器中取出操作数。由于寄存器位于CPU内部,访问速度极快,因此寄存器寻址是执行速度最快的一种寻址方式。
A. 通用寄存器中 -- 正确!寄存器寻址方式的操作数存放在CPU的通用寄存器中。指令中的地址码字段给出寄存器编号,CPU根据编号直接从寄存器中取出操作数。这种方式不需要访问主存,速度最快。
B. 主存中 -- 错误。操作数在主存中的寻址方式包括直接寻址、间接寻址、基址寻址、变址寻址等,不是寄存器寻址。寄存器寻址的核心特点就是操作数不在主存中,而在寄存器中。
C. cache中 -- 错误。cache(高速缓存)是介于CPU和主存之间的高速小容量存储器,它对程序员是透明的(即程序员感知不到它的存在)。寻址方式中没有专门针对cache的寻址方式,cache的使用是由硬件自动管理的。
D. 指令中 -- 错误。操作数直接包含在指令中的寻址方式叫做"立即寻址"或"立即数寻址",而不是寄存器寻址。立即寻址方式下,指令的地址码字段直接给出操作数本身,而不是操作数的地址或寄存器编号。
四种常考寻址方式中操作数的位置:立即寻址 -- 操作数在指令中;寄存器寻址 -- 操作数在寄存器中;直接寻址 -- 操作数在主存中(指令给出主存地址);间接寻址 -- 操作数在主存中(指令给出的地址指向的单元中存放的是操作数的真正地址)。记住"寄存器寻址 = 操作数在寄存器里"这个最直接的对应关系。
第3章 指令系统 -- 寻址方式(寄存器寻址)
属于直接存取存储器的是
存储器按照数据存取方式(即如何定位和访问数据)可以分为以下几类:(1) 随机存取存储器(RAM):可以随机访问任意存储单元,每个单元的访问时间相同,典型代表是主存(内存)。(2) 顺序存取存储器(SAM):只能按照数据记录的先后顺序依次存取,要读某个数据必须从头开始按顺序查找,典型代表是磁带。(3) 直接存取存储器(DAM):介于随机存取和顺序存取之间。它的工作方式是先将读写头直接移动到目标数据所在的区域(如磁道或扇区),然后在该区域内顺序查找目标数据。典型代表是磁盘(包括硬盘)。
A. 主存 -- 错误。主存(内存)属于随机存取存储器(RAM),可以直接通过地址随机访问任意存储单元,每个单元的存取时间相同,不属于直接存取存储器。
B. 硬盘 -- 正确!硬盘是典型的直接存取存储器(DAM)。访问硬盘上的数据时,磁头先快速移动到目标磁道(寻道),然后等待目标扇区旋转到磁头下方(旋转等待),最后顺序读取数据。这种"先直接定位到大致区域,再在区域内顺序查找"的方式就是直接存取。
C. 磁带 -- 错误。磁带属于顺序存取存储器(SAM)。磁带上的数据是线性排列的,要访问某个数据必须从当前位置开始沿磁带顺序移动直到找到目标位置,不能像磁盘那样直接定位到某个区域。
D. 光盘 -- 错误。虽然光盘的物理结构与磁盘有相似之处,但在本课程的经典分类中,光盘通常不归入直接存取存储器这一类。在自考教材中,硬盘(磁盘)是直接存取存储器的典型代表。
三种存取方式的典型代表要牢记:随机存取 -- 主存(RAM);顺序存取 -- 磁带;直接存取 -- 磁盘(硬盘)。可以类比理解:随机存取像翻书(直接翻到任意页),顺序存取像听录音带(必须从头快进到目标位置),直接存取像听唱片(先把唱针移到大致位置,再微调找到目标曲目)。
第5章 存储器层次结构 -- 存储器的分类(按存取方式分类)
一个64KB的主存储器,按字节编址,需要地址线的条数至少是
地址线的条数决定了CPU能够寻址的存储单元数量。如果有n条地址线,则最多能寻址2n个存储单元。反过来说,如果存储器有M个存储单元需要编址,则至少需要n条地址线,其中2n ≥ M,即n ≥ log2M。本题中存储器容量为64KB,按字节编址意味着每个字节有一个唯一的地址,因此需要为64KB个字节分别编址。
A. 6 -- 错误。6条地址线只能寻址26 = 64个存储单元,远小于64KB = 65536个存储单元。6条地址线对应的容量只有64B(字节),不是64KB。注意区分B(字节)和KB(千字节):1KB = 1024B。
B. 10 -- 错误。10条地址线能寻址210 = 1024 = 1K个存储单元,即1KB,远小于64KB。
C. 16 -- 正确!计算过程:64KB = 64 × 1024B = 65536B = 216B。按字节编址,需要为216个字节编址,因此至少需要16条地址线。验证:216 = 65536,恰好等于64K,完全对应。
D. 20 -- 错误。20条地址线能寻址220 = 1M个存储单元,即1MB。虽然20条线也能覆盖64KB的寻址需求,但题目问的是"至少"需要多少条,16条就已经足够了。
关键公式:地址线条数n = log2(存储单元总数)。常用对应关系要熟记:210 = 1K,216 = 64K,220 = 1M,230 = 1G。做题技巧:先将容量统一换算为存储单元数(按字节编址则换算为字节数),再求其以2为底的对数即为所需地址线条数。64K = 26 × 210 = 216,所以需要16条。
第5章 存储器层次结构 -- 主存储器的基本组成与地址线
在DMA控制方式下,实现主存和高速外设之间的直接数据交换时,总线控制权归
DMA(Direct Memory Access,直接存储器存取)是一种高效的I/O控制方式,允许外设与主存之间直接交换数据,而不需要CPU逐字节参与传输。DMA的核心思想是:在数据传输期间,由DMA控制器(DMAC)接管系统总线的控制权,代替CPU来控制数据在主存和外设之间的传输。CPU在此期间可以去做其他事情,从而大大提高了系统效率。DMA方式特别适用于高速外设(如磁盘)的大批量数据传输场景。
A. CPU掌控 -- 错误。在DMA传输期间,CPU会暂时让出总线控制权给DMA控制器。如果总线仍由CPU掌控,那就是程序直接控制方式或中断方式,而不是DMA方式。DMA方式的一个显著特点就是CPU不参与数据的逐字传输。
B. 主存掌控 -- 错误。主存(内存)是被动的存储部件,它只负责根据地址读写数据,不具备控制总线的能力。主存不是总线主设备。
C. 程序员掌控 -- 错误。程序员编写程序来配置DMA控制器的工作参数(如传输起始地址、数据长度等),但实际的数据传输过程是由DMA控制器硬件自动完成的,程序员无法在传输过程中逐步控制总线。
D. DMA控制器掌控 -- 正确!在DMA数据传输期间,DMA控制器向CPU申请并获得总线使用权(通过总线请求/总线授权信号),然后由DMA控制器作为总线主设备,直接控制主存与外设之间的数据传输。传输完成后,DMA控制器释放总线控制权,归还给CPU。
DMA方式的三个关键特征:(1) DMA控制器掌握总线控制权;(2) 数据直接在主存和外设之间传输,不经过CPU;(3) CPU在DMA传输期间可以做其他工作。记住DMA的全称 "Direct Memory Access"(直接存储器存取),突出"直接"二字 -- 外设直接访问存储器,而非通过CPU间接访问。
第6章 互连及输入输出组织 -- DMA方式
MIPS计算机的汇编指令"ADD $s1, $s2, $s3"实现的功能是
MIPS是一种经典的RISC(精简指令集)架构处理器,在计算机组成原理课程中被广泛用作教学案例。MIPS的算术运算指令采用三操作数格式,基本语法为:操作码 目的寄存器, 源寄存器1, 源寄存器2。其含义是:将源寄存器1和源寄存器2中的数据进行运算,结果存入目的寄存器。也就是说,第一个寄存器是存放结果的目的地,后两个寄存器是提供操作数的来源。
A. $s2=$s1+$s3 -- 错误。这个选项将$s2作为目的寄存器,但在MIPS汇编语法中,第一个操作数$s1才是目的寄存器,不是$s2。
B. $s1=$s2+$s3 -- 正确!按照MIPS的三操作数指令格式 ADD rd, rs, rt,第一个操作数$s1是目的寄存器(rd),第二个操作数$s2是源寄存器1(rs),第三个操作数$s3是源寄存器2(rt)。功能是将$s2和$s3的值相加,结果存入$s1。
C. $s3=$s1 & $s2 -- 错误。这是逻辑"与"运算(AND),而非加法运算(ADD)。而且目的寄存器也写错了,应该是第一个操作数$s1才是目的寄存器。
D. $s3=$s1+$s2 -- 错误。这个选项虽然是加法运算,但将$s3作为目的寄存器,将$s1和$s2作为源寄存器,与MIPS指令中操作数的排列顺序不符。在MIPS中,目的寄存器在第一个位置,不是最后一个。
MIPS三操作数指令的格式口诀:"结果在前,操作在后"。即 ADD $dest, $src1, $src2 表示 $dest = $src1 + $src2。第一个寄存器是存放结果的目的寄存器,后面两个是参与运算的源寄存器。这与数学表达式 "a = b + c" 的写法一致(结果a在等号左边/前面)。
第3章 指令系统 -- MIPS指令格式与汇编指令
单地址指令
指令按照地址码的个数可以分为零地址指令、单地址指令(一地址指令)、双地址指令、三地址指令等。单地址指令是指指令中只包含一个显式的地址码。但"只有一个地址码"并不意味着"只能处理一个操作数"。单地址指令有两种使用情况:(1) 处理单操作数:如取反(NOT)、自增(INC)、自减(DEC)等运算,只需要一个操作数。指令格式为 OP A,表示对地址A中的操作数执行OP操作。(2) 处理双操作数:如加法、减法等需要两个操作数的运算。此时指令中只给出一个操作数的地址,另一个操作数隐含在某个默认位置(通常是累加器ACC)。指令格式为 OP A,隐含含义为 ACC = ACC OP (A),即累加器中的值与地址A中的值进行运算,结果存回累加器。
A. 只能对单操作数进行加工处理 -- 错误。单地址指令不仅能处理单操作数运算,还能通过隐含约定(如累加器)处理双操作数运算,所以"只能"这个限定词使选项错误。
B. 只能对双操作数进行加工处理 -- 错误。单地址指令也能用于单操作数运算(如取反、自增等),所以"只能对双操作数"这个说法不正确。
C. 既能对单操作数,也能对双操作数进行加工处理 -- 正确!单地址指令既可以用于单操作数运算(如 NOT A、INC A),也可以通过隐含约定累加器来实现双操作数运算(如 ADD A,隐含含义为 ACC = ACC + (A))。因此它的功能是双重的。
D. 不能对双操作数进行加工处理 -- 错误。如上所述,单地址指令可以通过隐含使用累加器来处理双操作数运算,因此这个说法是错误的。
单地址指令的"双重身份":(1) 作为单操作数指令:OP A,如 NOT A(对A取反);(2) 作为双操作数指令:OP A,隐含含义为 ACC = ACC OP (A),另一个操作数隐含在累加器中。关键理解:地址码的个数不等于操作数的个数,因为可以有隐含操作数。
第3章 指令系统 -- 指令格式(按地址码数目分类)
串行接口指接口与系统总线之间、接口与外设之间采用的传送方式分别是
在计算机系统中,数据传送有两种基本方式:并行传送和串行传送。并行传送是指多位数据通过多条线路同时传输(例如8条线同时传8位数据),速度快但线路多、成本高、适合短距离。串行传送是指数据一位一位地通过一条线路顺序传输,速度较慢但线路少、成本低、适合长距离。I/O接口是连接CPU(通过系统总线)和外设的桥梁。串行接口之所以叫"串行",是因为它与外设之间采用串行方式传送数据。但在接口的内侧(与系统总线连接的一侧),由于系统总线本身就是并行总线(数据总线有多条线),所以接口与系统总线之间的数据传送是并行的。
A. 串行、串行 -- 错误。接口与系统总线之间不是串行传送。系统总线(特别是数据总线)是并行总线,具有多条数据线,因此接口与系统总线之间必然采用并行传送方式。
B. 串行、并行 -- 错误。这恰好把两个方向的传送方式说反了。串行接口与外设之间是串行传送(这是它被称为"串行接口"的原因),而不是并行传送。
C. 并行、串行 -- 正确!串行接口的内侧(与系统总线连接)采用并行传送,外侧(与外设连接)采用串行传送。串行接口的一个重要功能就是在内部完成"并行 ↔ 串行"的数据格式转换(并串转换/串并转换)。
D. 并行、并行 -- 错误。如果接口与外设之间也是并行传送,那就是并行接口而非串行接口了。串行接口的定义特征就是与外设之间采用串行方式传送数据。
串行接口的命名依据是接口与外设之间的传送方式。记忆口诀:"串行接口 -- 内并外串"(内侧连总线用并行,外侧连外设用串行)。串行接口的核心功能之一就是完成并串转换:从总线接收并行数据后转为串行发送给外设,从外设接收串行数据后转为并行送上总线。与之对应,并行接口则是"内并外并"(两侧都是并行)。
第6章 互连及输入输出组织 -- I/O接口(串行接口与并行接口)
设置中断屏蔽字的作用是
中断是计算机处理异步事件的重要机制。当多个外设同时或先后向CPU发出中断请求时,需要有一种机制来确定哪些中断应该被优先处理、哪些中断可以暂时忽略。中断屏蔽字(也称中断屏蔽寄存器)就是实现这一功能的硬件机制。每个中断源对应屏蔽字中的一位:如果某位为1(被屏蔽),则CPU暂时不响应对应的中断请求;如果某位为0(未屏蔽),则CPU可以正常响应对应的中断。通过设置不同的屏蔽字,可以有选择性地屏蔽某些中断,而允许其他中断正常响应,从而实现多重中断(中断嵌套)的优先级控制。
A. 暂停外设对主存的访问 -- 错误。中断屏蔽字与外设访问主存无关。外设对主存的访问控制主要涉及DMA方式,与中断屏蔽机制是不同的概念。
B. 暂停CPU对主存的访问 -- 错误。中断屏蔽字不影响CPU对主存的正常访问。CPU的存储器访问由地址总线和控制信号决定,与中断屏蔽无关。
C. 暂停CPU对某些中断的响应 -- 正确!中断屏蔽字的作用正是有选择性地屏蔽某些中断源的请求,使CPU暂时不响应被屏蔽的中断,同时仍然能响应未被屏蔽的中断。注意关键词"某些" -- 屏蔽是有选择性的,不是全部屏蔽。
D. 暂停CPU对一切中断的响应 -- 错误。中断屏蔽字是按位设置的,可以只屏蔽部分中断,而不是一刀切地屏蔽所有中断。如果要暂停对一切中断的响应,通常是通过关中断(清除中断允许位/中断使能位)来实现,而不是通过中断屏蔽字。中断屏蔽字的优势恰恰在于它的选择性。
中断屏蔽字 = "选择性地屏蔽某些中断"。关键区分两个概念:(1) 关中断(清除中断使能位)-- 屏蔽一切中断;(2) 设置中断屏蔽字 -- 只屏蔽某些特定中断。中断屏蔽字的典型应用场景:在多重中断(中断嵌套)中,高优先级的中断服务程序通过设置屏蔽字来屏蔽低优先级中断,但允许更高优先级的中断打断自己。
第6章 互连及输入输出组织 -- 中断系统(中断屏蔽与多重中断)
磁盘接口应用
I/O控制方式有多种,按照CPU参与程度从高到低依次为:(1) 程序直接控制方式(程序查询方式):CPU全程参与数据传输,效率最低,适合简单、低速外设。(2) 中断方式:CPU在外设就绪时通过中断参与传输,效率有所提高,适合中速外设(如打印机、键盘)。(3) DMA方式:由DMA控制器接管总线控制权,外设与主存直接交换数据,CPU不逐字参与,效率高,适合高速、大批量数据传输的外设。(4) 通道方式/I/O处理器方式:更高级的自动化控制。磁盘是典型的高速外设,数据传输速率高,且每次传输的数据量大(以扇区/块为单位),因此需要使用DMA方式来保证传输效率。
A. 程序直接控制传送接口 -- 错误。程序直接控制方式要求CPU全程等待外设就绪并逐字传输数据,CPU利用率极低。磁盘是高速外设,数据传输速率很高,如果用程序直接控制方式,CPU会被完全占用,系统效率极差,完全不适合。
B. 中断接口 -- 错误。中断方式虽然比程序直接控制方式效率高,但每传输一个字(或字节)就需要中断一次CPU。磁盘的传输速率很高,如果每传一个字节都中断一次,CPU会被频繁打断,中断开销巨大,无法满足磁盘的高速传输需求。
C. DMA接口 -- 正确!磁盘是典型的高速块设备,每次传输以扇区(通常512字节或更多)为单位,数据量大、速度快。DMA方式允许磁盘通过DMA控制器直接与主存交换数据,CPU只需在传输开始前设置参数、传输结束后处理中断即可,传输过程中CPU可以执行其他任务。这是磁盘接口的标准配置。
D. 既可选用中断接口,又可选用DMA接口 -- 错误。虽然从理论上中断方式也能实现数据传输,但由于磁盘的高速特性和大数据量特征,中断方式的频繁中断开销使其在实际应用中不适合磁盘。教材明确将磁盘归类为使用DMA接口的典型外设。
不同速度的外设对应不同的I/O控制方式:低速设备(如开关、LED)-- 程序直接控制;中速设备(如打印机、键盘)-- 中断方式;高速设备(如磁盘)-- DMA方式。记住"磁盘 = DMA"这一经典对应关系。DMA方式的优势:大批量数据传输时CPU不必逐字参与,效率远高于中断方式。
第6章 互连及输入输出组织 -- I/O控制方式(DMA方式的应用场景)
在计算机的存储器层次结构中,属于外部存储器的是
计算机的存储器按照其在层次结构中的位置,从上到下(从快到慢、从小到大、从贵到便宜)依次为:CPU内寄存器 → 高速缓存(Cache)→ 主存储器(内存)→ 外部存储器(辅助存储器/辅存)。其中,寄存器、Cache和主存属于内部存储器(内存系统),它们直接与CPU交互,CPU可以直接访问其中的数据。外部存储器(也叫辅助存储器、辅存或外存)不直接与CPU交互,CPU不能直接访问外存中的数据 -- 外存中的数据必须先调入主存,CPU才能使用。外存的主要作用是长期保存大量数据和程序。
A. 硬盘 -- 正确!硬盘是典型的外部存储器(辅助存储器)。它容量大、价格相对低廉、断电后数据不丢失(非易失性),用于长期存储操作系统、应用程序和用户数据。CPU不能直接访问硬盘中的数据,必须先将数据从硬盘读入主存才能处理。
B. 高速缓存(Cache) -- 错误。Cache位于CPU和主存之间,属于内部存储器。它的速度接近CPU,容量很小,用于缓存主存中最近被频繁访问的数据,以减少CPU访问主存的等待时间。Cache对程序员是透明的,由硬件自动管理。
C. 主存 -- 错误。主存(内存,通常指RAM)属于内部存储器,CPU可以直接访问。它是程序运行时存放代码和数据的主要场所。主存速度比Cache慢,但比外存快得多。
D. CPU内寄存器 -- 错误。寄存器位于CPU内部,是存储层次结构中速度最快、容量最小的存储部件,属于内部存储器。寄存器直接参与CPU的运算和控制。
存储器层次结构从上到下:寄存器 > Cache > 主存 > 外存(硬盘/磁盘/光盘/磁带)。判断标准:"CPU能否直接访问" -- 能直接访问的(寄存器、Cache、主存)是内存系统;不能直接访问、需要先调入主存的(硬盘等)是外存。记住"硬盘 = 外存"这一基本分类。
第5章 存储器层次结构 -- 存储器的层次结构与分类
在采用微程序控制器的计算机中,微程序存放在
CPU的控制器有两种主要实现方式:硬布线控制器和微程序控制器。微程序控制器的核心思想是用"微程序"来实现指令的功能。每条机器指令的执行过程被分解为一系列微操作,这些微操作按顺序排列构成微程序。微程序由微指令组成,每条微指令包含若干微命令(控制信号)。所有的微程序预先编写好,存放在一个专用的只读存储器中,这个存储器叫做控制存储器(Control Memory,简称CM或CS)。控制存储器是微程序控制器的核心部件,它位于CPU内部,通常使用ROM(只读存储器)实现,因为微程序在计算机出厂时就已固化,运行过程中不需要修改。
A. 堆栈中 -- 错误。堆栈(栈)是主存中的一块特殊区域,用于保存子程序返回地址、局部变量、中断现场等临时数据。堆栈中的内容是动态变化的,而微程序是固定不变的控制信息,不适合存放在堆栈中。
B. CPU中 -- 正确!微程序存放在CPU内部的控制存储器(CM)中。控制存储器是微程序控制器的专用存储部件,使用ROM实现,位于CPU芯片内部。当CPU执行某条机器指令时,控制器根据指令的操作码从控制存储器中找到对应的微程序,然后逐条读出微指令来产生控制信号,驱动CPU各部件完成操作。
C. 主存中 -- 错误。主存(内存)存放的是用户程序和数据,以及操作系统代码等。微程序不在主存中,而在CPU内部的控制存储器中。注意区分:主存中存放的是"机器指令"组成的程序,而控制存储器中存放的是"微指令"组成的微程序 -- 两者是不同层次的概念。
D. 磁盘中 -- 错误。磁盘是外部存储器,用于长期保存文件和数据。微程序需要被CPU实时快速访问(每个时钟周期都可能需要读取微指令),磁盘的访问速度远远无法满足这一要求。微程序必须存放在CPU内部的高速存储器中。
微程序控制器中的存储层次要区分清楚:微程序存放在CPU内部的控制存储器(CM)中,控制存储器用ROM实现。记忆对比:主存存放"机器程序"(由机器指令组成),控制存储器存放"微程序"(由微指令组成)。还要注意"控制存储器"和"主存储器"是两个不同的存储器 -- 控制存储器在CPU内部,主存储器在CPU外部。
第4章 中央处理器 -- 微程序控制器(控制存储器与微程序)
按照在计算机上完成任务的不同,可以把使用计算机的用户分成最终用户、系统管理员、______和______四类。
计算机系统的用户可以按照他们使用计算机的方式和所完成任务的层次进行分类。不同类型的用户与计算机系统的交互层次不同:有的用户只使用现成的应用软件,有的用户则需要深入到操作系统甚至硬件层面进行工作。理解用户分类有助于理解计算机系统的层次结构,即从硬件到系统软件再到应用软件,最终服务于不同需求的用户。
教材将计算机用户分为以下四类:
1. 最终用户(End User):最终用户是最普通的计算机使用者。他们不需要编写程序,只需要使用已有的应用软件来完成自己的工作。例如,用Word写文档、用Excel做表格、用浏览器上网的人都属于最终用户。他们不需要了解计算机的内部原理。
2. 系统管理员(System Administrator):系统管理员负责管理和维护计算机系统的正常运行。他们的工作包括安装操作系统、配置网络、管理用户账户、备份数据、保障系统安全等。系统管理员需要熟悉操作系统的管理和配置,但通常不需要编写底层程序。
3. 应用程序员(Application Programmer):应用程序员使用高级编程语言(如Java、Python、C++等)编写应用程序,供最终用户使用。他们通过调用操作系统提供的接口(API)来开发各种应用软件,如办公软件、游戏、网页应用等。应用程序员工作在高级语言层面,通常不需要直接操作硬件。
4. 系统程序员(System Programmer):系统程序员负责编写系统级软件,包括操作系统、编译器、驱动程序、数据库管理系统等。他们需要深入了解计算机硬件的工作原理,经常使用汇编语言甚至直接与硬件打交道。系统程序员的工作是为应用程序员和最终用户提供基础平台。
这四类用户从上到下构成了一个层次关系:最终用户处于最高层,只接触应用界面;系统管理员管理系统运行环境;应用程序员开发应用软件;系统程序员则工作在最底层,与硬件最为接近。
四类用户按照与硬件的距离从远到近排列为:最终用户 -- 系统管理员 -- 应用程序员 -- 系统程序员。可以用口诀记忆:"终管应系"(终端用户、管理员、应用程序员、系统程序员)。题目已给出"最终用户"和"系统管理员",需要填写的是两类程序员:应用程序员和系统程序员。
第1章 计算机系统概述 -- 计算机系统的用户分类相关内容
表示一个数值数据要确定三个要素,分别是______、______和编码规则。
计算机内部所有信息都以二进制形式存储和处理。要在计算机中正确地表示一个数值数据(如整数、小数),必须事先约定好一套完整的规则,否则同样一串0和1可能被解释为完全不同的数值。这套规则由三个要素共同决定,缺一不可。
表示一个数值数据需要确定的三个要素分别是:
1. 进位记数制(Number System):进位记数制决定了数据用什么"进制"来表示。我们日常生活中使用十进制(逢十进一),而计算机内部使用二进制(逢二进一)。此外还有八进制和十六进制等。进位记数制的核心概念包括基数(每一位上允许使用的数字个数,如二进制的基数为2)和位权(每一位所代表的权值,如二进制中从右到左依次是2的0次方、1次方、2次方......)。选择不同的进位记数制,同一个数的表示形式完全不同,例如十进制的10在二进制中表示为1010。
2. 定/浮点表示(Fixed-point / Floating-point Representation):确定了进制之后,还需要确定小数点的位置如何处理。定点表示是指小数点的位置固定不变,分为定点整数(小数点固定在最低位之后)和定点小数(小数点固定在最高有效位之前)。浮点表示则是小数点的位置可以"浮动",类似于科学计数法,一个浮点数由阶码(指数部分)和尾数(有效数字部分)组成,这样可以表示范围很大或很小的数。例如,IEEE 754标准就是一种广泛使用的浮点数表示格式。
3. 编码规则(Encoding Rules):确定了进制和定/浮点表示后,还需要规定具体的编码方式。例如,对于有符号整数,可以使用原码、反码或补码来编码;对于浮点数,需要规定阶码和尾数各占多少位、阶码用什么方式表示(如移码)等。编码规则决定了数值到二进制串的具体映射关系。
简而言之:进位记数制解决"用几进制"的问题;定/浮点表示解决"小数点放哪里"的问题;编码规则解决"正负号和具体位模式如何安排"的问题。三者共同确定后,一个数值数据才能被唯一、无歧义地表示。
数值数据表示三要素可概括为:"进制、点位、编码"。即:用什么进制?小数点定还是浮?怎么编码?题目已给出"编码规则",需要填写的是前两个要素:进位记数制和定/浮点表示。
第2章 数据的表示和运算 -- 数值数据的表示三要素相关内容
Intel将内部异常分为故障、______和______三类。
在计算机运行过程中,CPU可能会遇到各种异常情况,需要暂停当前正在执行的程序,转去处理这些异常事件。异常(Exception)是指CPU在执行指令的过程中,由CPU内部检测到的意外事件。与中断(由外部设备发起)不同,异常是由CPU内部产生的。Intel处理器对内部异常进行了明确的分类,不同类别的异常在处理方式和严重程度上有显著区别。
Intel处理器将内部异常分为以下三类:
1. 故障(Fault):故障是一种可以被修复的异常。当故障发生时,CPU会在引起故障的那条指令执行之前就检测到问题,并暂停执行转去处理故障。关键特点是:故障处理完成后,CPU会返回到引起故障的那条指令重新执行。典型例子是"缺页故障"(Page Fault):当程序访问的数据不在内存中时,CPU产生缺页故障,操作系统将所需的页面从硬盘调入内存,然后CPU回到引起缺页的那条指令重新执行,这次就能正常访问了。
2. 陷阱(Trap):陷阱是一种预期的、有意安排的异常。当陷阱发生时,CPU在引起陷阱的那条指令执行完毕之后才转去处理。处理完成后,CPU返回到陷阱指令的下一条指令继续执行(而不是重新执行引起陷阱的指令)。典型例子是调试断点(Breakpoint)和系统调用(通过INT指令触发的软中断)。陷阱通常不是错误,而是程序主动触发的。
3. 终止(Abort):终止是最严重的异常类型,表示发生了不可恢复的致命错误。当终止发生时,CPU无法确定引起异常的具体指令位置,也无法恢复被中断程序的执行。典型例子包括硬件故障(如内存校验错误)、系统表中出现非法值等。终止发生后,操作系统通常会强制结束出错的进程。
三者的核心区别在于:故障可修复且回到原指令重试;陷阱是正常行为且继续执行下一条指令;终止是致命错误且无法恢复。
Intel内部异常三分类:"故陷终"(故障、陷阱、终止),严重程度依次递增。可以这样联想记忆:程序遇到"故障"还能修好继续跑;掉进"陷阱"是自己挖的坑(有意为之);走到"终止"就彻底完了。题目已给出"故障",需要填写"陷阱"和"终止"。
第4章 中央处理器 -- 异常和中断的分类相关内容
cache行与主存块之间的映射方式有______、______和组相联映射三种方式。
Cache(高速缓冲存储器)是位于CPU和主存之间的高速小容量存储器,用于缓解CPU与主存之间速度差距过大的矛盾。Cache的容量远小于主存,因此主存中的数据只能部分地存放在Cache中。这就需要一套规则来确定主存中的某个数据块可以放到Cache的哪个位置,这套规则就是"映射方式"。Cache被划分为若干"行"(Cache Line),主存被划分为若干"块"(Block),映射方式就是规定主存块与Cache行之间的对应关系。
Cache与主存之间的三种映射方式如下:
1. 直接映射(Direct Mapping):每个主存块只能映射到Cache中唯一固定的一行。映射关系为:Cache行号 = 主存块号 mod Cache总行数。例如,如果Cache有8行,那么主存的第0块、第8块、第16块......都只能放到Cache的第0行。这种方式的优点是硬件实现简单、查找速度快,因为只需要检查一个位置;缺点是灵活性差,如果多个常用的主存块恰好映射到同一Cache行,就会频繁发生替换(称为"冲突失效"),即使Cache其他行是空闲的也无法利用。
2. 全相联映射(Fully Associative Mapping):每个主存块可以映射到Cache中的任意一行,没有任何限制。这种方式的优点是灵活性最高、Cache利用率最好、冲突失效最少;缺点是查找时需要将主存块的标记与Cache中所有行的标记逐一比较,硬件实现复杂,需要使用相联存储器(CAM,按内容寻址的存储器)进行并行比较,成本较高。
3. 组相联映射(Set Associative Mapping):这是前两种方式的折中方案。将Cache分为若干"组",每组包含若干行。主存块首先按照直接映射的方式确定映射到哪一组(组号 = 主存块号 mod Cache组数),然后在该组内可以放到任意一行(组内采用全相联)。如果每组有n行,就称为n路组相联映射。例如,2路组相联表示每组有2行。组相联映射兼具直接映射查找快和全相联映射灵活的优点,是实际中最常用的映射方式。
三者的关系可以这样理解:直接映射是"1路组相联"(每组只有1行);全相联映射是"极端的组相联"(整个Cache只有1组);组相联映射则是二者之间的过渡形态。
三种映射方式:"直、全、组"(直接映射、全相联映射、组相联映射)。按灵活性从低到高排列:直接映射(最死板,一对一)-- 组相联映射(折中)-- 全相联映射(最灵活,任意放)。题目已给出"组相联映射",需要填写"直接映射"和"全相联映射"。
第5章 存储器层次结构 -- Cache的映射方式相关内容
I/O数据传送控制方式主要有程序直接控制、______和______三种方式。
计算机在工作时,CPU需要与各种外部设备(如键盘、鼠标、硬盘、显示器等)进行数据交换,这个过程称为I/O(输入/输出)数据传送。由于外部设备的速度远远慢于CPU,如何高效地组织CPU与外设之间的数据传送,是计算机系统设计中的一个重要问题。不同的I/O控制方式代表了不同的技术发展阶段,CPU参与的程度逐渐降低,系统效率逐渐提高。
I/O数据传送的三种主要控制方式如下:
1. 程序直接控制(Programmed I/O):这是最简单也是最原始的I/O控制方式。CPU通过执行程序中的I/O指令直接控制数据传送的全过程。在等待外设完成操作期间,CPU需要不断地轮询(反复查询)外设的状态,检查外设是否准备好。这种方式也称为"程序查询方式"或"忙等待方式"。优点是硬件简单、实现容易;缺点是CPU在等待外设时完全被占用,不能做其他工作,CPU利用率极低。例如,CPU要从键盘读入一个字符,就必须反复查询键盘是否有按键按下,在此期间CPU什么其他事都做不了。
2. 中断控制(Interrupt-driven I/O):为了解决程序直接控制方式中CPU忙等待的问题,引入了中断机制。CPU向外设发出I/O命令后,不再忙等待,而是转去执行其他程序。当外设完成数据准备后,通过中断请求信号通知CPU。CPU收到中断信号后,暂停当前程序,转去执行中断服务程序来完成数据传送,传送完毕后再返回被中断的程序继续执行。优点是CPU不必忙等待,可以在外设工作期间处理其他任务,大大提高了CPU利用率;缺点是数据传送仍然需要CPU通过执行中断服务程序来逐字(或逐字节)完成,每传送一个数据都要进入一次中断,对于大批量数据传送效率仍然不够高。
3. DMA控制(Direct Memory Access,直接存储器访问):为了进一步减轻CPU的负担,引入了DMA控制器(DMAC)这一专用硬件。在DMA方式下,数据在外设与主存之间的传送由DMA控制器直接管理,不需要CPU的干预。CPU只需要在传送开始前对DMA控制器进行初始化(设置传送的起始地址、数据长度、传送方向等),然后就可以去做其他工作。DMA控制器自动完成数据的逐字传送,传送全部完成后才通过中断通知CPU。优点是大批量数据传送效率非常高,CPU基本不参与传送过程;缺点是需要额外的DMA控制器硬件,增加了系统成本和复杂度。
三种方式的演进体现了一个核心思想:让CPU尽可能少地参与I/O数据传送,把CPU从繁琐的数据搬运工作中解放出来,专注于计算任务。
三种I/O控制方式按CPU参与程度从高到低排列:"程中D"(程序直接控制、中断控制、DMA控制)。CPU参与度依次降低,系统效率依次提高。可以这样记忆:程序直接控制是"CPU亲自搬运并站着等";中断控制是"CPU先去忙别的,外设喊一声再来搬";DMA是"雇了个搬运工(DMA控制器),CPU完全不用动手"。题目已给出"程序直接控制",需要填写"中断控制"和"DMA控制"。
第6章 互连及输入输出组织 -- I/O数据传送控制方式相关内容
简述冯·诺依曼结构计算机的基本思想。(7分)
冯·诺依曼结构计算机的基本思想主要包括以下几个方面:
(1)采用"存储程序"工作方式;
(2)计算机由运算器、控制器、存储器、输入设备和输出设备五个基本部件组成;
(3)存储器不仅能存放数据,而且也能存放指令;
(4)计算机内部以二进制形式表示指令和数据。
在计算机诞生的早期(1940年代),每台机器只能完成固定的计算任务。如果想让它做不同的事情,就需要重新连接电路,非常麻烦。1945年,数学家冯·诺依曼(John von Neumann)提出了一个革命性的想法:把"要做什么事"的步骤(即程序)也像数据一样存进存储器里,让计算机自己按顺序读出来执行。这就是"存储程序"思想,它是现代所有通用计算机的设计基础。
可以用一个比喻来理解:想象一个自动化工厂。以前,要改变生产流程就得重新布置车间。冯·诺依曼的想法相当于——把"工艺流程单"(程序)和"原材料"(数据)都放在同一个仓库(存储器)里,工人(控制器)每次从仓库取一张流程单,指挥车间(运算器)加工。这样只要换不同的流程单,同一个工厂就能生产不同的产品。
第(1)点:"存储程序"工作方式
这是冯·诺依曼体系结构最核心的思想。所谓"存储程序",是指程序(指令的有序集合)在执行之前先存入存储器中。计算机运行时,不需要人工干预,CPU通过一个叫做程序计数器(PC)的寄存器自动依次取出指令并执行。PC的值每次自动递增,指向下一条待执行的指令。这种方式使得同一台硬件装入不同的程序就能完成不同的任务——这正是我们今天能在同一台电脑上既打游戏又写文档的根本原因。
第(2)点:五大部件
第(3)点:存储器同时存放指令和数据
在冯·诺依曼结构中,指令(程序)和数据存放在同一个存储器中(这也叫"统一编址")。CPU区分某个存储单元中是指令还是数据的方式是:在取指阶段取出来的就当作指令处理,在取操作数阶段取出来的就当作数据处理。也就是说,区分靠的是访问时机而不是数据本身的特征。
第(4)点:二进制表示
计算机内部的所有信息——无论是指令还是数据——都用二进制(只有0和1两个数字)来表示。之所以选用二进制,是因为电子元器件天然就有两种稳定状态(高电平/低电平、通/断),用二进制最容易在硬件上实现,而且二进制的运算规则简单(例如加法只需要处理0+0、0+1、1+0、1+1四种情况)。
冯·诺依曼四要点,可以用口诀记忆:"存储程序是核心,五大部件搭框架,指令数据同一家,内部表示用二进"。
注意:有些教材还会补充"以运算器为中心"和"指令由操作码+地址码组成"两点。如果题目分值较高(7分以上),可以适当补充。
第1章 计算机系统概述 —— 冯·诺依曼结构计算机的特点部分。本题是教材最基础、最高频的简答考点之一,几乎每次自考都会涉及。
为什么要对浮点数进行规格化?有哪两种规格化操作?(7分)
对浮点数尾数进行规格化,除了能得到尽量多的有效数位外,还可以使浮点数的表示具有唯一性。
两种规格化操作有:"左规"、"右规"。
要理解这个问题,我们需要先搞清楚什么是浮点数。
什么是浮点数?
在日常生活中,我们用科学记数法表示很大或很小的数,比如把 0.000123 写成 1.23 x 10-4,把 45600 写成 4.56 x 104。计算机中的浮点数就是类似的机制,只不过底数是2而不是10。一个浮点数由三部分组成:
浮点数的值 = (-1)S x M x 2E
什么是规格化?
在十进制科学记数法中,我们要求有效数字的整数部分必须是1到9之间的数。例如 0.56 x 102 不是标准写法,标准写法是 5.6 x 101。类似地,在二进制浮点数中,规格化就是要求尾数的最高有效位必须是一个有意义的数字(非零数字),而不能是一堆前导零。
对于原码表示的尾数,规格化要求尾数的绝对值满足:0.5 <= |M| < 1,即尾数最高位(小数点后第一位)必须为1。
对于补码表示的尾数,规格化要求符号位和最高数值位不同(正数形如 0.1xxxx,负数形如 1.0xxxx)。
为什么要规格化?(两个原因)
原因一:得到尽量多的有效数位(提高精度)
假设尾数有4位。如果我们存 0.0012(二进制),前面两个0其实浪费了两个数位,真正有意义的只有后面两位。如果规格化为 0.1200 x 2-1,同样4位尾数中有效数字增加到了4位,精度更高了。
用具体例子:假设尾数有8位,表示 0.00101100 只有6位有效数字;规格化为 0.10110000 x 2-2 后,8位全部用来表示有效数字,精度明显提高。
原因二:使浮点数的表示具有唯一性
不规格化时,同一个数可以有多种表示方式。例如十进制数 56 可以写成 56 x 100、5.6 x 101、0.56 x 102、0.056 x 103 等无数种形式。规格化后规定了唯一的标准形式(如 5.6 x 101),这样一个数只有一种表示,方便比较、运算和存储。
两种规格化操作:
"左规"(左移规格化):当运算结果的尾数不满足规格化要求时(尾数绝对值太小,最高有效位为0),将尾数左移一位,同时阶码减1。反复执行直到满足规格化条件。左规可能需要执行多次。
例如:尾数 0.001100,左移两次变成 0.110000,阶码相应减2。
"右规"(右移规格化):当运算结果的尾数溢出(即尾数的绝对值大于等于1,整数部分出现了有效数字)时,将尾数右移一位,同时阶码加1。右规最多只需执行一次(因为两个规格化数相加,进位最多产生1位溢出)。
例如:尾数运算结果为 1.011000(溢出了),右移一次变成 0.101100,阶码加1。
第2章 数据的表示和运算 —— 浮点数的表示与运算部分。规格化是浮点运算的核心概念,也是理解 IEEE 754 标准的基础。
简述转移指令和调用(转子)指令的区别。(7分)
转移指令和调用(转子)指令的区别在于:执行调用(转子)指令时必须保存下条指令的地址(即返回地址);调用(转子)指令用于过程调用或函数调用,当被调用过程执行结束时,根据返回地址返回到调用过程继续执行,而转移指令则不返回执行,因而无需保存返回地址。
要理解这道题,我们首先需要知道什么是"指令"和"程序执行流程"。
什么是程序计数器(PC)?
CPU中有一个特殊的寄存器叫程序计数器(Program Counter,PC),它保存着"下一条要执行的指令的地址"。正常情况下,程序是顺序执行的——执行完当前指令后,PC自动加1(实际上是加上当前指令的长度),指向下一条指令。
什么是转移指令?
转移指令(也叫跳转指令、分支指令)会改变PC的值,让程序"跳"到另一个位置去执行。比如 JMP 100 就是让PC变成100,于是CPU接下来就去执行地址100处的指令了。这就像看书时说"翻到第100页继续看"——你翻过去了,但你不会记住自己是从第几页翻过去的,因为你不打算回来。
什么是调用(转子)指令?
调用指令(CALL指令,也叫"转子指令")也会改变PC的值,但它在跳转之前会先保存当前PC的值(即"返回地址"——调用指令后面那条指令的地址)。保存位置通常是栈(一种后进先出的存储结构)或者专用的链接寄存器(Link Register)。这就像看书时说"先翻到附录A查一下,看完之后回到这里继续看"——翻过去之前你先在当前页夹了一个书签。
被调用的子程序(函数)执行完毕后,执行一条返回指令(RET),这条指令会把之前保存的返回地址取出来放回PC,程序就回到了调用点的下一条指令继续执行。
两者的核心区别可以从以下几个维度理解:
| 对比维度 | 转移指令 | 调用(转子)指令 |
|---|---|---|
| 修改PC | 是,将PC改为目标地址 | 是,将PC改为子程序入口地址 |
| 保存返回地址 | 不保存 | 必须保存(压栈或存入链接寄存器) |
| 是否返回 | 不返回原位置 | 子程序结束后返回到调用点的下一条指令 |
| 典型用途 | 循环控制、条件分支(如 if-else) | 过程调用、函数调用 |
| 配合的指令 | 无需配合返回指令 | 需要配合 RET(返回)指令使用 |
| 典型指令示例 | JMP、BEQ、BNE | CALL、JSR、JAL、BL |
为什么调用指令一定要保存返回地址?
因为子程序是可以被程序中不同位置反复调用的。比如一个"计算平方根"的子程序,可能在主程序的第50行调用它,也可能在第200行调用它。子程序本身不知道自己被谁调用,所以必须在调用的时候记录"从哪里来的",执行完才能"回到哪里去"。
返回地址保存在哪里?
第3章 指令系统 —— 程序控制类指令部分。这一知识点涉及转移指令(无条件转移、条件转移)和子程序调用指令的区别,是指令系统章节的重要考点。
简述I/O接口的基本功能。(7分)
I/O接口的基本功能有:
(1)数据缓冲;
(2)错误或状态检测;
(3)控制或定时;
(4)数据格式转换。
什么是I/O接口?
I/O是 Input/Output(输入/输出)的缩写。计算机要与外部设备(键盘、鼠标、打印机、硬盘等)交换数据,但CPU和外部设备之间存在巨大的差异:CPU速度极快(纳秒级),而外部设备速度很慢(毫秒甚至秒级);CPU使用并行的二进制数据,而某些外部设备使用串行数据或模拟信号;不同外设的工作方式和控制信号也各不相同。
因此,CPU不能直接连接外部设备,中间需要一个"翻译官"和"协调员"——这就是I/O接口(也叫接口电路、I/O控制器、设备控制器)。它位于CPU(通过系统总线)和外部设备之间,负责协调两者之间的信息交换。
可以这样理解:如果CPU是公司的总经理(说普通话、效率极高),外部设备是各国客户(说不同语言、节奏不同),那么I/O接口就是翻译兼秘书——负责语言翻译、速度协调、信息缓存和状态汇报。
(1)数据缓冲
CPU的工作速度非常快,而外部设备的速度通常慢得多。例如CPU每秒能处理数十亿次操作,但打印机每秒可能只能打印几行。如果CPU直接等待打印机,大量时间都在空等,效率极低。
I/O接口内部设有数据缓冲寄存器(Data Buffer Register),CPU将数据高速写入缓冲区后就可以去做别的事了,外部设备再慢慢从缓冲区取数据。反过来,外部设备的数据也先存入缓冲区,等凑齐一定量后再通知CPU一次性取走。这就解决了速度不匹配的问题。
(2)错误或状态检测
I/O接口需要随时监控外部设备的工作状态,比如:设备是否准备就绪?是否正在忙碌?数据传输过程中是否出错?这些信息保存在接口内部的状态寄存器(Status Register)中。CPU可以读取状态寄存器来了解设备的当前状况。
例如:打印机缺纸了、磁盘读取校验出错了、网卡收到了新数据——这些状态信息都由I/O接口负责检测和报告。
(3)控制或定时
CPU通过I/O接口向外部设备发送控制命令,比如"开始读数据"、"停止打印"、"将磁头移动到某磁道"等。这些命令存放在接口内部的控制寄存器(Control Register)中。
同时,I/O接口还负责定时和协调:不同的设备有不同的时序要求(比如什么时候可以发数据、发数据之前要先发什么信号),接口电路会产生正确的时序信号来保证数据传输的可靠性。就像交通信号灯控制车辆有序通行一样。
(4)数据格式转换
CPU内部数据通常是并行格式(比如同时传输8位、16位或32位),但某些外部设备使用串行格式(一次传输1位,比如串口通信、USB等)。此外,有些设备使用模拟信号(如传感器),需要做模拟/数字转换(A/D、D/A)。I/O接口负责在这些不同格式之间进行转换。
例如:CPU向串口设备发送数据时,I/O接口将CPU送来的8位并行数据转换成一位一位的串行数据发出去;接收时则把串行数据攒成一个完整的字节再交给CPU。
第6章 互连及输入输出组织 —— I/O接口的功能与组成部分。这是I/O系统章节的基础知识点,考试中常以简答题或填空题形式出现。
简述(取指令、指令译码、取操作数、执行、写回)五段指令流水线的每一段所执行的操作。(7分)
取指令(IF,Instruction Fetch):根据PC的值从存储器取出指令并更新PC。
指令译码(ID,Instruction Decode):产生执行所需要的控制信号。
取操作数(OF,Operand Fetch):读取存储器操作数或寄存器操作数。
执行(EX,Execute):对操作数完成指定的操作。
写回(WB,Write Back):将操作结果写入存储器或寄存器。
什么是指令流水线?
在日常生活中,洗衣服的流程是:洗涤 -> 烘干 -> 折叠。如果只有一批衣服,三个步骤只能顺序执行。但如果有多批衣服,你可以让第一批进入烘干机时,同时把第二批放进洗衣机;第一批在折叠时,第二批在烘干,第三批在洗涤——这就是流水线的思想。
CPU执行指令时也是如此。每条指令的执行可以分成若干个阶段,每个阶段使用不同的硬件资源。如果让不同指令的不同阶段同时使用不同的硬件资源,就能大大提高CPU的吞吐率(单位时间完成的指令数)。这就是指令流水线技术。
什么是"五段流水线"?
五段流水线是最经典的流水线划分方式,将每条指令的执行过程分成5个阶段(段、级),每个阶段用一个时钟周期完成。理想情况下,当流水线满载时,每个时钟周期都有一条指令完成执行。
第1段:取指令(IF - Instruction Fetch)
这一阶段的任务是"去存储器把指令拿回来"。具体操作:
类比:这就像"去货架上取一张工艺卡片回到工位"。
第2段:指令译码(ID - Instruction Decode)
这一阶段的任务是"看懂指令要做什么"。具体操作:
类比:这就像"阅读工艺卡片,搞清楚要做什么操作、需要什么材料"。
第3段:取操作数(OF - Operand Fetch)
这一阶段的任务是"把计算所需的数据准备好"。具体操作:
类比:这就像"按卡片上写的去仓库取原材料"。
第4段:执行(EX - Execute)
这一阶段的任务是"真正做运算"。具体操作:
类比:这就像"在车间里用计算器完成实际加工"。
第5段:写回(WB - Write Back)
这一阶段的任务是"把结果保存好"。具体操作:
类比:这就像"把加工好的成品放到指定的货架上"。
五段流水线的时空图示意:
如图所示,从第5个时钟周期开始,流水线满载,每个周期都有一条指令完成。不使用流水线时5条指令需要25个时钟周期,使用流水线只需要9个。
第4章 中央处理器 —— 指令流水线部分。五段流水线是流水线技术的经典模型,也是理解流水线冲突(数据冲突、控制冲突、结构冲突)的基础,是本章的重要考点。
求机器数为C0B00000H(用十六进制数表示)的IEEE754单精度浮点数的值(用十进制数表示)。(6分)
注:IEEE754单精度浮点数的计数公式为(-1)s × 1.f × 2(e-127)。
解:
(1) 将C0B00000(用十六进制数表示)的IEEE754单精度浮点数展开为32位二进制数:
(C0B00000)16 = (1100 0000 1011 0000 0000 0000 0000 0000)2
(2) 据IEEE754单精度浮点数格式可知:
符号 s = 1
尾数小数部分 f = (0.011)2 = (0.375)10
阶码 e = (10000001)2 = (129)10
(3) 所以,其值为:
(-1)s × 1.f × 2(e-127) = (-1)1 × 1.375 × 2(129-127) = (-1) × 1.375 × 4 = -5.5
本题考查的是 IEEE 754 单精度浮点数 的表示与转换。要理解这道题,需要掌握以下基础知识:
1. 什么是浮点数?
在计算机中,小数(如 3.14、-5.5)不能像整数那样直接用二进制存储。浮点数是一种专门用来表示小数的编码方式,类似于科学计数法。比如,十进制的 -5.5 可以写成 -1.375 × 22,就像科学计数法 -5.5 = -0.55 × 101 一样。
2. IEEE 754 单精度浮点数格式
IEEE 754 是一个国际标准,规定了浮点数在计算机中的存储格式。单精度浮点数用 32 位(bit)存储,分为三个字段:
| 字段 | 位数 | 位置(从左到右) | 含义 |
|---|---|---|---|
| 符号位 s | 1 位 | 第 31 位(最高位) | 0 表示正数,1 表示负数 |
| 阶码 e | 8 位 | 第 30~23 位 | 表示指数部分(用移码表示,偏置值为 127) |
| 尾数 f | 23 位 | 第 22~0 位 | 表示小数部分(隐含整数部分 1) |
计算公式为:值 = (-1)s × 1.f × 2(e-127)
其中 "1.f" 表示在尾数前面隐含了一个整数 "1",例如尾数存储的是 011...0,实际表示的是 1.011...0。
3. 十六进制与二进制的转换
十六进制的每一位恰好对应 4 位二进制。例如:C = 1100,0 = 0000,B = 1011。这是因为 24 = 16,所以 4 个二进制位刚好表示一个十六进制位。
第一步:将十六进制数 C0B00000 转换为 32 位二进制数
十六进制每一位对应 4 位二进制,逐位转换:
| 十六进制位 | C | 0 | B | 0 | 0 | 0 | 0 | 0 |
|---|---|---|---|---|---|---|---|---|
| 二进制(4位) | 1100 | 0000 | 1011 | 0000 | 0000 | 0000 | 0000 | 0000 |
转换方法提示(以 C 为例):C 的十进制值是 12,将 12 不断除以 2 取余:12÷2=6...0, 6÷2=3...0, 3÷2=1...1, 1÷2=0...1,从下往上读余数得 1100。
拼接起来得到完整的 32 位二进制:
11000000101100000000000000000000
红色 = 符号位 s(1位), 蓝色 = 阶码 e(8位), 绿色 = 尾数 f(23位)
第二步:提取三个字段的值
(a) 符号位 s:
最高位(第 31 位)为 1,表示这是一个负数。
(如果 s=0,则为正数;s=1,则为负数。)
(b) 阶码 e:
第 30~23 位为:10000001
将这个 8 位二进制数转换为十进制:
1×27 + 0×26 + 0×25 + 0×24 + 0×23 + 0×22 + 0×21 + 1×20
= 128 + 0 + 0 + 0 + 0 + 0 + 0 + 1
= 129
(c) 尾数小数部分 f:
第 22~0 位为:011 0000 0000 0000 0000 0000 0
有效位只有前面的 011(后面全是 0,不影响数值)。
将二进制小数 0.011 转换为十进制:
0×2-1 + 1×2-2 + 1×2-3
= 0 + 0.25 + 0.125
= 0.375
说明:二进制小数点后第 1 位权值为 2-1=0.5,第 2 位权值为 2-2=0.25,第 3 位权值为 2-3=0.125,以此类推。
第三步:代入公式计算最终值
公式:值 = (-1)s × 1.f × 2(e-127)
代入各字段的值:
= (-1)1 × 1.375 × 2(129-127)
= (-1) × 1.375 × 22
= (-1) × 1.375 × 4
= -5.5
解释每一步:
第2章 数据的表示和运算 -- IEEE 754 浮点数标准、浮点数的表示与运算
假定某同步总线在一个总线时钟周期内传送一个10字节的数据,总线时钟频率为50MHz,则总线带宽是多少?如果总线宽度改为128位,一个时钟周期能传送两次数据,总线时钟频率为200MHz,则总线带宽是多少?(6分)
解:
根据总线的总带宽计算公式:B = W × F / N
则本题所述总线的总带宽为:
B = 10B × 50MHz / 1 = 500MB/s
改进后,总线的总带宽为:
B = (128/8)B × 200MHz / 0.5 = 6400MB/s
本题考查的是总线带宽的计算。要理解这道题,需要掌握以下基础知识:
1. 什么是总线?
总线(Bus)是计算机中各部件之间传输数据的公共通道,可以想象成一条"公路"。CPU、内存、硬盘等部件都通过总线来交换数据。
2. 什么是同步总线?
同步总线是指数据传输的时机由一个统一的时钟信号控制。每个时钟周期,总线完成一次(或多次)数据传输操作。就像节拍器一样,所有设备都"踩着节拍"传数据。
3. 什么是总线带宽?
总线带宽(Bus Bandwidth)是指总线在单位时间内能传输的数据量,单位通常为 MB/s(兆字节每秒)。它衡量的是总线的数据传输能力,带宽越大,数据传输越快。
4. 关键概念解释:
5. 总线带宽公式:
B = W × F / N
其中:B = 带宽(MB/s),W = 每次传送的数据量(字节),F = 时钟频率(MHz),N = 传送一次数据所需的时钟周期数。
第一问:基本情况下的总线带宽
题目已知条件:
代入公式:
B = W × F / N
= 10B × 50MHz / 1
= 10 × 50
= 500 MB/s
理解这个计算:每个时钟周期传 10 字节,每秒有 5000 万个时钟周期,所以每秒传输 10 × 50,000,000 = 500,000,000 字节 = 500MB。
第二问:改进后的总线带宽
题目已知条件:
关于 N = 0.5 的理解:题目说"一个时钟周期能传送两次数据",也就是说完成一次数据传送只需半个时钟周期。这在技术上通过在时钟的上升沿和下降沿各传送一次数据来实现(类似于 DDR 内存的原理)。
代入公式:
B = W × F / N
= 16B × 200MHz / 0.5
= 16 × 200 / 0.5
= 16 × 400
= 6400 MB/s
另一种理解方式:每个时钟周期传 2 次,每次 16 字节,每秒有 2 亿个时钟周期,所以每秒传输 2 × 16 × 200,000,000 = 6,400,000,000 字节 = 6400MB。
对比分析:
| 参数 | 改进前 | 改进后 | 变化倍数 |
|---|---|---|---|
| 总线宽度 | 10B(80位) | 16B(128位) | 1.6倍 |
| 时钟频率 | 50MHz | 200MHz | 4倍 |
| 每周期传送次数 | 1次 | 2次 | 2倍 |
| 总线带宽 | 500MB/s | 6400MB/s | 12.8倍 |
第6章 互连及输入输出组织 -- 总线的性能指标、总线带宽的计算
假设某个频繁使用的程序P在机器M1上运行需要30秒,M1的时钟频率为1GHz。设计人员想开发一台与M1具有相同ISA的新机器M2。采用新技术可使M2的时钟频率增加,但同时也会使CPI增加。假定P在M2上执行时的CPI是在M1上的2倍,则M2的时钟频率至少达到多少才能使程序P在M2上的运行时间缩短为6秒?(6分)
解:
程序P在机器M1上的时钟周期数为:CPU执行时间 × 时钟频率 = 30s × 1GHz = 30G(即 30 × 109 个时钟周期)。
因此,程序P在机器M2上的时钟周期数为:2 × 30G = 60G(因为 CPI 变为 2 倍,指令数不变,所以总时钟周期数翻倍)。
要使程序P在M2上的运行时间缩短为6s,则M2的时钟频率至少为:
程序所含时钟周期数 ÷ CPU执行时间 = 60G ÷ 6s = 10GHz
本题考查的是 CPU 性能评估中最核心的公式。要理解这道题,需要掌握以下基础知识:
1. 什么是时钟频率?
CPU 内部有一个时钟发生器,像心跳一样不断产生脉冲信号。每一次脉冲称为一个时钟周期。时钟频率就是每秒钟脉冲的次数。例如 1GHz 表示每秒有 109(即 10 亿)个时钟周期。频率越高,CPU "心跳" 越快,理论上运行越快。
2. 什么是 ISA?
ISA(Instruction Set Architecture,指令集架构)是 CPU 能识别和执行的所有指令的集合。题目说 M1 和 M2 具有相同的 ISA,意味着同一个程序 P 在两台机器上执行的指令数量完全相同(虽然执行速度不同)。
3. 什么是 CPI?
CPI(Cycles Per Instruction,每条指令的平均时钟周期数)。执行一条指令可能需要多个时钟周期。例如,一条加法指令可能需要 1 个周期,一条乘法指令可能需要 3 个周期。CPI 是所有指令所需周期数的加权平均值。CPI 越大,意味着平均每条指令需要更多的时钟周期,执行效率越低。
4. 核心公式(CPU 性能公式)
CPU 执行时间由三个因素决定:
CPU 执行时间 = 指令数 × CPI × 时钟周期时间
或等价写法:
CPU 执行时间 = 指令数 × CPI / 时钟频率
(因为时钟周期时间 = 1 / 时钟频率)
也可以变换为:
CPU 执行时间 = 总时钟周期数 / 时钟频率
(因为总时钟周期数 = 指令数 × CPI)
第一步:求程序 P 在 M1 上执行的总时钟周期数
已知条件:
由公式 "CPU 执行时间 = 总时钟周期数 / 时钟频率" 变换得:
总时钟周期数 = CPU 执行时间 × 时钟频率
= 30s × 1GHz
= 30s × 109/s
= 30 × 109
= 30G 个时钟周期
(G 代表 Giga,即 109,约 300 亿个周期。)
第二步:求程序 P 在 M2 上执行的总时钟周期数
关键信息:
推导过程:
M1 的总时钟周期数 = I × CPIM1 = 30G
M2 的总时钟周期数 = I × CPIM2 = I × 2 × CPIM1 = 2 × (I × CPIM1) = 2 × 30G = 60G
解释:因为指令数 I 不变(相同的 ISA 运行相同的程序),而每条指令需要的时钟周期数翻倍了,所以总的时钟周期数也翻倍,从 30G 变为 60G。
第三步:求 M2 需要的最低时钟频率
已知条件:
由公式 "CPU 执行时间 = 总时钟周期数 / 时钟频率" 变换得:
时钟频率 = 总时钟周期数 / CPU 执行时间
= 60G / 6s
= 60 × 109 / 6
= 10 × 109
= 10GHz
验证答案:
M2 执行时间 = 60G / 10GHz = 60 × 109 / (10 × 109) = 6 秒 -- 正确!
直觉理解:
M2 的目标是将执行时间从 30 秒缩短到 6 秒(快 5 倍),但 CPI 增加了 2 倍(慢 2 倍)。要同时弥补 CPI 带来的损失并达到加速目标,时钟频率需要提升 5 × 2 = 10 倍,即从 1GHz 提升到 10GHz。
第4章 中央处理器 -- CPU 性能评估、时钟频率与 CPI 的关系;第1章 计算机系统概述 -- 计算机性能指标
某计算机部分数据通路结构如题29图所示。该机字长16位,采用16位定长指令格式,假设MAR的输出一直处于使能状态。试分析指令"OR R1, (R2)"的执行情况,回答以下问题:
数据通路结构说明:
寄存器说明:IR(指令寄存器)、PC(程序计数器)、MAR(存储器地址寄存器)、MDR(存储器数据寄存器)、R1、R2、Y(ALU输入暂存器)、Z(ALU输出寄存器)
控制信号:MARin、MDRin、MDRout、R1in、R1out、R2out、Yin、Zout、MenR(存储器读)、MenW(存储器写)
ALU操作:ADD(加法)、SUB(减法)、OR(逻辑或)。ALU的A端输入来自暂存器Y,B端输入来自内部总线,输出送往Z寄存器。
指令功能:OR R1, (R2) 即 R[R1] ← R[R1] OR M[R[R2]],将R1中的值与R2所指向的内存单元中的值进行逻辑或运算,结果写回R1。
(1)执行该指令需要几个时序节拍?
(2)列出每个时序节拍所需要的有效控制信号和所完成的操作。
(1)需要 4个或5个 节拍。(2分)
(2)每个节拍的控制信号与操作如下:
| 节拍 | 控制信号 | 功能(操作) | 分值 |
|---|---|---|---|
| T1 | R2out, MARin | MAR ← (R2) | 2分 |
| T2 | MemR | MDR ← M(MAR) | 2分 |
| T3 | MDRout, Yin | Y ← (MDR) | 2分 |
| T4 | R1out, OR | Z ← Y OR (R1) | 1分 |
| T5 | Zout, R1in | R1 ← (Z) | 1分 |
说明:其中 T2(MemR)和 T3(MDRout, Yin)可以合并在一拍中完成(即 MemR, MDRout, Yin 同时有效),也可以各占一个节拍,因此总共需要4个或5个节拍。
一、什么是数据通路(Datapath)?
数据通路是CPU内部用于传送和加工数据的硬件通道,由寄存器、ALU(算术逻辑单元)、内部总线以及连接它们的控制门电路组成。你可以把它想象成一条"工厂流水线":数据从一个"工位"(寄存器)出发,经过"加工车间"(ALU)处理,然后把成品送回"仓库"(目标寄存器)。每一步操作都需要打开或关闭特定的"阀门"(控制信号)来控制数据的流向。
二、什么是时序节拍(Clock Cycle / Timing Beat)?
CPU内部有一个时钟信号,每"滴答"一次就是一个时钟周期,也叫一个"节拍"。在每个节拍内,CPU可以完成一组不冲突的微操作。一条指令的执行过程通常需要多个节拍,就像做菜需要多个步骤一样——先洗菜、再切菜、然后炒菜,每个步骤对应一个节拍。
为什么不能在一个节拍内完成所有操作?因为硬件资源是共享的。例如,内部总线在一个节拍内只能传输一组数据,如果两组数据都需要走总线,就必须分两个节拍来完成。
三、本题数据通路中各部件的作用
四、指令 "OR R1, (R2)" 的含义
这条指令采用寄存器间接寻址方式。"(R2)"外面的小括号表示"R2的内容作为内存地址",即先取出R2中存放的数值,把这个数值当作内存地址,去内存中取出该地址处的数据。
完整功能为:R1 ← R1 OR M[R2],即把 R1 的值和以 R2 内容为地址的内存单元中的值做逻辑或运算,结果写回 R1。
注意:本题分析的是指令的执行阶段(Execute Phase),不包括取指阶段(Fetch Phase)。取指阶段是所有指令公共的步骤(用 PC 取指令到 IR),题目默认指令已经取到 IR 中并完成译码。
解题思路:先明确指令要完成什么操作,然后根据数据通路的结构,把整个操作分解为一系列通过总线传输数据的微操作步骤。
指令执行总任务:R1 ← R1 OR M[R2]
这个任务可以拆分为以下子任务:
第 T1 拍:将 R2 的内容送入 MAR
控制信号:R2out, MARin
操作:MAR ← (R2)
详细过程:
为什么需要这一步?CPU 要从内存读数据,必须先告诉内存"我要读哪个地址",这就是 MAR 的作用。R2 中存的是地址值,必须先把它送到 MAR。
第 T2 拍:从内存读取数据到 MDR
控制信号:MemR
操作:MDR ← M(MAR)
详细过程:
为什么需要 MDR?内存的速度比 CPU 慢得多,读取数据需要一定时间。MDR 作为中转站,接收从内存读出的数据,供 CPU 后续使用。
第 T3 拍:将 MDR 的数据送入暂存器 Y
控制信号:MDRout, Yin
操作:Y ← (MDR)
详细过程:
为什么需要 Y 暂存器?ALU 有两个输入端 A 和 B。在本数据通路中,A 端连接 Y 寄存器,B 端连接内部总线。如果两个操作数都直接从总线来,就会产生冲突(一条总线同一时刻只能传一个数据)。所以必须先把一个操作数暂存到 Y 中,再把另一个操作数放到总线上,这样 ALU 的两个输入才能同时有效。
关于 T2 和 T3 是否可以合并:如果存储器读取速度足够快,MemR 和 MDRout, Yin 可以在同一个节拍内完成(即 MDR 一收到数据立即送出)。这取决于具体的硬件实现。因此答案说"4个或5个节拍"都正确。
第 T4 拍:执行 OR 运算
控制信号:R1out, OR
操作:Z ← Y OR (R1)
详细过程:
为什么 Z 不需要专门的写入控制信号?在许多数据通路设计中,Z 寄存器直接接收 ALU 的输出,只要 ALU 有运算操作(ADD/SUB/OR),结果就自动写入 Z,不需要额外的 Zin 信号。
第 T5 拍:将运算结果写回 R1
控制信号:Zout, R1in
操作:R1 ← (Z)
详细过程:
完整执行流程总结:
| 节拍 | 控制信号 | 数据流动 | 通俗解释 |
|---|---|---|---|
| T1 | R2out, MARin | R2 → 总线 → MAR | 告诉内存"我要读这个地址" |
| T2 | MemR | 内存[MAR] → 数据总线 → MDR | 内存把数据送出来 |
| T3 | MDRout, Yin | MDR → 总线 → Y | 把内存数据暂存起来,准备运算 |
| T4 | R1out, OR | R1 → 总线 → ALU(B端); Y → ALU(A端); ALU输出 → Z | 两个数做OR运算 |
| T5 | Zout, R1in | Z → 总线 → R1 | 把运算结果写回R1 |
关于"4拍还是5拍"的说明:
T2(MemR, MDR←M(MAR))和 T3(MDRout, Yin, Y←MDR)这两步有可能合并为一拍。合并的条件是:当 MemR 信号发出后,内存读出数据到 MDR 的速度足够快,使得在同一个时钟周期内,数据可以从内存经 MDR 传到 Y。如果能合并,则只需4拍;如果内存速度较慢需要单独等待一拍,则需5拍。两种答法均可得分。
第4章 中央处理器 -- 第2节 数据通路的功能和基本结构。重点掌握单总线数据通路中各类指令(运算类、访存类)的执行流程和控制信号时序。
设有一计算机主存空间大小为4GB,按字节编址,主存与cache之间采用直接映射方式,数据块大小为4KB,cache数据区容量为64KB。回答以下问题。
(1)主存与cache映射时主存地址应划分为哪几个部分?每个部分分别是哪几位地址?
(2)cache总容量是多少?(每行包含一位有效位V)
(3)地址为17824193H的主存单元映射到cache的行号是多少?
(1)主存地址 32 位,划分为三部分:
(2)Cache 总容量 = 64KB + (16 + 1) × 16 = 64KB + 272B = 65808B(即 526464 bit,约 64.27KB)
(3)17824193H = (0001 0111 1000 0010 0100 0001 1001 0011)2,其中行号位 A15~A12 = 0100,即映射到 Cache 的第 4 行。
一、什么是 Cache(高速缓冲存储器)?
Cache 是位于 CPU 和主存(内存)之间的一层小而快的存储器。CPU 需要数据时,先在 Cache 中找。如果找到了(称为"命中"),就直接从 Cache 读取,速度非常快(通常只需 1~2 个时钟周期);如果没找到(称为"缺失"或"未命中"),就要从较慢的主存中读取(可能需要几十到上百个时钟周期),同时把该数据所在的一整块复制到 Cache 中,方便下次使用。
二、什么是"块"和"行"?
主存和 Cache 之间不是一个字节一个字节地传输,而是以"块"(Block)为基本单位。主存被逻辑上划分为许多大小相同的块,Cache 也被划分为相同大小的存储单元,称为"行"(Line)或"槽"(Slot)。本题中每块大小为 4KB,意味着每次从主存往 Cache 搬运数据,都是搬 4KB 的一整块。
三、什么是直接映射(Direct Mapping)?
直接映射是三种 Cache 映射方式中最简单的一种。它规定:主存的每一块只能放到 Cache 中固定的一行中,对应关系由以下公式确定:
Cache 行号 = 主存块号 mod Cache 总行数
举个生活例子:假设有 16 间学生宿舍(Cache 行),1000 个学生(主存块)。直接映射就像规定"学号除以16的余数决定你住哪间宿舍"——学号 0、16、32... 住第 0 间,学号 1、17、33... 住第 1 间,依此类推。
直接映射的优点是硬件简单、查找速度快(不用搜索,直接定位到某一行);缺点是灵活性差,可能多个常用块都映射到同一行,导致频繁替换(称为"冲突缺失")。
四、直接映射的地址划分
在直接映射方式下,主存地址被划分为三个字段:
| 字段 | 含义 | 计算方法 |
|---|---|---|
| 块内地址(Offset) | 定位块内的某个字节 | log2(块大小) |
| 行号/索引(Index) | 确定该块映射到 Cache 的哪一行 | log2(Cache 行数) |
| 标记(Tag) | 区分映射到同一行的不同主存块 | 总位数 - 行号位数 - 块内地址位数 |
三个字段从高位到低位依次为:标记 | 行号 | 块内地址。
五、为什么需要标记(Tag)?
因为很多不同的主存块都映射到同一个 Cache 行(比如主存块 0、16、32 都映射到第 0 行),所以当 CPU 访问 Cache 的某一行时,需要判断"这一行里存的到底是哪个主存块的数据"。标记字段就是用来做这个识别的——CPU 把地址中的标记字段和 Cache 行中存储的标记进行比较,如果相同就命中,不同就缺失。
六、有效位(Valid Bit)是什么?
Cache 刚上电时,所有行里的数据都是垃圾值,标记也没有意义。有效位 V 就是一个标志位:V=1 表示该行已经装入了有效数据,V=0 表示该行是空的或无效的。只有当 V=1 且标记匹配时,才算真正命中。
第(1)小题:主存地址划分
Step 1:确定主存地址总位数
主存空间 4GB = 4 × 230 = 232 字节
按字节编址,每个字节需要一个唯一地址,所以需要 32 位地址。
(理解方式:232 个不同的字节,需要 32 个二进制位才能一一编号,就像 100 间教室需要 3 位十进制数来编号一样)
Step 2:计算块内地址位数(Offset)
块大小 = 4KB = 4 × 210 = 212 字节 = 4096 字节
一个块内有 4096 个字节,需要 log2(4096) = 12 位来标识块内的某个字节
块内地址占据地址的最低 12 位:A11 ~ A0
(直觉理解:4096 = 212,所以需要 12 位二进制来给这 4096 个字节编号,从 000000000000 到 111111111111)
Step 3:计算 Cache 行数和行号位数(Index)
Cache 数据区容量 = 64KB
每行存放一个块 = 4KB
Cache 行数 = 64KB / 4KB = 16 行
16 = 24,需要 log2(16) = 4 位来表示行号
行号占据地址的中间 4 位:A15 ~ A12
(理解方式:16 行需要 4 位二进制编号,从 0000(第 0 行)到 1111(第 15 行))
Step 4:计算标记位数(Tag)
标记位数 = 总位数 - 行号位数 - 块内地址位数 = 32 - 4 - 12 = 16 位
标记占据地址的最高 16 位:A31 ~ A16
(理解方式:地址总共 32 位,低 12 位给了块内地址,中间 4 位给了行号,剩下的高 16 位自然就是标记)
最终地址划分图:
←———————— 共32位 ————————→
第(2)小题:Cache 总容量
关键概念:Cache 的总容量不仅仅是数据区的容量。每个 Cache 行除了存放数据(一个块的内容),还需要额外的存储空间来保存标记(Tag)和有效位(V)。
每行的组成:
| 组成部分 | 位数 | 说明 |
|---|---|---|
| 有效位 V | 1 位 | 标识该行数据是否有效 |
| 标记 Tag | 16 位 | 标识数据来自主存的哪个块 |
| 数据 Data | 4KB = 32768 位 | 一个块的实际数据 |
Step 1:计算数据区总容量
数据区容量 = 16 行 × 4KB/行 = 64KB(题目已给出)
Step 2:计算额外存储(标记 + 有效位)的总容量
每行额外存储 = 标记位数 + 有效位位数 = 16 + 1 = 17 位
16 行共计额外存储 = 17 × 16 = 272 位 = 272 bit
换算为字节:272 bit / 8 = 34 字节 = 34B
Step 3:Cache 总容量
Cache 总容量 = 数据区 + 额外存储 = 64KB + 272B
= 65536B + 272B = 65808 B
= 65808 × 8 = 526464 bit
≈ 64.27 KB
理解方式:64KB 是纯数据的大小,272B 是"账本"(标记和有效位)的大小。Cache 的真正大小要把"数据"和"账本"加在一起。虽然额外存储只占很小的比例(272B 相对于 64KB),但考试中这是必须计算的考点。
第(3)小题:地址 17824193H 的映射行号
Step 1:将十六进制地址转换为二进制
十六进制转二进制的规则:每一位十六进制对应 4 位二进制。
| 十六进制位 | 1 | 7 | 8 | 2 | 4 | 1 | 9 | 3 |
|---|---|---|---|---|---|---|---|---|
| 二进制(4位) | 0001 | 0111 | 1000 | 0010 | 0100 | 0001 | 1001 | 0011 |
完整的 32 位二进制地址:
0001 0111 1000 0010 0100 0001 1001 0011
Step 2:根据地址划分提取行号字段
按照第(1)小题的地址划分:
0001 0111 1000 001001000001 1001 0011把位编号标注出来更清楚:
| 位编号 | A31-A28 | A27-A24 | A23-A20 | A19-A16 | A15-A12 | A11-A8 | A7-A4 | A3-A0 |
|---|---|---|---|---|---|---|---|---|
| 二进制值 | 0001 | 0111 | 1000 | 0010 | 0100 | 0001 | 1001 | 0011 |
| 十六进制 | 1 | 7 | 8 | 2 | 4 | 1 | 9 | 3 |
| 字段 | 标记(Tag) | 行号 | 块内地址(Offset) | |||||
Step 3:计算行号
行号 A15~A12 = 01002 = 410
因此,地址 17824193H 对应的主存单元映射到 Cache 的第 4 行(行号从第 0 行到第 15 行)。
验证(选做):也可以用取模法验证。
块号 = 地址 / 块大小 = 17824193H / 1000H
= 17824193H 右移 12 位 = 17824H
行号 = 块号 mod Cache行数 = 17824H mod 10H
= 取块号的最低 4 位 = 4H = 4
结果一致。
第5章 存储器层次结构 -- 第3节 高速缓冲存储器(Cache)。重点掌握:三种映射方式的原理和地址划分方法、Cache 容量的完整计算(包括标记和有效位)、给定地址求映射行号/组号的方法。