1 Star 2 Fork 0

神奇码农 / WebInterview

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
该仓库未声明开源许可证文件(LICENSE),使用请关注具体项目描述及其代码上游依赖。
克隆/下载
计算机基础.md 12.83 KB
一键复制 编辑 原始数据 按行查看 历史
unknown 提交于 2021-03-05 20:08 . 拆分

计算机基础

1.CPU基础

CPU即处理器,是计算机中控制数据操控的电路。它主要由三部分构成:算术/逻辑单元、控制单元和寄存器单元。它们的作用分别为执行运算、协调机器活动以及临时存储。

2.CPU与主存

CPU中的寄存器分为通用寄存器和专用寄存器,通用寄存器用于临时存放CPU正在使用的数据,而专用寄存器用于CPU专有用途,比如指令寄存器和程序计数器。CPU与主存的通过总线进行通信,CPU通过控制单元能够操作主存中的数据。 执行两个数值相加的过程大致为:从主存读取第一个值放到寄存器1->从主存读取第二个值放到寄存器2->两个寄存器保存的值作为输入送到加法电路->将加法结果保存到寄存器3->控制单元将结果放到主存中。

3.程序等同数据

原始的计算机并不像现代计算机一样将程序保存起来,以前的人们只对数据进行保存,而设备执行的步骤作为计算机的一部分而被内置在控制单元中。这样就很不灵活,最多只能通过重新布线来提升灵活性。将程序与数据视作相同本质是很大的思想突破,因为人们一直认为它们是不同的事物,数据应该存放在主存中而程序应该属于CPU的一部分。 将程序作为数据一样保存在主存中大有好处,控制单元能够从主存读取程序,然后对它们解码并执行。当我们要修改执行程序时可以在计算机的主存中修改,而不必对CPU更改或重新布线。

4.指令系统

程序包含了大量的机器指令,CPU对这些指令进行解码并执行。CPU分为两类体系:精简指令集计算机(RISC)和复杂指令集计算机(CISC)。RISC提供了最小的机器指令集,计算机效率高速度快且制造成本低。而CISC提供了强大丰富的指令集,能更方便实现复杂的软件。 机器指令分为三类:数据传输类、算术/逻辑类与控制类。 数据传输类指令用于将数据从一个地方移动到另一个地方。比如将主存单元的内容加载到寄存器的LOAD指令,反之将寄存器的内容保存到主存的STORE指令。此外,CPU与其它设备(键盘、鼠标、打印机、显示器、磁盘等)进行通信的指令被称为I/O指令。 算术/逻辑类指令用于让控制单元请求在算术/逻辑单元内执行运算。这些运算包括算术、与、或、异或和位移等。 控制类指令用于指导程序执行。比如转移(JUMP)指令,它包括无条件转移和条件转移。

5.指令寄存器与程序计数器

CPU将主存的指令加载进来解码并执行,其中涉及两个重要寄存器:指令寄存器与程序计数器。指令寄存器用于存储正在执行的指令,而程序计数器则保持下一个待执行的指令地址。 CPU向主存请求加载程序计数器指定的地址的指令,将其存放到指令寄存器中,加载后将程序计数器的值加2(假如指令长度为2个字节)。

6.指令如何执行

比如我们要计算11+22,假设过程为:将主存地址为00的内容加载到寄存器1中->将主存地址为01的内容加载到寄存器2中->将寄存器1和寄存器2的数据相加并将结果保存到寄存器3->将寄存器3的结果存储到主存地址为02的位置->停止。 这个过程CPU涉及到四个操作:加载(load)、存储(store)、加法(add)和停止(halt)。可以对这些操作进行编码,比如可以分别用1、2、3、0000表示。

1100
1201
3312
2302
0000

7.控制器

CPU与其他设备的通信一般通过控制器来实现,控制器可能在主板上,也可能以电路板形式插到主板。控制器本身可以看成是小型计算机,也有自己简单的CPU。以前每连接一种外设都需要购买对应的控制器,而现在随着通用串行总线(USB)成为通用的标准,很多外设都可以直接用USB控制器作为通信接口。每个控制器都连接在总线上,通过总线进行通信。

8.直接存储器存取

直接存储器存取(DMA)是一种提升外设通信性能的措施,CPU并非总是需要使用总线,在总线空闲的时间里控制器能够充分利用起来。因为控制器都与总线相连接,而控制器又有执行指令的能力,所以可以将CPU的一些工作分给控制器来完成。比如在磁盘中检索数据时,CPU可以将告知控制器,然后由控制器找到数据并放到主存上,期间CPU可以去执行其他任务。这样能节省CPU资源。不过DMA会使总线通信更加复杂,而且会导致总线竞争问题。总线瓶颈源自冯诺依曼体系结构。 专注于人工智能、读书与感想、聊聊数学、计算机科学、分布式、机器学习、深度学习、自然语言处理、算法与数据结构、Java深度、Tomcat内核等。

9.什么是程序局部性?为什么会有程序的空间局部性?

程序局部性是指程序在运行时呈现出局部性规律,在一段时间间隔内,程序的执行是局限在某个部份,所访问的存储空间也只局限在某个区域。

程序的空间局部性是指若一个存储单元被访问,那么它附近的单元也可能被访问,这是由于程序的顺序执行引起的。

10.为了实现重定位,需要哪些硬件?

