《计算机科学导论》课后习题 第5章 计算机组成

发布时间 2023-12-25 17:05:39作者: Acolyte_9527

如果您的答案与我不同,并有个人的理解,欢迎在评论区讨论。

一、复习题

Q5-1 计算机由哪三个子系统组成?

A:中央处理单元CPU,主储存器,输入/输出子系统。

Q5-2 CPU由哪几个部分组成?

A:算数逻辑单元ALU,控制单元,寄存器组。

Q5-3 ALU的功能是什么?

A:对数据进行逻辑、位移、算术运算。

Q5-4 控制单元的功能是什么?

A:控制各个子系统的操作。

Q5-5 主存的功能是什么?

A:储存数据。

Q5-6 定义RAM、ROM、SRAM、DRAM、PROM、EPROM、EEPROM。

A:

  • RAM:随机存取存储器,可以使用存储单元地址来随机存取一个数据项,而不需要存取位于它前面的所有数据项。用户可读写。断电后信息丢失。
  • ROM:只读存储器,内部的信息由制造商写入。用户只读不写。断电后信息不丢失。
  • SRAM:静态RAM,用触发器门电路保存数据。断电后信息部丢失。速度快,价格贵。
  • DRAM:动态RAM,是同电容器,充电为1、放电为0,由于电容器会随时间漏掉一部分电,故内存单元需要周期性刷新。速度较慢,价格便宜。
  • PROM:可编程ROM,出场状态为空白,用户借助特殊设备可在PROM上存储程序,一旦存储不能重写。可以用来存储一些特定程序。
  • EPROM:可擦除可编程ROM。用户可编程,特殊紫外光仪器进行擦写。擦除时需要拆卸后重新安装。
  • EEPROM:电可擦除可编程ROM。编程、擦除用电子脉冲信号即可,擦除时不需要拆卸。

Q5-7 高速缓冲存储器的作用是什么?

A:提高运算的速度。

Q5-8 描述一下磁盘的物理组成。

A:磁盘是由一张张磁片叠加而成。这些磁片由薄磁膜封装起来。

Q5-9 磁盘和磁带表面是怎样组织的?

A:

  • 磁盘表面被划分为磁道,每个磁道又分成若干扇区。磁道之间通过磁道间的间隔隔开,扇区之间通过扇区间的间隔隔开。
  • 磁带表面的宽度分为9个磁道,磁道上上的每个点可以存储1位信息。垂直切面的9个点可以存储8位(1字节)信息,还有一位用作村务检测。

Q5-10 比较分析CD-R、CD-RW、DVD。

A:

  • CD-R,可刻录光盘。
  • CD-RW,可重写光盘。
  • DVD,数字多功能光盘。
    具体工艺上的差别很大,书上都有。光盘这种东西,除了一些特殊的情景(特殊工作单位、收藏爱好者等)需要用到光盘存储,已经离一般用户挺远了。加上篇幅挺长的,不抄书了。

Q5-11 比较分析SCSI、火线和USB控制器。

A:

  • SCSI,小型计算机系统接口,1984年为Macintosh计算机设计的接口。8、16或32线的并行接口。提供菊花链连接,连接链两端需有终结器,每个设备目标ID唯一。
  • 火线,IEEE标准1394规定的高速串行接口。数据包形式数据传送。可在一条菊花链或树形连接上连接63个设备。不需要终结器。
  • USB,通用串行总线。数据包形式数据传送,每个包含有:地址部分(设备标识)、控制部分、数据部分(需要传送到其他设备的)。所有设备接收相同的包,但只有数据包中所定义的地址的设备接受数据包。

Q5-12 比较分析两种I/O设备寻址的方法。

A:

  • I/O独立寻址:用来读写内存的指令与用来读写I/O设备的指令不相同,有专门的指令完成对I/O设备的测试、控制、读写。每个I/O设备有自己的地址。因指令不同,I/O设备地址可以和内存地址重叠而不混淆。
  • I/O存储器映射寻址:CPU将I/O控制器中的每一个寄存器看作内存中的某个存储字,CPU没有单独的指令用来表示是从内存还是从I/O设备传送数据。优点是指令集小巧,内存和I/O设备公用指令。缺点是I/O设备占用部分内存地址。

Q5-13 比较分析三种同步CPU和I/O设备的方法。

