前端相关的计算机基础(二):计算机组成原理

587 阅读27分钟

本文参考王道的《计算机组成原理》,对计算机硬件的各部件(输入输出设备、cpu、存储器等)进行必要的讨论,为学习其他计算机相关做必要的知识储备。

1 计算机系统概述

1.1 计算机发展历史

计算机经历了一代机电子管时代、二代机晶体管时代、三代机中小规模集成电路、现在的四代机超大规模集成电路时代。

计算机分类

  • 模拟计算机
  • 数字计算机
    • 专用计算机
    • 通用计算机
      • 巨型机
      • 大型机
      • 中型机
      • 小型机
      • 微型机
      • 单片机

1.2 计算机系统层次结构

1.2.1 计算机系统组成

计算机系统由硬件系统和软件系统组成,硬件是有形的物理设备,软件是指在硬件上运行的程序和相关的数据及文档。对于计算机系统的某个功能,如果软硬件都能实现,硬件实现效率高,软件实现较灵活。

1.2.2 计算机硬件的基本组成

  1. 早期的冯诺依曼机
    冯诺依曼提出的存储程序和二进制的思想奠定了现代计算机的基本结构。
    存储程序指的是将指令以代码的形式提前输入计算机的主存储器,然后按照指令顺序依次执行,直到程序执行结束。
    以此概念为基础的各类计算机统称为冯诺依曼机,包含运算器、存储器、控制器、输入设备和输出设备五种,以运算器为中心
  2. 现代计算机的组织结构 在微处理器问世之前,运算器和控制器分离,而且存储器容量很小,因此以运算器为中心,输入输出设备通过运算器与存储器攒送数据。
    后来随着计算机数据处理量的增多、i/o和cpu速度相差越来越大,现代计算机发展成以存储器为中心,数据传输绕过运算器,直接在i/o设备和存储设备间进行、
  3. 计算机的功能部件 冯诺依曼五大部件分别表示
  • 输入设备
    用来将程序和数据以机器所能识别和接受的信息形式输入计算机。
  • 输出设备
    将计算机处理的结果以人们所能接受的形式或其他系统所要求的信息形式输出。
  • 存储器
    用来存放程序和数据。存储器分为主存和辅存,cpu可以直接访问的存储器是主存,辅存存储的信息必须调入主存后才能被cpu访问。主存由许多存储单元组成,每个存储单元包含若干存储元件,每个存储元件存储一位2进制,即每个存储单元可存储一串二进制代码,这段代码位数被称为存储字长
    主存储器用来存放二进制信息,按地址存取。其中地址寄存器(MAR)存放访问地址,在存储体中找到对应的存储单元,其位数对应着存储单元的个数,比如如果是10位,则有2^10个存储单元。数据寄存器(MDR)用于暂存要从存储体中读或写的信息,其位数与存储字长相等;时序控制逻辑用于存储操作的各种时序信号

即存储单元个数*每个存储单元位数等于主存最大容量

虽然mdr和mar属于存储器,但是被放在cpu中,包括后文提到的cache.

  • 运算器 运算器是计算机的执行部件,用于算术运算(比如加减乘除)和逻辑运算(比如或与非、异或、比较、移位等)
    运算器的核心是算术逻辑单元(alu),另外还包含存放alu运算信息的标志寄存器(又叫程序状态寄存器,psw)和累加器(acc)、乘商寄存器(mq)、操作数寄存器(x)等通用寄存器。
  • 控制器
    控制器用来控制各部件工作,由程序计数器(pc)、指令寄存器(ir)和控制单元(cu)组成。其中pc存放将要执行的指令地址,可以自动加1形成下一条指令地址,连接主存的mar;ir存放当前的指令,来自主存的mdr.指令中的操作码op送至cu用来分析并发出各种命令序列,指令中的地址码ad送往mar获取操作数。

一般将运算器和控制器集成到一起,称为cpu,cpu和主存构成主机,其他硬件(包括外存和i/o)称为外设。
cpu和主存之间通过一组总线连接,包括

  • 地址总线 将mar上的地址送到地址总线用于指向读写的主存存储单元
  • 控制总线 包括读写信号线,指出mdr上的数据是从主存读取还是写入
  • 数据总线 利用mdr读写主存

