计算机组成原理

第一部分

  • 计算机的发展历史
  • 计算机的分类
  • 计算机的体系结构
  • 计算机的层次与编程语言
  • 计算机的计算单位
  • 计算机的字符与编码集

计算机的发展历史

  • 第一阶段:电子管计算机,1946 年开始
  • 第二阶段:晶体管计算机,1957 年开始
  • 第三阶段:集成电路计算机,1964 年开始
  • 第四阶段:超大规模集成电路计算机,1980 年开始直到现在

微型计算机的发展主要是从单核到多核。

计算机的分类

  • 超级计算机
  • 大型计算机
    • IOE行动
  • 工作站
  • 小型机(普通服务器)
    • 普通服务器已经代替了传统的大型机,成为大厂的中枢
  • 微型计算机,又称为个人计算机

我们接触最多的就是普通服务器微型计算机

计算机的体系结构

  • 冯洛伊曼体系
  • 现代计算机体系

冯洛伊曼体系

概况为:将程序指令和数据一起存储的计算机设计概念结构。

早期计算机仅含固定用途程序,改变程序需更改结构、重新设计电路。冯若依曼的设计是存储程序指令,并设计通用电路,来解决早期计算机的问题。这种存储型计算机非常有弹性,通过指令来改变运算的内容,现代计算机都属于冯若依曼机。

必须有这五样:

  • 必须有一个存储器
  • 必须有一个控制器
  • 必须有一个运算器
  • 必须有输入设备
  • 必须有输出设备

冯洛伊曼体系的瓶颈问题是CPU(控制器+运算器)存储器分离,存储器没有 CPU 快,CPU 经常空转等待数据传输,性能没有完全发挥出来。

image

现代计算机体系

在冯洛伊曼体系结构中做了一点改变,解决了冯洛伊曼体系中 CUP 与存储器之间的性能差异问题。 解决方法是:把控制器、运算器、存储器都放在 CPU 中。

image

TIP

这里的存储器主要是指围绕 CPU 的高速设备,比如:CPU 的寄存器、内存

计算机的层次与编程语言

  • 程序翻译与程序解释
  • 计算机的层次与编程语言

程序翻译与程序解释

人类语言和计算机语言不相通,我需要使用程序翻译或者程序解释,让计算机能理解。

语言 L1:编程语言

语言 L0:计算机语言 010011

程序翻译:

过程:先使用语言 L1 编写程序,然后生成等价的语言 L0 程序,计算机实际执行的是 L0 程序。

中间用来生成的东西叫做编译器

程序翻译是直接使用编译器,把语言 L1 生成为语言 L0。

程序解释:

过程:先使用语言 L1 编写程序,使用语言 L0 实现另一个程序,将语言 L1 作为输入,等价得到语言 L0 再由计算机实际执行。

中间使用语言 L0 实现的程序叫解释器

程序解释是使用语言 L0 实现另一个程序,将语言 L1 作为输入,在运行的过程中,把每一句转化为语言 L0 执行。

总结:

  • 计算机执行的指令都是语言 L0。
  • 程序翻译过程生成新的 L0 程序,程序解释过程不生成新的 L0 程序。
  • 程序解释过程由语言 L0 编写的解释器去解释语言 L1 程序
  • 区别是解释器运行时转换,而编译器提前转换

程序翻译语言:C/C++Object-CGolang

程序解释语言:PythonPhpJavascript

计算机的层次与编程语言

  1. 硬件逻辑层
  2. 微程序机器层
  3. 传统机器层
  4. 操作系统层
  5. 汇编语言层
  6. 高级语言层
  7. 应用层

123属于实际机器,4567属于虚拟机器,在虚拟机器中7属于应用软件,其它属于系统软件。

一条机器指令对应一个微程序,一个微程序对应一组微指令。

4. 操作系统层

  • 操作系统层是在软件和硬件之间的适配层
  • 向上提供了简易的操作界面
  • 向下对接了指令系统,管理硬件资源

