本文旨在简单的介绍计算机的硬件组成,包含CPU、内存、硬盘等内容。本内容是以B站马哥Linux运维课程中的操作系统基础结合相关资料整理而来。

1. 计算机组成

一台计算机由硬件、操作系统、程序组成。


计算机基础_计算机组成 计算机硬件

                                                         计算机组成                                                          

本文主要讲解计算机的硬件组成,而计算机的硬件组成可以分为运算器、控制器、存储器、输入/输出设备。其中运算器和控制器构成了CPU的主要部分。

计算机基础_计算机组成 计算机硬件_02

                                                  冯诺伊曼体系机构

2. CPU

CPU由数十亿个微型晶体管构成,它的工作可以分为三个关键阶段:CPU从系统的主存中提取指令、然后解码该指令的实际内容、然后再由CPU的相关部分执行该指令。CPU内部由寄存器、控制器、运算器和时钟四部分组成,各部分之间通过电信号连接。

     


计算机基础_计算机组成 计算机硬件_03

                                                        CPU组成



  • 寄存器:可以看作内存的一种,用来暂存指令、数据和地址。
  • 控制器:负责把内存上的指令,数据读入寄存器,并根据指令的结果控制计算机。
  • 运算器:负责运算从内存中读入寄存器的数据。
  • 时   钟:负责发出CPU开始计时的时钟信号。



根据功能的不同,可以将寄存器划分为下面这几类。

种类

功能

累加寄存器

存储运行的数据和运算后的数据

标志寄存器

用于反映处理器的状态和运算结果的某些特征以及控制指令的执行

程序计数器

用于存放下一条指令所在单元的地址的地方

基址寄存器

存储数据内存的起始位置

变址寄存器

存储基址寄存器的相对位置

通用寄存器

存储任意数据

指令寄存器

储存正在被运行的指令,CPU内部使用,程序员无法对该寄存器进行读写

栈寄存器

存储栈区域的起始位置


其中程序计数器、累加寄存器、标志寄存器、指令寄存器和栈寄存器都只有一个,其它寄存器一般有多个。在内存中的存储通过地址编号来表示,而寄存器的种类则通过名字来区分。


至于CPU的指令集,那就是Intel的架构师们的工作,总之,CPU认识这些指令,并且能执行运算。我们称之为机器代码。机器代码由二进制01字符串构成不利于人们阅读,因此人们在机器代码的基础上开发了一套汇编代码。汇编代码只有转换为本地代码才能运行。


CPU采取了一系列的措施加快指令的执行过程:

流水线:有电子厂打工经历的读者肯定很熟悉这个流水线模式。CPU的流水线工作方式和工业生产上的流水线概念一样。就是将一个指令的执行过程也分解为多个步骤,CPU中的每个电路只执行其中一个步骤,这样前赴后继加快执行速度。CPU中多个不同功能的电路单元组成一条指令处理流水线,然后将一条指令分成几个步骤后再由这些电路单元分别执行。在执行过程中,指令源源不断的送往CPU。让每个电路单元都不闲着,这样就大大的加快了执行速度。


超线程:CPU在进行线程切换的时候,要执行 切换各种寄存器状态等一些操作。把第一个线程的各种寄存器状态写回缓存中保存,然后把第二个线程的相关内容送到各种寄存器上。该过程必不可少,否则待会再将第一个线程切换回来时,不知道该线程的各个状态, 那还怎么接着继续执行呢?也正因为如此,所以这个过程比较慢,大概需要几万个时钟周期。所以后来做了这样的设计,把每个寄存器等都多做一个,就是多做一组寄存器(也包括一些其他相关电路等),,CPU在执行A线程时,使用的第一组寄存器,切换到B线程,直接使用第二组寄存器,然后再切换A线程时,再使用第一组寄存器。,CPU就不用再傻傻的等着寄存器值的切换,线程切换只需要几个时钟周期就够了。对于普通的执行多任务的计算机,CPU线程切换是个非常频繁的操作,所以使用该技术就会节省大量的时钟周期。也就是相当于加快了CPU的执行速度。这就是CPU宣传参数中所谓的四核八线程的由来,其实就是超线程技术。(每个核多做一组寄存器等电路固然会占用宝贵的空间,但是它带来的优点远远大于缺点)。

超标量技术:CPU可以在每个时钟周期内执行多个操作,可以实行指令的并行运算。在下面这个设计中,存在多个执行单元,例如,一个用来进行整数运算、一个用来浮点数运算、一个用来布尔运算。两个或更多的指令被一次性取出、解码并放入缓冲区中,直至它们执行完毕。只要一个执行单元空闲,就会去检查缓冲区是否有可以执行的指令。如果有,就把指令从缓冲区中取出来并执行。这种设计的含义是应用程序通常是无序执行的。在大多数情况下,硬件负责保证这种运算的结果与顺序执行指令时的结果相同。

计算机基础_计算机组成 计算机硬件_04

                                                         超标量图


乱序执行: 我们认为程序都是顺序执行的。但是在CPU层面上,指令的执行顺序并不一定与它们在机器级程序(汇编)中的顺序一样。比如 a = b+c; d++;这两个语句 不按照顺序执行也不会影响最终结果。当然这只是在CPU执行指令的层面,在程序员们看来,依旧认为程序是顺序执行的。


多核芯片:在芯片上有效地承载了四个微型芯片,每v个微型芯片都有自己独立的CPU。

计算机基础_计算机组成 计算机硬件_05

                                                 多核芯片结构

3. 内存

内存是一种随机存储器(RAM),表示既可以从中读取数据,也可以写入数据。当机器关闭时,内存中的信息会丢失。                            