1.2.3 计算机软件的分类

  1. 系统软件和应用软件 软件按功能分为系统软件和应用软件两种,其中前者是保证计算机系统高效、正确运行的基础,比如操作系统;后者是用户为解决某个应用问题安装的程序。

  2. 三个级别的语言 1)机器语言,又称二进制语言,编程人员需要直接编辑每条指令的二进制编码,可以被计算机直接识别和执行
    2)汇编语言,用英文单词或者缩写代替二进制的指令,需要经过汇编程序处理才能在计算机运行
    3)高级语言,是为方便程序员编写而开发的语言,需要经过编译才能才能在计算机运行

1.2.4 计算机系统的多级层次结构

计算机是一个软硬件组合的综合体,类似于计算机网络的分层,将整个计算机系统的功能按模块(分层)实现,每一个软硬件设计者和使用者只需要关心特定的层次,不需要关心下层是怎么工作的。
各层次之间,下层是上层的基础,上层是下层的扩展,计算机组成原理这个学科主要是讨论了最下面两层。通常把没有配备软件的计算机称为裸机,上面三层称为虚拟机,即软件实现的机器。

1.3 计算机性能指标

  • 机器字长 是一次整数运算所能处理的二进制的位数
  • 主存容量 是主存储器所能存储的最大容量,即存储单元个数×每个存储单元位数,比如mar是16位,mdr是32位,则结果是2^16×32位,关于32位最大4g的算法是2^32×8bit=4GB

2 数据的表示和运算

2.1 数制与编码

2.1.1 进位计数值与相互转换

  1. 进位计数法
    进位计数法是一种计数的方法,比如10进制,满10向高位进1。
    十进制是日常生活最常使用的,二进制、八进制、十六进制在计算机中常使用,其中在计算机系统内部所有信息都是用二进制,因为二进制的两种状态易表示,方便编码、逻辑和算数运算。
    八进制用3个二进制表示,十六进制用4个二进制表示。

  2. 不同进制之间的相互转换 1) 二进制和八进制、十六进制互转
    二进制转换为八进制或十六进制时,以小数点为界,整数部分从右向左,小数部分从左向右,将一串二进制分为三位一组转换为八进制,分为四位一组转换成十六进制,如果不足一组则在末端一侧补0,将每一组分别使用八进制或十六进制表示,比如将1111000010.01101转换为八进制和十六进制

对应八进制是1702.32


对应十六进制是3c2.68

反过来将八进制或十六进制分别将每位转化为三到四个一组的二进制即可

2)十进制和其他进制互转
其他进制转化为10进制时,将各位与其所在的权值相乘,再把乘积相加就得到对应10进制,这种方法被称为按权展开相加法。其中权值是从小数点左边第一位为进制的0次方,其他位的指数依次向左依次增1,向右依次减1
比如将二进制11011.1转化为10进制
11011.1=1×2^4+1×2^3+1×2^1+1×2^0+1×2^-1=27.5

将十进制转化为其他进制,采用基数乘除法,其中整数部分使用除基取余法,小数部分使用乘基取整法,最后把两部分拼接起来,比如将123.6875转化为二进制
对于整数部分,不断除以2直到得0,可以作为按权展开相加法的逆运算来理解。

将余数从下往上排序得,123=1111011

小数部分,不断乘以2直到得1

将整数部分从上往下排序得,0.6875=1011
最后123.6875=1111011.1011

在计算过程中注意,对于整数,每个进制之间是一一对应的,但是小数,比如不是每个十进制小数都对应一个二进制,比如0.3,无论乘多少次2都无法得到最后的1,因此无法使用二进制精确表示

2.1.2 真值和机器数

我们把带正负号的数表示真值,在计算机中实际表示时符号和数值都是用二进制表示,其中用0表示正,用1表示负,这种把符号数字化的数称为机器数。

2.1.3 BCD码

用二进制表示十进制(binary-coded decimal),每四位二进制表示一个十进制数字,可以在十进制数值和二进制的表示中快速转换。由于4位二进制表示16个数字,因此会有冗余。
bcd码有几种常用编码

  • 8421码,四位权值从左到右权值分别为8421
  • 2421码,四位权值分别为2421,特点是大于5的最高位是1,否则为0