5. 汇编语言层

  • 编程语言就是汇编语言
  • 汇编语言可以翻译成可直接执行的机器语言
  • 完成翻译过程的程序就是汇编器

6. 高级语言层

  • 常见的高级语言有:C/C++PythonJavaJavascript
  • 为广大程序员所接受的高级语言,种类非常多,有几百种

7. 应用层

  • 满足计算机针对某种用途而专门设计的软件

计算机的计算单位

  • 容量单位
  • 速度单位

容量单位

  • 在物理层面,计算机通过高低电平记录信息,高电平表示 1,低电平表示 0
  • 理论上只认识 0/1 两种状态
  • 0/1 称为 bit(比特位)

字节单位:

用 8 个 bit(比特位)表示 1 个字节

字节:1Byte = 8bits

image

硬盘商一般用 10 进位标记容量,方便自己开发,500G 硬盘格式化之后只剩 465G。

速度单位

  • 网络速度
  • CPU 速度
网络速度

问:100M 宽带,说是 100M 每秒,但为什么下载速度只有 12.5M 每秒?

回答:

因为网络常用单位为(Mbps),这之间有字节到比特位的转换,1bit = 8Byte,实际网络速度都需要除以 8

100M/s = 100Mbps = 100Mbit/s

100Mbit/s = (100/8)Mb/s = 12.5Mb/s

CPU 速度
  • CPU 的速度一般体现为 CPU 的时钟频率
  • CPU 的时钟频率的单位一般是赫兹(Hz)
  • 赫兹(Hz)是每秒中的次数计量,描述高低电平每秒中的变化次数

计算机的字符与编码集

  • 字符编码集的历史
  • 中文编码集

字符编码集的历史

  • ASCII 码
  • Extended ASCII 码
  • 字符编码集的国际化

ASCII 码:

平时很常用的编码,比如大写字母、小写字母、符号等。

  • 使用 7 个 bits 就可以完全表示 ASCII 码
  • 包含 95 个可打印字符,33 个不可打印字符

Extended ASCII 码:

计算机发展到后来,有很多应用或者国家中的符号无法表示,所以对 ASCII 码进行第一次扩充,7bits => 8bits,用 8 个代替原来的 7 个。

字符编码集的国际化

  • 全球文字多种多样,体系也不一样
  • 中、韩、日文字最为复杂

中文编码集

  • GB2312
  • GBK
  • Unicode

GB2312:

  • 第一套
  • 一共收录 7445 个字符
  • 但是不符合国际标准

GBK:

  • 第二套
  • 向下兼容 GB2312,向上支持国际 ISO 标准
  • 一共收录 21003 个汉字
  • 在中国可以用,但如果国外的电脑访问 GBK 网页,而电脑中没有这个编码,会出现乱码

Unicode:

  • 兼容全球的字符集,统一码、万国码
  • 定义了世界通用的字符集,UTF-*实现了编码
  • UTF-8以字节为单位对 Unicode 进行编码
  • 编程推荐使用UTF-8编码

第二部分

image

  • 计算机的总线与 IO 设备
  • 计算机的存储器
  • 计算机的 CPU

计算机的总线与 IO 设备

  • 计算机的总线
  • 计算机的输入/输出设备

计算机的总线

  • 总线是什么?

    • 常用的有USB总线,也叫通用串行总线
    • 还有电脑主板上的PCI总线,用来插显卡
  • 总线有什么用?

    • 解决不同设备之间的通信问题
    • 提供了对外连接的统一标准接口
    • 不同设备可以通过USB接口进行连接,比如:键盘、鼠标、U 盘
  • 有哪些常见总线?

    • 地址总线
    • 数据总线
    • 控制总线
  • 数据总线的位数是什么?

    • 也叫总线的宽度,一般与 CPU 的位数相同(32 位、64 位)
    • 一次可以传输 32 位的 4 个字节或 64 位的 8 个字节
  • 总线仲裁是什么?

    • 为了解决总线使用权的冲突问题