A:

  • 程序控制I/O:CPU等待I/O设备。CPU和I/O设备间的数据传输同故宫程序中的指令实现。当CPU遇到一条I/O设备时,它就停止工作直到数据传输完毕。CPU不时查询I/O设备状态:如果设备做好了传输准备,则数据将被传送到CPU;如果设备没有做好传输准备,则CPU将继续查询I/O设备的状态直到I/O设备准备好。缺点在于,每一个单元数据被传输时,CPU都要浪费时间去查询I/O设备状态。另,数据在输入操作后被传送到内存,在输出操作前是从内存中取出。
  • 中断控制I/O:首先CPU告知I/O设备即将开始传输,但是CPU不需要不停查询I/O设备状态。当I/O设备准备好时,它通知(中断)CPU。CPU时间没有浪费,慢速I/O设备正在完成一项任务时,CPU可做其他工作。另,数据在输入操作后被传送到内存,在输出操作前是从内存中取出。
  • DMA,直线存储器存取:用于高速I/O设备间传输大量的数据块,如磁盘、内存(不需要通过CPU的数据传输)。需要一个DMA控制器承担部分CPU功能。DMA控制器中有寄存器,可在内存传输前后保存数据块。进行I/O操作时,CPU发送消息给DMA,消息包括:传输类型(输入/输出)、内存单元的起始地址、传输字节数。之后CPU就可做其他工作。当准备好传输数据时,DMA控制器通知CPU获得总线的使用权,这时CPU停止使用总线。内存和DMA间数据传输完成后,CPU继续工作。这种方法中,CPU仅在DMA和内存间传输数据时才有一小段时间空闲,而不是在设备为传输数据做准备时。

Q5-14 比较分析CISC体系结构和RISC体系结构

A:
CISC,复杂指令集计算机complex instruction set computer:设计策略是使用大量的指令,包括复杂指令。编程容易。但CPU和控制单元的电路非常复杂,解决方法是,CPU不直接执行机器语言命令,只执行“微操作”。复杂指令转化为一系列简单操作后由CPU执行。需要“微内存”,保存指令集中每个复杂指令的一系列操作。缺点:微程序设计和存取微内存的开销。优点:机器层上的程序更简洁。(英特尔奔腾系列)
RISC,精简指令集计算机reduce instruction set computer:少量的指令集完成最少的简单操作。复杂指令用简单指令子集模拟。缺点:程序设计及更难更费时。
这里放一个简介最新开源RISC-V架构境况的视频。大家兼听则明。
详见:20231115-RISC_V境况简介-差评君

Q5-15 描述流水线及其作用。

A:控制单元同时执行两个或三个阶段,使得下一条指令在前一条指令完成前开始。
作用是改善吞吐量,即单位时间内完成的指令总数。

Q5-16 描述并行处理及其作用。

A:多个控制单元,多个算术逻辑单元,多个内存单元的计算机,在同一时间同时处理多个指令。
作用是改善吞吐量。

二、练习题

P5-1 一台计算机有64MB(兆字节)的内存,每个字长为4字节。那么在存储器中对每个字寻址需要多少位。

A:
内存:\(64 MB=2^6×2^{10}×2^{10}×2^3=2^{28} BIT\)
单字占用内存:\(4 B=2^2×2^3=2^5 BIT\)
内存中可存储单字个数:\(2^{28}÷2^5=2^{23}\)
寻址位数:\(log_{2}23=23 位\)
稍微学习了点Mathjax语法,输入公式方便多了。

P5-2 如果屏幕有25行,每行80字符,则需要多少字节的内存用于存储全屏的数据?如果系统使用ASCII码,每个ASCII码字符占1字节。

A:
单个扩展ASCII字符占用内存:1B
一屏扩展ASCII单字占用内存:\(25×80=2000B\)
ASCII码有两种,一种使用7BIT表示128个字符的标准ASCII,另一种是扩展后用8BIT表示256个字符的扩展ASCII,这里应该说的是扩展ASCII。

P5-3 假如一台计算机有16个数据寄存器(R0~R15),1024个字的存储空间以及16种不同的指令(如add、subtract等),那么下面这条指令最少需要占多少位空间?

指令:add M R2
A:
指令意义不明,M到底是一个字符,还是指代内存?是字符的话又怎么能相加?add的意思到底是相加,还是“添加、存放”之类的意思?这个指令到底是指把寄存器里的东西放进内存(或者反过来),还是把内存和寄存器里的数据相加?
我姑且把这条指令理解为“操作码+内存地址+寄存器地址”的模式,不管意义。

指令add,占用空间:\(log_{2}16=4BIT\)
内存地址M,占用空间:\(log_{2}1024=10BIT\)
寄存器寻址占用空间:\(log_{2}16=4BIT\)
指令add M R2占用空间:\(4+10+4=18BIT\)

P5-4 在P5-3题中,如果数据和指令使用相同的字长,那么每个数据寄存器大小是多少?

A:数据寄存器大小=数据字长=指令字长=4BIT

P5-5 在P5-3题中,计算机中的指令寄存器大小是多少?

A:指令寄存器大小为单个指令字长,4BIT

P5-6 在P5-3题中,计算机中的程序计数器大小是多少?