2.1.4 字符与字符串

不仅数字要用二进制表示,所有字符也要用二进制表示。每一种二进制和字符集的映射被称为一种编码方案。 一种常用的字符编码是ascii码,使用七位二进制表示128个常用字符,比如用0100 0001表示字符A。

其他unicode编码等参考编码部分。

2.1.5 校验码

校验码是能够发现或自动纠错的数据编码,也叫做检错纠错编码。通过一些冗余来检验和纠正,可用于网络传输中的差错控制。

2.2 机器数的表示与运算

根据小数点的位置是否固定,在计算机中的数字分为定点数或浮点数两种。定点数在约定小数点位置的前提下表示纯粹的整数或者小数(整数部分为0),浮点数用科学计数法的方式动态改变小数点的位数。

2.2.1 定点数

表示

定点数表示的机器数中小数点位置不变,小数点不再使用点来表示,而是约定它的位置。小数点通常约定在两个位置,一个是最高位之前,这被称为定点小数

一个是在最低位之后,这被称为定点整数。

根据一个定点数有没有符号位,可以将其分为无符号数和有符号数,其中无符号数的所有位都表示数值,比如一个8位无符号整数,表示范围是0到255,有符号数的最高位表示符号位,其他位表示有效数据。

一个有符号定点数一般有原码、补码、反码和移码四种表示方式,这里我们只讨论定点整数。

  • 原码 原码就是前面讨论进制时的二进制,最高位是符号位,其中0有+0和-0两种表示方式。

  • 补码 补码是为了解决计算机中的减法问题(这里参考为什么计算机采用补码而不是原码或反码?),当减一个数时要表示成加这个被减数的相反数,相反数是和原数相加等于0的数,两个正数要想相加等于0就需要通过将最高位溢出得0,以八位为例,比如计算0000 0010 - 0000 0001时,需要用0000 0010+(-0000 0001),这里要计算00000001的相反数作为-00000001的补码x
    即00000001+x-1=11111111,x=11111111-00000001+1=11111111。当计算原码的对应补码时,正数的补码是原码本身,负数的补码是原码符号位不变数值部分取反后加1。

  • 反码 由原码转化为补码的中间表示,即正数的反码是原码本身,负数的补码是原码符号位不变,数值部分取反。

  • 移码 常用来表示浮点数的阶码,是在真值x的基础上加一个常数(即偏置值),这个常数一般取值x^n。当移码为0时对应真值的最小值。

运算

这里只讨论整数

  1. 移位运算
    移位运算又分为算术移位和逻辑移位,其中有符号数的移位称为算术移位,无符号数的移位称为逻辑移位。

在算术移位时符号位保持不变,只对数值部分进行操作。
对于正数,由于原码、反码、补码一致因此行为一致,即左移相当于×2,右移相当于÷2,空出来的位置补0,溢出的内容丢弃。
对于负数溢出的内容丢弃,具体处理要分不同情况

  • 原码 和正数的处理一样,空出的数值部分补0
  • 反码 数值位和原码相反,空出来的数值部分补1
  • 补码 补码是数值位取反加一所得,因此从最低位开始的第一个1,其左边与反码相同,其右边与原码相同,因此向左移位补0,右移补1

在逻辑移位时,溢出丢弃,空位补0

  1. 原码加减法
    以下运算涉及到溢出时丢弃溢出位

做加法时,先判符号位,如果符号相同,数值部分相加,符号位不变。或不同,则绝对值大的数值部分减绝对值小的数值部分,符号位以绝对值大的为准,以八位表示二进制为例

//符号相同,此时正负数用法一致
3+2=5
00000011+00000010=00000101

//符号不同
//当负数绝对值小时
3+(-2)=1
11-10=01 => 添加符号位 00000001  
//当负数绝对值大时
(-3)+2=-1  
11-10=01=> 添加符号位 10000001

做减法时,首先将减数取反,然后将被减数与取反后减数相加

//减数符号取反然后与被减数相加
3-2=1=>3+(-2)=1 按加法处理
  1. 补码加减法
    是计算机中普遍采用的加减法,符号位和数值位分别计算,溢出位丢弃。
    两数和的补码等于两数分别求补码然后相加
    两数差的补码等于被减数补码与减数修改符号位后求补码相加