计算机的输入/输出设备

  • 常见输入设备
  • 常见输出设备
  • 输入输出接口的通用设计
  • CPU 与 IO 设备的通信方法

image

常见输入设备:

  • 字符输入设备
    • 键盘
      • 薄膜键盘
      • 机械键盘
      • 电容键盘
  • 图像输入设备
    • 鼠标
    • 数位板
      • 输入板和压感笔
    • 扫描仪

常见输出设备:

  • 显示器
  • 打印机
  • 投影仪

输入输出接口的通用设计:

需要向设备发送数据、读取数据、判断设备是否被占用、检查设备是否已经启动或正常连接

  • 数据线
  • 状态线
  • 命令线
  • 设备选择线

CPU 与 IO 设备的通信方法:

  • 程序中断
  • DMA(直接存储器访问)

计算机的存储器

  • 计算机的存储器概览
  • 计算机的主存储器与辅助存储器
  • 计算机的高速存储器

计算机的存储器概览

  • 存储器的分类
  • 存储器的层次结构

存储器的分类:

  • 按存储介质分类:

    • 半导体存储器
      • 内存
      • U 盘
      • 固态硬盘
    • 磁存储器
      • 磁带
      • 磁盘
  • 按存取方式分类:

    • 随机存储器(RAM)
      • 随机读取
      • 与位置无关
    • 串行存储器
      • 按顺序查找
      • 与位置有关
    • 只读存储器(ROM)
      • 只读不写

存储器的层次结构:

image

选购存储器的因素:

  • 速写速度:5400 转/7200 转,越高越好
  • 存储容量:2T/4G,越高越好
  • 价格,越低越好

性价比:容量 + 价格 => 位价(每比特位价格)

根据位价划分层次结构:

  • 缓存:CPU 里面的寄存器,高速缓存。速度快,位价高。
  • 主存:计算机里面的内存。速度适中,位价适中。
  • 辅存:外部辅存设备,扩展容量,比如磁盘、U 盘、移动硬盘。速度慢,位价低。

局部性原理

当 CPU 访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。

实现:在 CPU 与主存之间增加一层速度快、容量小的缓存,可以解决主存速度不足的问题,有效提高 CPU 的效率。

计算机的主存储器与辅助存储器

  • 主存储器:内存
  • 辅助存储器:磁盘

为什么计算机断电,内存数据会丢失,而磁盘数据不会丢失?

主存储器:内存

就是计算机中的内存条,存取方式属于随机存储器(RAM)

RAM通过电容存储数据,必须隔一段时间刷新一次,刷新需要有电。如果断电,那么一段时间后将丢失所有数据。

  • 主存储器与操作系统的位数有关系:
    • 32 位系统
      • 最多支持 4GB 的内存,因为地址总线只有 32 位
    • 64 位系统
      • 最多能支持2的34次方GB 的内存

辅助存储器:磁盘

  • 物理结构
  • 调度算法

计算机的高速存储器

高度缓存是为了解决 CPU 与主存的速度不匹配的瓶颈问题

  • 高速缓存的工作原理
  • 高速缓存的替换策略

高速缓存的工作原理

字:是指存放在一个存储单元中的二进制代码组合,比如一个数据、一个指令、一个字符串

字块:存储在连续的存储单元中而被看作是一个单元的一组字,包含多个字

CPU 从高速缓存中取数据。命中率。访问效率。

高速缓存的替换策略

当 CPU 所需的数据不在高速缓存中,需要从主存载入所需数据。

  • 随机算法
  • 先进先出算法(FIFO)
  • 最不经常使用算法(LFU)
  • 最近最少使用算法(LRU)

计算机的 CPU

  • 计算机的指令系统
  • 计算机的控制器
  • 计算机的运算器
  • 指令执行过程

计算机的指令系统

  • 机器指令的形式
  • 机器指令的操作类型
  • 机器指令的寻址方式

