前言:本人22考研党,已上岸,本文作为对考研准备的一个收尾。
近几年基本都是线上复试,线上会更加注重概念的考察,本人在复试准备期间搜集了面试题,整理了很多资料。本文主要概括了计算机组成原理在复试面试中可能会考察的一些问题,仅供大家参考,如果对大家有帮助,希望大家点赞哦~
本文目前仅针对的是考研复试环节,不涵盖计组全部的知识,祝大家复试顺利。由于作者本人水平有限,若本文有任何不对欢迎大家留言指正!上岸不易,希望大家都能去到想去的地方,加油。
1. 计算机硬件的基本组成
存储器 分为主存和辅助。主存存放重程序和数据,辅存中的信息必须调入主存后才能被CPU访问。
控制器 由程序计数器(PC)、指令寄存器(IR)和控制单元(CU)组成。
运算器 进行算术运算和逻辑运算,核心是算数逻辑单元(ALU)。
输入
输出
2. 冯诺依曼机
冯·诺依曼提出了“存储程序”的概念,“存储程序”的思想奠定了现代计算机的基本结构,以此概念为基础的各类计算机通称为冯·诺依曼机,其特点如下:
“存储程序”的概念是指将指令以代码的形式事先输入计算机的主存储器,然后按其在存储器中的首地址执行程序的第一条指令,以后就按该程序的规定顺序执行其他指令,直至程序执行结束。
3. 编译,解释型语言
编译型语言写的程序在执行之前,需要一个专门的编译过程,把程序编译成为可执行程序,如果源程序不变以后要运行的话就不用重新翻译。解释型语言的程序不需要编译,在运行程序的时候才翻译,翻译一句执行一句,不生成目标程序,这样解释型语言每执行一次就要翻译一次,效率比较低。
4. 原码、补码、移码的比较
原码:简单易懂,最大缺点就是运算复杂,异号相加麻烦
补码可以减法转换为加法,使得机器总可以做加法运算。补码的符号位同数值位一起参加运算,也简化了运算器的结构。
移码主要用于浮点数的阶码,使用移码可以很方便的对浮点数的阶码比较运算,无论正负,从符号位开始,逐个位置比较大小。
5. 计算机性能指标
吞吐量:单位时间内处理请求的数量
主频:机器内部主时钟的频率,衡量机器速度
时钟周期:主频的倒数,是CPU中最小的时间单位
机器周期(CPU周期):一个指令周期由若干个CPU周期构成,CPU操作的最基本单位
指令周期:指令周期含有若干个机器周期
CPI:执行一条指令所用的时钟周期数
MIPS:每秒执行多少百万条指令
MFLOPS:每秒执行多少百万次浮点运算
6. 指令是什么
指令是指示计算机执行某种操作的命令,一条指令通常由两个部分组成:操作码 +地址码 。操作码指明该指令要完成的操作的类型或性质,地址码指明操作对象的内容或所在的存储单元地址。
7. 主存的分类
RAM随机存储器,在程序执行过程中可读可写,是易失性存储器,一旦写入信息就不可轻易改变。
ROM只读存储器,在程序执行过程中只可读,是非易失性存储器,掉电信息也不会丢失。
串行访问存储器:对存储单元进行读写时,按其物理位置的先后顺序寻址。
8. DRAM(动态随机存储器)和SRAM(静态随机存储器)
SRAM不需要刷新,运行快,集成低,功耗大,非破坏性读出,主要用于高速缓存;DRAM需要进行刷新(集中、异步、分散刷新),以防止信息消失;采用地址复用,行列地址分两次送,运行慢,集成高,功耗小,破坏性读出,用于主存
9. RISC(Reduced 精简指令系统计算机)和CISC(Complex 复杂指令系统计算机)
RISC指令短小、长度基本相同,数量少,操作基本在同一个周期内完成,操作简单,但寄存器的数量较多。RISC主要靠硬件实现,适合流水线的方式,RISC中只有Load/Store指令可以访存,CISC则没有限制。CISC兼容性性强,指令繁多,长度可变,支持寻址方式多,由微程序实现。
10. Cache和主存映射
(1)直接映射:直接映射就是将主存地址映射到Cache中的一个指定地址,任何时候,主存中存储单元的数据只能调入到Cache中的一个或几个位置,这是固定的,若这个位置已有数据,则产生冲突,原来的块将无条件地被替换出去。
(2)全相连映射:在这种方式下,主存中存放的数据可以调入到Cache中的任意位置,只有在Cache中的块全部装满后才会出现块冲突。
(3)组相连映射:组相连映射是指将存储空间的页面分成若干组,各组之间采用直接映射,而组内各块之间采用全相连映射。
11. Cache(高速缓冲存储器)工作原理,cache写策略
Cache通常由两部分组成,快表和快速存储器,其工作原理是:处理机判断cache中是否有被访问的数据,如果在,则Cache命中,按地址访问Cache。否则,Cache不命中,则需要访问主存,并从主存中调入相应数据块到Cache中,若Cache中已写满,则要按某种算法将Cache中的某一块替换出去。常用的替换算法:随机算法、先进先出算法和最近最少使用算法。
Cache写策略:
写回法:当Cache命中时,只修改Cache的内容,而不直接写入主存,只有当此块数据被换出时才写回主存。这种方法要为每个数据块设置一个脏位,检测是否被修改过。
当Cache未命中时,加载主存中的块到Cache中,然后在Cache中更新,最后同步到主存。(写分配法)
②全写法:当Cache命中时,同时写回Cache和主存。
当Cache未命中时,只写入主存而不写入Cache。(非写分配法)
12. 影响流水线的因素
资源冲突:争用同一资源造成 | 解决办法(下同):暂停一时钟周期
数据冲突:下一指令要用到当前指令的结果造成 | 采用数据旁路技术,即把前一条指令的ALU计算结果直接输入到下一条指令
控制冲突:转移、调用断流造成 | 采用分支预测
13. I\O方式
(1)程序查询方式:程序查询方式的核心问题是每时每刻需要不断查询I/O设备是否准备好,浪费了CPU大量的时间。
(2)程序中断方式:是在一条指令执行完成后检查是否有中断发生,若出现中断则处理,否则继续执行下一条指令。
(3)DMA方式:DMA方式是指外部设备不通过CPU而直接与主存进行数据交换的方式
DMA控制器发出请求,CPU让出系统总线由DMA接管,让外设可以直接访问内存,这样外设的读写就不需要CPU参与,降低了CPU的占用率
(4)通道方式:通道方式是构建一个通道,主存和I/O设备之间的数据交换通过通道来完成,通道方式是对DMA的发展,由一个数据块的读写发展成为一组数据块的处理。
14. 寻址方式
寻址方式 指令地址字段
立即寻址:操作数
直接寻址:操作数的地址
间接寻址:操作数地址所在存储单元的地址
寄存器直接寻址:指令字直接给出操作数所在的寄存器编号
寄存器间接寻址:寄存器给出操作数所在主存单元的地址
相对寻址:操作数的有效地址等于pc+地址A
基址寻址:有效地址等于基址寄存器中的内容+A(BX)
变址寻址:变址寄存器+A
15. 指令执行过程
取指令:将程序计数器PC中的地址给主存的地址寄存器MAR,通过MAR找到指令后放入数据寄存器MDR中,指令寄存器IR从MDR将指令取走。
分析指令:控制器根据IR中的操作码,生成相应的控制信号。
执行指令:IR的地址码,送到地址寄存器MAR,找到那个数据,送到MDR中,然后运算器的相关寄存器取走该数据。
16. 数据通路
数据在各功能部件之间传送的路径叫做数据通路,它的功能是实现CPU内部的运算器和寄存器以及寄存器之间的数据交换
17. 总线仲裁方式
仲裁是指解决多个设备同时竞争总线控制权的问题。
(1)链式查询:总线上的所有部件共用一根总线请求线,设备的先后顺序决定了其优先级;(2)计数器定时查询:采用一个计数器控制总线的使用权;
(3)独立请求方式:每一个设备均有一对总线请求信号和总线同意信号
18. TLB工作原理
TLB中的内容其实是页表中的一部分,当进行地址转换时先访问快表,若快表命中,则根据快表中的内容可以找到内存中对应的块,可以直接取数据;若TLB未命中,则要访问主存中的页表得到数据的物理地址。
19. 中断过程
中断是指由于某种原因导致CPU中止当前执行当前任务,转去对所发生的事件进行处理
关中断——保存断点——引出中断服务程序(中断隐指令)
保存现场和屏蔽字,现场信息指的是程序状态字、中断屏蔽寄存器、cpu某些寄存器。
开中断,允许中断嵌套
执行中断服务程序
关中断,保证在恢复现场的时候不被打断。
恢复现场和屏蔽字。
开中断、中断返回。
20. 端口和接口
接口是位于主存和外设之间的一种缓冲电路,包括了硬件电路和软件控制;而端口是一组寄存器,对I/O设备的访问就是通过端口访问实现的,每个端口赋予了一个唯一的地址码,称为端口地址。
21. 向量中断、中断向量、向量地址
1)中断向量:每个中断源都有对应的处理程序,这个处理程序称为中断服务程序,其入口地址称为中断向量。所有中断的中断服务程序入口地址构成一个表,称为中断向量表;也有的机器把中断服务程序入口的跳转指令构成一张表,称为中断向量跳转表。
2)向量地址:中断向量表或中断向量跳转表中每个表项所在的内存地址或表项的索引值,称为向量地址或中断类型号。
3)向量中断:指一种识别中断源的技术或方式。识别中断源的目的是找到中断源对应的中断服务程序的入口地址的地址,即获得向量地址。
22. 中断响应优先级、中断处理优先级
中断响应优先级是由硬件排队线路或中断查询程序的查询顺序决定的,不可动态改变;而中断处理优先级可以由中断屏蔽字来改变
23. 浮点数
IEEE754标准 短浮点数 数符1位,阶码8位,尾数数值23位。
浮点数加减运算过程(若有笔试则重点关注)
对阶 尾数求和 规格化 舍入 溢出判断
24. 硬布线和微程序实现控制器
首先,他们微操作信号的产生方法不同,一个是微程序代码执行中在需要的时间从控制存储器中读取,另一个是组合逻辑电路产生的信号。
微程序控制器属于存储逻辑电路,硬布线属于时序及组合逻辑电路,而且设计比较复杂。
微程序容易扩充和修改,速度慢,硬布线不利于修改扩充,但速度快。微程序多用于CISC,硬布线多用于RISC系统。
25. 微指令和机器指令
机器指令是CPU能直接识别并执行的指令。微指令:是指在机器的一个CPU周期中,一组实现一定操作功能的微命令的组合;
机器指令表现形式是二进制编码。微指令的格式分为水平型、垂直型和混合型微指令;
一条机器指令对应一个微程序,微程序是由若干条微指令构成的。一条机器指令的功能是若干条微指令组成的序列来实现的。简而言之,一条机器指令所完成的操作划分成若干条微指令来完成,由微指令进行解释和执行;
一条机器指令对应4个CPU周期,每个CPU周期就对于一条微指令。
26. 超标量、超流水线技术
超标量技术是通过重复设置多个功能部件,让这些功能部件同时工作来提高指令的执行速度,它是通过增加硬件资源为代价来换取处理器性能的。
超流水线技术:在一个时钟周期内一个功能部件使用多次
27. 总线的猝发传输方式
在一个总线周期内传输存储地址连续的多个数据字
28. 总线结构
单总线: cpu、主存、IO设备在一组总线上,cpu与主存、外设可直接信息交换你。结构简单,成本低,不支持并发
双总线 :一条主存总线,一条IO总线,将低速IO设备从单总线上分离出来。
三总线:主存总线,cpu和内存之间传送地址、数据和控制信息;IO总线,cpu和外设通信;DMA总线,内存和高速外设直接传送数据。
29. IO端口及编址
1)统一编址:这种方式cpu不需要专门的IO指令,用统一的访存指令就可以访问IO端口。
优点:不需要专门的IO指令,可以使CPU访问的操作更加灵活方便,还可使端口有较大的编址空间。
缺点:端口占用了存储器地址,使内存容量变小,而且利用这种编址方式的设备,进行数据传输时速度都会比较慢。
2)独立编址:是指IO端口地址与存储器地址无关,独立编址需要cpu设置专门的输入输出指令访问端口。
优点:IO指令与存储器指令有明显区别,程序编制更加清晰,便于理解。
缺点:IO指令少,不够灵活,并且增加了控制的复杂性。
30. DMA和中断的区别
中断方式时程序的切换,需要保护现场和恢复现场;DMA方式除了预处理和后处理,其他不使用cpu资源
对于中断请求只能在执行周期后接收到,而DMA可以是取址间址执行周期的任何一个机器周期结束后。
中断传送过程需要cpu干预,DMA传送过程不需要cpu干预,DMA更快。
DMA请求优先级高于中断请求
从数据传送来看,中断方式靠程序,DMA靠硬件。
31. Cache和虚拟存储器的区别
工作环境不同:Cache是介于CPU和主存之间的存储器,虚拟存储器是介于主存和辅存之间的存储器。
目的不同:虚拟存储器是为了解决主存容量,cache是为了解决系统速度
透明性不同:虚拟存储器是逻辑上的存储器,对系统程序员不透明,对应用程序员透明;cache全由硬件实现,是硬件存储器,对二者都透明
不命中时的影响:虚拟存储器的要比cache大。cache不命中时主存能和cpu直接通信,虚拟存储器不命中时,只能先由硬盘调入主存,而不能直接和cpu通信。
32. 内存的扩展
字拓展 增加存储器中字的数量,片选线不一样,地址线,数据线都用一根线
位拓展 增加同一个地址下的存储单元的位数,地址线和片选线一样,不一样的数据线,低8位数据线和高8位数据线 2根数据线
字位同时拓展 同时扩充字和位
我想向我的Controller传递一个参数,它是一个简单的复选框,但我不知道如何在模型的form_for中引入它,这是我的观点:{:id=>'go_finance'}do|f|%>Transferirde:para:Entrada:"input",:placeholder=>"Quantofoiganho?"%>Saída:"output",:placeholder=>"Quantofoigasto?"%>Nota:我想做一个额外的复选框,但我该怎么做,模型中没有一个对象,而是一个要检查的对象,以便在Controller中创建一个ifelse,如果没有检查,请帮助我,非常感谢,谢谢
这里是Ruby新手。完成一些练习后碰壁了。练习:计算一系列成绩的字母等级创建一个方法get_grade来接受测试分数数组。数组中的每个分数应介于0和100之间,其中100是最大分数。计算平均分并将字母等级作为字符串返回,即“A”、“B”、“C”、“D”、“E”或“F”。我一直返回错误:avg.rb:1:syntaxerror,unexpectedtLBRACK,expecting')'defget_grade([100,90,80])^avg.rb:1:syntaxerror,unexpected')',expecting$end这是我目前所拥有的。我想坚持使用下面的方法或.join,
似乎无法为此找到有效的答案。我正在阅读Rails教程的第10章第10.1.2节,但似乎无法使邮件程序预览正常工作。我发现处理错误的所有答案都与教程的不同部分相关,我假设我犯的错误正盯着我的脸。我已经完成并将教程中的代码复制/粘贴到相关文件中,但到目前为止,我还看不出我输入的内容与教程中的内容有什么区别。到目前为止,建议是在函数定义中添加或删除参数user,但这并没有解决问题。触发错误的url是http://localhost:3000/rails/mailers/user_mailer/account_activation.http://localhost:3000/rails/mai
当我在我的Rails应用程序根目录中运行rakedoc:app时,API文档是使用/doc/README_FOR_APP作为主页生成的。我想向该文件添加.rdoc扩展名,以便它在GitHub上正确呈现。更好的是,我想将它移动到应用程序根目录(/README.rdoc)。有没有办法通过修改包含的rake/rdoctask任务在我的Rakefile中执行此操作?是否有某个地方可以查找可以修改的主页文件的名称?还是我必须编写一个新的Rake任务?额外的问题:Rails应用程序的两个单独文件/README和/doc/README_FOR_APP背后的逻辑是什么?为什么不只有一个?
目前,Itembelongs_toCompany和has_manyItemVariants。我正在尝试使用嵌套的fields_for通过Item表单添加ItemVariant字段,但是使用:item_variants不显示该表单。只有当我使用单数时才会显示。我检查了我的关联,它们似乎是正确的,这可能与嵌套在公司下的项目有关,还是我遗漏了其他东西?提前致谢。注意:下面的代码片段中省略了不相关的代码。编辑:不知道这是否相关,但我正在使用CanCan进行身份验证。routes.rbresources:companiesdoresources:itemsenditem.rbclassItemi
HashMap中为什么引入红黑树,而不是AVL树呢1.概述开始学习这个知识点之前我们需要知道,在JDK1.8以及之前,针对HashMap有什么不同。JDK1.7的时候,HashMap的底层实现是数组+链表JDK1.8的时候,HashMap的底层实现是数组+链表+红黑树我们要思考一个问题,为什么要从链表转为红黑树呢。首先先让我们了解下链表有什么不好???2.链表上述的截图其实就是链表的结构,我们来看下链表的增删改查的时间复杂度增:因为链表不是线性结构,所以每次添加的时候,只需要移动一个节点,所以可以理解为复杂度是N(1)删:算法时间复杂度跟增保持一致查:既然是非线性结构,所以查询某一个节点的时候
项目介绍随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱小学生兴趣延时班预约小程序的设计与开发被用户普遍使用,为方便用户能够可以随时进行小学生兴趣延时班预约小程序的设计与开发的数据信息管理,特开发了小程序的设计与开发的管理系统。小学生兴趣延时班预约小程序的设计与开发的开发利用现有的成熟技术参考,以源代码为模板,分析功能调整与小学生兴趣延时班预约小程序的设计与开发的实际需求相结合,讨论了小学生兴趣延时班预约小程序的设计与开发的使用。开发环境开发说明:前端使用微信微信小程序开发工具:后端使用ssm:VU
我对如何计算通过{%assignvar=0%}赋值的变量加一完全感到困惑。这应该是最简单的任务。到目前为止,这是我尝试过的:{%assignamount=0%}{%forvariantinproduct.variants%}{%assignamount=amount+1%}{%endfor%}Amount:{{amount}}结果总是0。也许我忽略了一些明显的东西。也许有更好的方法。我想要存档的只是获取运行的迭代次数。 最佳答案 因为{{incrementamount}}将输出您的变量值并且不会影响{%assign%}定义的变量,我
我是Ruby的新手,有些闭包逻辑让我感到困惑。考虑这段代码:array=[]foriin(1..5)array[5,5,5,5,5]这对我来说很有意义,因为i被绑定(bind)在循环之外,所以每次循环都会捕获相同的变量。使用每个block可以解决这个问题对我来说也很有意义:array=[](1..5).each{|i|array[1,2,3,4,5]...因为现在每次通过时都单独声明i。但现在我迷路了:为什么我不能通过引入一个中间变量来修复它?array=[]foriin1..5j=iarray[5,5,5,5,5]因为j每次循环都是新的,我认为每次循环都会捕获不同的变量。例如,这绝对
给定一个nxmbool数组:[[true,true,false],[false,true,true],[false,true,true]]有什么简单的方法可以返回“该列中有多少个true?”结果应该是[1,3,2] 最佳答案 使用转置得到一个数组,其中每个子数组代表一列,然后将每一列映射到其中的true数:arr.transpose.map{|subarr|subarr.count(true)}这是一个带有inject的版本,应该在1.8.6上运行,没有任何依赖:arr.transpose.map{|subarr|subarr.in