//两数和的补码  
//两正数时
2+3的补码=5
10+11=101
//一正一负时
2+(-3)的补码,即-1的补码,将10000001数值位取反后加1,得11111111
2得补码为00000010,-3得补码为10000011数值位取反后加1,得11111101,相加得11111111

//两数差得补码
2-3=2+(-3)得补码,使用两数和得补码算法运算
  1. 符号扩展 比如如果加8位数扩展成16位
    对于正数,前面补0即可
    对于负数,要区分
  • 原码 数值部分前面补0,符号部分不变
  • 反码 前面补1即可
  • 补码 前面补1即可
数据得存储和排列
  1. 数据的大端存储和小端存储
    当一个数值使用多子节表示时,要考虑每个数值内部每子节怎么排列(每子节内部顺序是固定的),比如16进制表示的数字123456使用三字节表示,如果在内存中按照12 34 56 的顺序,即高位在前,则称为大端表示,如果按照 56 34 12的顺序,则称为小端表示
  2. 数据按边界对齐方式存储
    在实际存储数据过程中,数据可以从任意位置开始存储,但是为了提高存取速度,需要将数据的边界对齐。对于32位存储字长的计算机(MDR的位数表示存储字长,即每个存储单元的位数),可按子节、半字、字来存储,这里的字指四个子节,半字两个字节,因此半字地址应该是2的倍数,字地址是四的倍数

此时四字节的int只能是字地址,一个字节的char可以放在任何一个子节位置。

2.2.2 浮点数

表示

通常浮点数被表示为r^e×m,其中r是底,通常是2;e和m是有符号的定点数,分别表示阶码和尾数。于是一个浮点数由阶码和尾数两部分组成,两部分又由符号和数值两部分组成,其中阶码表示浮点数的范围,尾数表示浮点数的精度。

  1. 规格化浮点数 为了提高运算的精度,需要充分利用尾数的有效数位,通常采用规格化形式,即尾数最高位必须是一个有效数(二进制数为1)。将一个非规格化数据转换成规格化数据叫规格化。

  2. IEEE754 该标准的浮点数阶码由移码表示,尾数用原码表示,之前讨论ES规范时对ieee754有详细分析。

运算

浮点数运算时阶码和尾数分开运算,浮点数的加减法一律采用补码。

2.3 算数逻辑单元alu

alu是运算器的组成部分,承担运算器的加减乘除四则运算、与或非异或等逻辑运算以及移位、求补等操作。 运算器的操作类型由控制器决定,处理的数据来自存储器,处理后的结果会暂存在运算器或送回存储器。 具体实现需要一定的电路基础,这里不多说。

3 存储系统

3.1 存储器概述

  1. 按作用
    • 主存
    • 辅存
    • cache(高速缓冲存储器)
  2. 按存取方式
    • 随机存储器(Random Access Memory) 其中任何一个存储单元都可以随机存取,且存取时间和物理位置无关,主要用于主存和cache。又分为sram和dram,其中前者静态随机存取存储器使用晶体管存储信息,存取速度快、集成度低、功耗低,后者动态随机存储器使用电容器存储,易集成、价位低、容量大。
    • 只读存储器(Read-Only Memory)只能随机读出而不能写入,一旦写入就固定不变。广义上的rom可以多次读写
    • 串行访问存储器(Serial Access Storage) 读写时需要按照物理位置先后顺序寻址
  3. 按信息的可保存性
    • 易失性存储器 断电后信息消失,如ram
    • 非易失性存储器 如rom
  4. 按从存储介质
    • 磁表面存储器,如磁盘、磁带
    • 半导体存储器
    • 磁芯存储器
    • 光存储器,如光盘

3.2 存储器的层次化结构

3.2.1 多级存储系统

为了解决容量、速度和成本三因素的制约,在计算机系统中采用多级存储器结构,其中cache-主存解决cpu和主存速度不匹配的问题,主存-辅存主要解决存储系统容量问题。 在主存辅存这一层次不断发展后形成了虚拟存储系统,编程中的地址与虚拟存储器的地址空间对应,可用地址可以远大于主存空间。

3.3 半导体随机存储器