机器指令的形式:

机器指令主要由两部分组成:操作码、地址码

操作码:指明指令所要完成的操作,位数反映了机器的操作种类

地址码:给出操作数或者操作数的地址,分为三地址指令、二地址指令、一地址指令

机器指令的操作类型:

  • 数据传输类型:数据读写、交换地址数据、清零等操作

  • 算术逻辑操作类型:加减乘除运算、与或非逻辑运算

  • 移位操作类型:左移、右移

  • 控制指令类型: 等待指令、停机指令、中断指令

机器指令的寻址方式:

  • 指令寻址

    • 顺序寻址
    • 跳跃寻址
  • 数据寻址

    • 立即寻址
    • 直接寻址
    • 间接寻址

计算机的控制器

组成部分:

  • 程序计数器:用来存储下一条指令的地址,循环拿出指令

  • 时序发生器:用于发送时序脉冲

  • 指令译码器:翻译操作码对应的操作,以及控制传输地址码对应的数据

  • 指令寄存器:从主存或高速缓存取计算机指令

  • 主存地址寄存器:保存当前 CPU 正要访问的内存单元的地址

  • 主存数据寄存器:保存当前 CPU 正要读或写的主存数据

  • 通用寄存器:用于暂时存放传输数据和指令

image

计算机的运算器

运算器是用来进行数据运算加工。

组成部分:

  • ALU:算术逻辑单元。由逻辑门组成

  • 数据缓冲器:暂时存放输入或输出的数据

  • 状态字寄存器:存放运算状态和运算信息

  • 通用寄存器:用于暂时存放传输数据和指令

指令执行过程

  • 指令执行过程
  • CPU 的流水线设计

指令执行过程:

  1. 取指令
  2. 分析指令
  3. 执行指令

image

CPU 的流水线设计

类似于工厂的流水线,多个产品可以同时被加工,不同时刻产品位于不同的加工阶段。

用来提高 CPU 的工作效率。

第三部分

  • 进制运算的基础知识
  • 二进制数据的表示方法
  • 二进制数据的运算

image

进制运算的基础知识

  • 进制的概述
  • 二进制的运算基础

逻辑门

加减乘数,计算的底层原理是逻辑门,一大堆逻辑门巧妙的连接在一起:NOTANDORXOR,本质上只 true 和 false,或只是 0 和 1。

层层抽象,使用几百个逻辑门制作成ALU计算工具。

有些设备用使用加减法,来代替乘数法。

进制的概述

  • 进制的定义
  • 常见的进制

进制的定义:

  • 进制是一种记数方式,也称为进位记数法或位值记数法

  • 使用有限数字符号,来表达无限的数值

  • 使用的数字符号的数目称为这种进制的基数或底数,比如十进制使用 0-9 十个数字符号

常见的进制:

  • 二进制

  • 八进制:使用 0-7 八个数字

  • 十进制

  • 十六进制:网卡地址,使用 0-9 和 A、B、C、D、E、F,十六个数字符号

  • 二十进制:玛雅文明的玛雅数字

  • 六十进制:运用在时间、坐标、角度等量化数据,比如一个小时六十分钟,六十作为一个进制

TIP

计算机中常用八进制或十六进制,是因为计算机本来喜欢二进制,但是二进制表达太长,所以使用八进制或十六进制来编码,从而缩短长度,且八和十六都满足 2 的 n 次方的要求。

二进制的运算基础

  • 二进制转换十进制:按权展开法

使用 2 的次方来计算二进制,从 0 开始

image

小数运算: image

  • 十进制转换二进制:重复相除法

image

小数运算: image

十进制与二进制的对比计算:

image

image

二进制数据的表示方法

  • 原码表示法
  • 二进制补码表示法
  • 二进制的反码表示法

有符号数与无符号数