计算机基础_计算机组成 计算机硬件_06

                                                           内存

内存是编址的,编址的单位是字节(不是比特)。为了便于理解,我们把内存模型映射成为我们现实世界的模型,在现实世界中,内存的模型很像我们生活中的楼房。在这个楼房中,1层可以存储一个字节的数据,楼层号就是地址。

计算机基础_计算机组成 计算机硬件_07

                                                       内存现实模型

内存的内部是由各种IC电路(集成电路)组成的。内存IC是一个完整的结构,它内部也有电源、地址信号、数据信号、控制信号和用于寻址的IC引脚来进行数据的读写。下面是一个虚拟的IC引脚示意图。


计算机基础_计算机组成 计算机硬件_08

                                                               内存IC

图中VCC和GND表示电源,A0~A9是地址信号的引脚,D0~D7表示的是数据信号、RD和WR都是控制信号。将电源链接到VCC和GND后,就可以对其它引脚传递0和1的信号,大多数情况下,+5V表示1,0V表示0。


我们都知道内存是用来存储数据,那么这个内存IC中能存储多少数据呢?D0~D7表示的是数据信号,也就是说,一次可以输入输出8bit = 1byte的数据。A0~A9是地址信号共十个,表示可以指定00000 00000 - 11111 11111共2的10次方=1024个地址。每个地址都会存放1byte的数据,因此我们可以得出内存IC的容量就是1KB。 


内存IC读写过程如下:

  • 写入数据:首先给VCC接通+5V的电源,给GND接通0V的电源,使用A0~A9来指定数据的存储场所,然后再把数据的值输入给D0~D7的数据信号,并把WR(write)的值置为1,执行完这些操作后,即可以向内存IC写入数据。
  • 读入数据:只需要通过A0~A9的地址信号指定数据的存储场所,然后再将RD的值置为1即可。



计算机基础_计算机组成 计算机硬件_09

                                                        内存IC读写

4. 磁盘

磁盘和内存都具有存储功能,他们都是存储设备。内存是一种高速、造价昂贵的存储设备,通过电流来实现存储。而磁盘则是速度较慢、造价低廉的存储设备,通过磁记录技术实现存储。磁盘是一种机械装置,在一个磁盘中有一个或多个金属盘片,他们以5400rpm、7200rpm、10800rpm或更高的速度旋转。从边缘开始有一个机械臂悬横在盘面上,这类似于老式播放塑料唱片33转唱机上的拾音臂。信息会写在磁盘一系列的同心圆上。在任意一个给定臂的位置,每个磁头可以读取一段环形区域,称为磁道。把一个给定臂的位置上的所有磁道合并起来,组成了一个柱面。


计算机基础_计算机组成 计算机硬件_10

                                                           磁盘

注意:固态硬盘不是磁盘,固态硬盘并没有刻意移动的部分,外形也不想唱片,并且数据是存储在存储器(闪存)中,与磁盘唯一的相似之处就是它也存储了大量即使在电源关闭也不会丢失的数据。


5. 缓存

由于CPU的计算速度远大于从内存操作数据的速度。为了加快程序的运行,CPU引入了多级缓存。缓存越接近CPU操作速度越快,大小越小。缓存遵循局部性原理:

时间局部性:被引用过一次的存储器位置的内容在未来会被多次引用

空间局部性:如果一个存储器位置的内容被引用,那么它附近的位置也很大概率被引用。


计算机基础_计算机组成 计算机硬件_11

                                           CPU缓存结构(L1和L2)

为了更充分的使用CPU的运算能力,计算机引入了多任务的概念。多任务的实现依赖于CPU的时间切片以及虚拟内存地址两项技术。CPU的时间切片可以理解为一项任务运行5ms之后切换其它任务执行,即通过时间片轮转的方法使不同的程序并发执行的。虚拟内存地址:由进程的虚地址构成的地址空间。我的理解是CPU中每一个进程的内存地址都是0-某个值(比如1024),根据不同的进程映射到不同的内存地址中。

5. 输入/输出设备

 I/O设备一般包括两个部分:设备控制器和设备本身,I/O控制器中有用于临时保存输入输出数据的内存,这个内存我们称之为就是端口。I/O控制器能够接受操作系统的指令,控制设备。

计算机基础_计算机组成 计算机硬件_12

                                                          I/O设备

I/O设备和CPU之间的信息交流通过中断机制来实现。中断用来暂停当前正在运行的程序,并跳转到其他程序运行的必要机制。


直接存储器访问(DMA):它可以控制内存和某些控制器之间的数据传输,而无需CPU的干预。

计算机基础_计算机组成 计算机硬件_13

                                                            DMA

6. 总线

以上的硬件如何连接便是总线的作用,一个典型硬件的连接关系如下:

计算机基础_计算机组成 计算机硬件_14

                                                典型硬件总线连接


I/O桥:主板的北桥/南桥芯片组,其中北桥的传输数据的速度要比南桥快。如果要加快操作计算机的硬盘数据的速度,可以将固态硬盘接到北桥上。

7. BIOS

BIOS:基本输入输出系统,BIOS是存储在芯片的ROM上。磁盘中存储的程序必须加载到内存中才能运行,在磁盘中保存的程序是无法直接运行的,这是因为负责解析和运行程序内容的CPU是需要通过程序计数器来指定内存地址从而读出程序指令的。因此,电脑开机后,BIOS会确认硬件是否正常运行,没有异常的话会启动引导程序。引导程序的功能是把在硬盘等记录的OS加载到内存中运行。


参考内容


  1. B站马哥Linux运维课程中的操作系统基础
  2. 内存--通俗理解​
  3. 程序员必知的硬核知识大全
  4. 认识操作系统