3.3.1 RAM

主存储器由dram实现,cache由sram实现,两种ram的区别如下

3.3.2 ROM

rom和ram相比具有两个有点,位密度高、断电信息不丢失。rom可分为

  • 掩模式只读存储器(MROM) 出厂时写入,其后不能修改
  • 一次可编程只读存储器(PROM) 允许用户写入一次
  • 可擦除可编程只读存储器(EPROM) 可以多次修改,修改时需要全部擦除,写入次数有限且写入慢
  • 闪速存储器(Flash memory) 快速擦除可读写
  • 固态硬盘(solid state drives,SSD) 比传统硬盘读写速度快,低功耗

3.3.3 主存储器的基本组成


主存储器中,存储0或1的存储元件(记忆单元)构成的存储体是存储器的核心部分,为了存取存储体中的信息,要为存储元件编号,现在计算机通过8个存储元件(即一字节)共用一个地址。

指令执行过程中需要访问主存时,cpu需要将被访问的地址送到mar,然后通过地址线送到地址寄存器来通过地址译码器将二进制地址指向对应物理空间。同时cpu通过控制线传送读写信号,根据具体信号从mdr和存储体之间通过数据线交换数据。
数据线和地址线共同反应存储体的大小,比如图中主存容量位2^36×64

3.4 主存储器和cpu的连接

通过数据总线、地址总线和控制总线连接

由于单个存储芯片有限,需要对器扩充才能满足实际需要,可以通过位扩展法、字扩展法和字位同时扩展法来扩展主存容量。

3.5 高速缓冲存储器

cache位于主存储器和cpu中间,仅保存主存最活跃的部分数据,当cpu读取数据时首先在cache中寻找,如果命中则直接使用,否则去内存中寻找,这就是我们平时说的缓存。

3.6 虚拟存储器

虚拟存储器将主存和辅存的地址空间统一编码,形成一个庞大的地址空间,用户可以在整个空间编程,此时涉及到的地址称为虚地址或者逻辑地址,对应存储空间称为虚拟空间。实际的主存地址称为实地址或物理地址。
cpu使用虚地址时,由辅助硬件找出虚地址和实地址的对应关系,并判断虚地址对应的存储单元是否已装入内存,如果是则通过地址变换直接访问实际单元,否则则将其调入主存在访问,即当前运行不需要的会留在辅存中。

4 指令系统

指令,又称机器指令,是指示计算机执行某种操作的命令,是计算机运行最小的功能单位。
一台计算机所有指令的集合称为该机的指令集(指令系统),即cpu对软件提供的api。

4.1 指令格式

4.1.1 基本格式

一条指令包含操作码和地址码两部分,其中操作码指出指令中该指令应该执行什么操作,比如加还是减,或者程序转移还是返回;地址码给出被操作的信息。比如参加运算的操作数地址、运算结果的保存地址、程序的转移地址或被调用的子程序地址。
指令的长度是指一条指令包含二进制的位数,在一个指令系统中,若所有指令长度都一样则称为定长指令字结构,其执行速度快,控制简单;否则叫变长指令字长度。

根据地址码数目的不同,可以将指令分为以下零地址到四地址。

4.2 指令的寻址方式

寻址是寻找指令或数据有效地址的方式,即确定本条指令的数据地址和下一条待执行指令的地址。寻址方式分为指令寻址和数据寻址两种。
指令中的地址码并不代表操作数的真实地址,这种地址被称为形式地址(A),形式地址结合寻址方式计算处真实地址,即有效地址(EA)

4.2.1 指令寻址

指令寻址有两种,一种是顺序寻址,一种是跳跃寻址方式。
顺序寻址通过程序计数器(pc)加1自动形成下一条指令地址。
跳跃寻址通过转移类指令实现,本条指令会给出下条指令地址的计算方式,跳跃的结果是当前指令修改pc值。

4.2.2 数据寻址

数据寻址方式很多,为了区别各种方式,通常在指令中设一个字段用来表示哪种寻址,即寻址特征。
此时的地址码被分为两个部分,寻址特征和形式地址。 常见的数据寻址方式包括

  • 隐含寻址
  • 立即数寻址
  • 直接寻址
  • 间接寻址
  • 寄存器寻址
  • 寄存器间接寻址
  • 相对寻址
  • 基址寻址
  • 变址寻址
  • 堆栈寻址