负数怎么表达?

  • 生活中使用+表示正数,-表示负数,计算机中前面使用0表示正数,使用1表示负数,比如:+237=011101101-237=111101101
  • 符号位在数值第一位,后 8 位是数字位
  • 这就是原码表示法
  • 会存在一些问题,某些情况的运算会非常复杂

二进制补码表示法

解决原码表示法的问题。使用正数替代负数。使用加法代替减法操作。

二进制的反码表示法

消除转换过程中的减法。

二进制数据的运算

  • 定点数与浮点数
  • 定点数的加减法运算
  • 浮点数的加减法运算
  • 浮点数的乘数法运算

第四部分

  • 实现双向链表
  • 实现置换算法

image

实现双向链表

  • 原理
  • 实践

双向链表原理

image

双向链表的好处:

  • 可以快速找到一个节点的下一个节点
  • 可以快速找到一个节点的上一个节点
  • 可以快速去掉链表中的某一个节点

双向链表实践

image

实现置换算法

使用双向链表实现以下算法:

  • 先进先出算法(FIFO)
  • 最不经常使用算法(LFU)
  • 最近最少使用算法(LRU)

层层抽象

计算机科学速成课open in new window

  • 计算机早期历史
  • 电子计算机
  • 布尔逻辑和逻辑门
  • 二进制
  • 算术逻辑单元&ALU
  • 寄存器&内存
  • CPU
  • 编程方式
  • 数据结构与算法
  • 软件工程
  • 操作系统

相关概念

电、电路、逻辑门、锁存器、寄存器、RAM、ALU、CPU

布尔逻辑和逻辑门

晶体管组成了逻辑门,ALU,寄存器,内存

寄存器&内存

锁存器,锁定了一个值就是一个 bit,通过逻辑门,制作出这样的电路,能够锁定 8 个 bit 的一组锁存器叫做寄存器寄存器能存一个数字,这个数字的位数就是位宽。早期计算机用 8 位寄存器,然后是 16 位,32 位,现在计算机都有 64 位宽的寄存器。

锁存器 -> 寄存器 -> 内存(RAM)

一堆逻辑门抽象成锁存器,一堆锁存器抽象成寄存器,一堆寄存器抽象成内存。

数据和程序最终以二进制值存在内存里。

最早的存储介质是打孔纸卡,后来发明了延迟线存储器,磁芯存储器,磁盘,硬盘,光盘,固定硬盘

存储器(Storage)可以长久保存。

CPU

  • 时钟周期
  • RAM 的瓶颈,CUP 空等,加入缓存
  • 缓存数据标记脏位,同步到 RAM,指令流水线
  • 多核,有多个处理单元,共享资源

编程方式

早期计算机的编程方式都是使用穿孔纸卡读取。

后来有了存储型计算机,也就是冯若依曼机。

指令有 8 位,前 4 位是指令码,后 4 位是地址码。

机器只理解二进制,这是机器的"母语",也叫机器码。

使用二进制写出一个翻译程序,叫汇编器,把汇编语言写的程序转成机器码,但程序员还需要关注寄存器与内存。

编译器出现之后,有更高级的编程语言,无需关注底层细节,可以专心编程。运行速度慢一点,编程速度大大提升。

编程语言:语法,变量,语句,函数,

数据结构与算法

算法无处不在。

数据结构:数组,矩阵,对象,链表,树,图

软件工程

面向对象编程,封装组件,隐藏复杂度,再提升一层抽象。

需要有文档,API。

IDE,调试,源代码版本管理。

QA。

操作系统

操作系统提供 API 抽象硬件。

虚拟内存是新一层抽象。操作系统会自动处理虚拟内存和物理内存之间的映射,对程序来说得到的虚拟内存一直是连续的,真实的物理内存是分开的。程序的内存大小可以灵活增减,这叫动态内存分配。这样可以简化很多东西,同时运行多个程序有极大的灵活性,如果某程序出了问题,也不会影响到其它程序的内存,这是内存保护

Last Updated: 2023/8/2 10:45:34
Contributors: licong96, 黎聪