最简单的方式是在系统中增设一个重定位寄存器,用来存放正在执行作业的内存地址,每次访问数据时,由硬件自动将相对地址与重定位寄存器中的起始地址相加,形成实际的特理地址。当然在分页式与分段式系统中,具地址变换机构,以及快表等硬件。

11.在交互式系统中,非剥夺是不是一个好的策略?为什么?

非剥夺方式:分派程序一旦把处理机分配给某进程后便让它一直运行下去,直到进程完成或发生某事件而阻塞时,才把处理机分配给另一个进程。

剥夺方式:当一个进程正在运行时,系统可以基于某种原则,剥夺已分配给它的处理机,将之分配给其它进程。剥夺原则有:优先权原则、短进程、优先原则、时间片原则。

在分时系统中不剥夺并不是一个好的策略。因为,在分时系统中,除了交互性以外,及时性是很重要的性能因素。当一个作业被阻塞后,CPU就完全空闲了,别的用户的及时性就无法保证了,而完全可以把这些时间分配给别的作业运行。以提高整体的吞吐量。

12.谈一谈计算机网络和分布式计算机系统的区别

两者在计算机硬件连接、系统拓朴结构和通信控制等方面基本都是一样的,它们都具有通信和资源共享的功能。

区别关键在于:分布式计算机系统是在分布式计算机操作系统支持下,进行分布式数据库处理的,也就是说各互联的计算机可以互相协调工作,共同完成一项任务,多台计算机上并行运行。且具有透明性,用户不知道数据、资源的具体位置,整个网络中所有计算机就像是一台计算机一样;而计算机网络却不具备这种功能,计算机网络系统中的各计算机通常是各自独立进行工作的。

13.为什么要引入多道程序技术?

因为引入多道程序技术后,可以进一步提高了CPU利用率(阻塞),提高内存和I/O设备利用率(小作业把内存浪费了),增加系统吞吐量(两都提高后的必然)。

14.处理器如何读并解释存储在内存中的指令

比如在Unix系统中,通过shell输入./hello,“hello world”是如何展示到屏幕上的呢

linux> ./hello
hello world
linux>

要想了解其中原理,需要先知道计算机的硬件组成

15.总线

贯穿整个系统的电子通道,传输的是定长的字节块。而字节中的字长是一个系统参数,各系统不相同,现在通常是4字节(32位),8字节(64位)

16.I/O设备

I/O(输入/输出)设备是系统与外部世界的联系通道。键盘、鼠标、显示器、磁盘都输入I/O设备,并通过控制器或者适配器与I/O总线相连

17.主存

主存是一个临时存储设备,在处理器处理程序过程中,临时存储程序和数据,从物理上讲,是由一组动态随机存取存储器(DRAM)芯片组成的,从逻辑上讲,存储的是一个线性的字节数组,每个字节都有唯一的地址(数组索引)。

18.处理器

中央处理单元(CPU),简称处理器,是解释或执行存储在主存中指令的引擎。

19.计算机如何访问信息

CPU通过寄存器来存储整数数据和指针,比如X86-64的CPU包含一组16个存储64位的通用目的寄存器,这16个寄存器各司其职,其中最特别的是栈指针%rsp,用来指明运行时栈的结束位置。更重要的是,有一组标准的编程规范控制着如何使用寄存器来管理栈、传递函数参数、函数的返回值、以及存储局部或临时变量。

20.什么是操作数指示符

大多数指令中有一个或多个“操作数”,指示出执行一个操作中的源数据以及放置结果的目标位置。操作数有三类

  • 立即数,用来表示常数值
  • 寄存器,用来表示某个寄存器的内容
  • 内存引用,根据计算出来的地址访问某个内容

21.如何传送数据

通过指令,可以实现寄存器和内存之间的数据传送

C语言中的“指针”指的是地址,间接引用指针就是将该指针放到一个寄存器中,然后在内存引用中使用这个寄存器

22.栈数据如何压入和弹出

因为栈和数据都是放到同一内存中的,可以通过内存寻址方法来访问栈内的任意位置,栈向地址方向增长,所以压栈是减少栈指针(寄存器%rsp的值),并将数据存放到内存中,而出栈是从内存中读数据,增加栈指针的值

23.如何进行算数和逻辑操作

也是通过指令,大多数操作分成了指令类,指令类有各种带不同大小操作数的变种,比如指令类ADD由四个加法指令组成:addb、addw、addl和addq,分别是字节加法、字加法、双字加法和四字加法。每个指令类都对应四个操作,分别是

  • 加载有效地址
  • 一元操作
  • 二元操作
  • 移位

其中一元操作有一个操作数、二元操作有两个操作数

24.什么是“加载有效地址”

加载有效地址指令leaq实际上是movq指令的变形,它的指令形式是从内存读数据到寄存器,但该指令并不是从内存位置读入数据,而是将有效地址写入目的操作数。

25.什么是一元和二元操作

  1. 一元操作只有一个操作数,即是源又是目的,可以是一个寄存器,也可以是一个内存位置,比如i++和i--
  2. 二元操作,第二个数即是源又是目的,比如x-=y,第一个数是源操作数,第二个数是目的操作数

参考链接

https://blog.csdn.net/lingess/article/details/98479704

https://juejin.cn/post/6844904181816360968

1
https://gitee.com/WebInterviewHub/WebInterview.git
git@gitee.com:WebInterviewHub/WebInterview.git
WebInterviewHub
WebInterview
WebInterview
master

搜索帮助