4.2.3 x86汇编指令入门

  1. 通用寄存器 通用寄存器位于cpu中,用于传送和暂存数据。
    x86处理器由8个32位通用寄存器,为了兼容,其中四个可以用作16位或8位

  2. 常用指令
    汇编指令可以分为数据传送指令(比如move)、逻辑计算指令(比如add)和控制流指令(比如jmp)。
    指令的操作数包括寄存器名,内存地址或常数。

4.3 指令系统发展

指令系统向两个方向发展,一个是增强原有指令的功能,这类机器交复杂指令系统计算机(CISC),比如x86;另一种是减少指令种类和简化指令功能,提高执行速度,这类叫精简指令系统计算机(RISC),比如ARM。

5 中央处理器

5.1 组成

cpu由运算器和控制器两部分组成。

  1. 运算器接收从控制器送来的命令并执行相应的操作,对数据进行加工和处理。包括
  • 算术逻辑单元(alu) 进行算术/逻辑运算
  • 暂存寄存器 用于暂存从贮存读来的数据
  • 累加寄存器 是一个通用寄存器,用于暂存alu运算结果,可以作为加法运算的一个输入端
  • 通用寄存器组,见上一章的介绍
  • 程序状态字寄存器(PSW) 保留由算术逻辑运算指令或测试指令的结果而建立的各种状态信息
  • 移位器 对操作数和运算结果移位操作
  • 计数器 控制乘除运算的操作步数
  1. 控制器是系统的指挥中心,在控制器的控制下,运算器、存储器和输入输出设备等系统条工作。控制器的基本功能是执行指令,每条指令的执行由控制器发出的一组微操作实现。包括
  • 程序计数器(pc) 用于指出下一条指令在主存的存放地址
  • 指令寄存器(ir) 用于保存当前正在执行的那条指令
  • 指令译码器 对操作码字段进行译码,向控制器提供特性的操作信号
  • 存储器地址寄存器(mar)用于存放要访问的主存单元地址
  • 存储器数据寄存器(mdr)用于存放向主存写入的信息或从主存读出的信息
  • 时序系统 用于产生各种时序信号,由统一时钟分频得到
  • 微操作信号发生器 跟中ir中的指令、psw的状态信息及时序信号,产生控制整个计算机系统所需的各种操作信号。

5.2 指令执行过程

5.2.1 指令周期

cpu从主存取出并执行一条指令的时间称为指令周期,指令周期是由若干机器周期表示,一个机器周期又包含若干时钟周期。
时钟周期是cpu操作的基本单位,是计算机中最小的时间单位,也叫做节拍或t周期。
机器周期也称cpu周期,一条指令的执行过程被分为若干阶段(比如取指、执行指令),机器周期是每个阶段完成所需要的时间。

5.2.2 指令周期的数据流

数据流是根据指令要求依次访问的数据序列。下面会通过一些典型的cpu周期解释指令周期中的数据流。

  1. 取指周期 根据pc的内容从主存取出指令代码并存在ir中

  2. 间址周期 任务是取操作数的有效地址

  3. 执行周期 任务是根据ir中的指令字的操作码和操作数通过alu操作产生执行结果,不同指令的执行周期操作不同,因此没有统一的数据流。

  4. 中断周期 保存断点

5.3 数据通路

数据在功能部件之间传送的路径称为数据通路,路径上的部件称为数据通路部件。
数据通路的基本结构包括以下三种

  • cpu内部单总线方式 将所有寄存器的输入输出段连接到一条公共通路上,传输易冲突。
  • cpu内部三总线方式
  • 专用数据通路方式

6 输入输出系统

将信息从外部设备传送到主机称为输入,反之称为输出

在输入输出系统,经常需要进行大量的数据传输,而在传输过程中有各种控制方式,包括

  • 程序查询方式 由cpu通过程序不断查询i/o设备是否已做好准备
  • 程序中断方式 只在i/o设备准备就绪并向cpu发出响应请求时才响应
  • dma方式 主存和i/o之间有一条直接数据通路。
  • 通道模式 启动有关通道完成i/o

完结撒花