A:我查到的说法是,程序计数器存放的是指令的地址,大小就是内存的寻址位数
程序计数器大小为,10BIT

P5-7 在P5-3题中,数据总线为多少位?

A:数据总线位数=计算机数据字长,4BIT

P5-8 在P5-3题中,地址总线为多少位?

A:地址总线位数=存储空间寻址位数,10BIT

P5-9 在P5-3题中,控制总线最少需要多少位?

A:控制总线位数=指令集位数,4BIT

P5-10 计算机使用I/O独立寻址。内存为1024个字。如果每个控制器包括16个寄存器,那么计算机可以存取多少个控制器?

A:1024÷16=64

P5-11 计算机使用I/O存储器映射寻址。地址总线为10条(10位)。如果内存为1000个字,那么计算机可以存取多少个四位寄存器控制器?

A:地址总线位数=存储空间寻址位数=10BIT
10×1000÷4=2500

P5-12 使用5.8节中的简单计算机指令集,编写执行下列计算的程序代码:D←A+B+C。A、B、C、D是二进制补码格式的整数,用户输入A、B、C的值,D的值显示在监视器上。

A:

//将ABC放入内存
STORE M0 A
STORE M1 B
STORE M2 C
//将ABC载入寄存
LOAD R0 M0
LOAD R1 M1
LOAD R2 M2
//加法运算
ADDI R3 R0 R1
ADDI R4 R2 R3
//运算结果存入内存,停机
STORE M3 R4
HALT

P5-13 使用5.8节中的简单计算机指令集,编写执行下列计算的程序代码:B←A+3。A和3是二进制补码格式的整数,用户输入A的值,B的值显示在监视器上。(提示:使用加1指令)

A:

//将A放入内存,接着载入寄存
STORE M0 A
LOAD R0 M0
//3次自加运算
INC R0
INC R0
INC R0
//运算结果放入内存,停机
STORE M1 RO
HALT

P5-14 使用5.8节中的简单计算机指令集,编写执行下列计算的程序代码:B←A-2。A和2是二进制补码格式的整数,用户输入A的值,B的值显示在监视器上。(提示:使用减1指令)

A:

//将A放入内存,接着载入寄存
STORE M0 A
LOAD R0 M0
//2次自减运算
DEC R0
DEC R0
//运算结果放入内存,停机
STORE M1 R0
HALT

P5-15 使用5.8节中的简单计算机指令集,为程序编写代码,该程序完成n个从键盘输入的整数的相加,并显示它们的和。你首先需要输入n的值。(提示:使用减1指令和跳转指令,重复n次加运算)

A:又是个语义混乱的题目,前面说n个整数求和,后面又只说输入一次n的值,用自减指令和n次重复加法。
我的理解是输入n,累加n次n。相当于n乘以n,这个程序也许是在模拟平方运算。
用一个乱七八糟的指令集来编程实在蛋疼,我直接用Java写for循环吧……

public class Demo {  
    public static void main(String[] args) {  
        Scanner scanner = new Scanner(System.in);//创建scanner实例以获取用户输入
        int n = scanner.nextInt();//声明n为用户输入值  
        int result = 0;//声明一个运算结果result,初始值为0  
        for(int i = n; i>0; i--) {//for循环,执行n次,每次+n
            result = result + n;  
        }  
        System.out.println(result);//输出结果result
        scanner.close();//关闭scanner流
    }  
}

P5-16 使用5.8节中的简单计算机指令集,为程序编写代码,该程序接收从键盘来的两个整数,如果第一个整数为0,程序把第二个整数加1;如果第一个整数是1,程序把第二个整数减1。第一个整数必须是0或1,否则程序失败。程序显示加1或减1的结果。

A:还是用Java写吧

public class Demo {  
    public static void main(String[] args) {  
        Scanner scanner = new Scanner(System.in);//创建scanner实例以获取第一个数字
        System.out.println("请输入第一个数字(只能输入0或1):");  
        int a = scanner.nextInt();  
        if(a == 0 || a == 1) {//因为判断比较简单,直接写了一个if选择
            scanner = new Scanner(System.in);//判定成功,重置scanner获取第二个数字  
            System.out.println("请输入第二个数字:");  
            int b = scanner.nextInt();  
            switch(a) {//switch选择分别处理第一个数字是0或者1的情况  
                case 0:  
                    b = b + 1;  
                    System.out.println(b);  
                    break;  
                case 1:  
                    b = b - 1;  
                    System.out.println(b);  
                    break;  
            }  
        } else {//判断失败,一个简单的非法输入提示
            System.out.println("非法输入,程序失败。");  
        }  
        scanner.close();  
    }  
}

简单写写,没有考虑题目中没有提及的其他异常。