计算机组成原理
第一部分
- 计算机的发展历史
- 计算机的分类
- 计算机的体系结构
- 计算机的层次与编程语言
- 计算机的计算单位
- 计算机的字符与编码集
计算机的发展历史
- 第一阶段:电子管计算机,1946 年开始
- 第二阶段:晶体管计算机,1957 年开始
- 第三阶段:集成电路计算机,1964 年开始
- 第四阶段:超大规模集成电路计算机,1980 年开始直到现在
微型计算机的发展主要是从单核到多核。
计算机的分类
- 超级计算机
- 大型计算机
- 去
IOE
行动
- 去
- 工作站
- 小型机(普通服务器)
- 普通服务器已经代替了传统的大型机,成为大厂的中枢
- 微型计算机,又称为个人计算机
我们接触最多的就是普通服务器
和微型计算机
计算机的体系结构
- 冯洛伊曼体系
- 现代计算机体系
冯洛伊曼体系
概况为:将程序指令和数据一起存储的计算机设计概念结构。
早期计算机仅含固定用途程序,改变程序需更改结构、重新设计电路。冯若依曼的设计是存储程序指令,并设计通用电路,来解决早期计算机的问题。这种存储型计算机非常有弹性,通过指令来改变运算的内容,现代计算机都属于冯若依曼机。
必须有这五样:
- 必须有一个存储器
- 必须有一个控制器
- 必须有一个运算器
- 必须有输入设备
- 必须有输出设备
冯洛伊曼体系的瓶颈问题是CPU(控制器+运算器)
和存储器
分离,存储器没有 CPU 快,CPU 经常空转等待数据传输,性能没有完全发挥出来。
现代计算机体系
在冯洛伊曼体系结构中做了一点改变,解决了冯洛伊曼体系中 CUP 与存储器之间的性能差异问题。 解决方法是:把控制器、运算器、存储器都放在 CPU 中。
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-C
、Golang
程序解释语言:Python
、Php
、Javascript
计算机的层次与编程语言
- 硬件逻辑层
- 微程序机器层
- 传统机器层
- 操作系统层
- 汇编语言层
- 高级语言层
- 应用层
1
、2
、3
属于实际机器,4
、5
、6
、7
属于虚拟机器,在虚拟机器中7
属于应用软件,其它属于系统软件。
一条机器指令对应一个微程序,一个微程序对应一组微指令。
4. 操作系统层
- 操作系统层是在软件和硬件之间的适配层
- 向上提供了简易的操作界面
- 向下对接了指令系统,管理硬件资源
5. 汇编语言层
- 编程语言就是汇编语言
- 汇编语言可以翻译成可直接执行的机器语言
- 完成翻译过程的程序就是汇编器
6. 高级语言层
- 常见的高级语言有:
C/C++
、Python
、Java
、Javascript
- 为广大程序员所接受的高级语言,种类非常多,有几百种
7. 应用层
- 满足计算机针对某种用途而专门设计的软件
计算机的计算单位
- 容量单位
- 速度单位
容量单位
- 在物理层面,计算机通过高低电平记录信息,高电平表示 1,低电平表示 0
- 理论上只认识 0/1 两种状态
- 0/1 称为 bit(比特位)
字节单位:
用 8 个 bit(比特位)表示 1 个字节
字节:1Byte = 8bits
硬盘商一般用 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
编码
第二部分
- 计算机的总线与 IO 设备
- 计算机的存储器
- 计算机的 CPU
计算机的总线与 IO 设备
- 计算机的总线
- 计算机的输入/输出设备
计算机的总线
总线是什么?
- 常用的有
USB
总线,也叫通用串行总线 - 还有电脑主板上的
PCI
总线,用来插显卡
- 常用的有
总线有什么用?
- 解决不同设备之间的通信问题
- 提供了对外连接的统一标准接口
- 不同设备可以通过
USB
接口进行连接,比如:键盘、鼠标、U 盘
有哪些常见总线?
- 地址总线
- 数据总线
- 控制总线
数据总线的位数是什么?
- 也叫总线的宽度,一般与 CPU 的位数相同(32 位、64 位)
- 一次可以传输 32 位的 4 个字节或 64 位的 8 个字节
总线仲裁是什么?
- 为了解决总线使用权的冲突问题
计算机的输入/输出设备
- 常见输入设备
- 常见输出设备
- 输入输出接口的通用设计
- CPU 与 IO 设备的通信方法
常见输入设备:
- 字符输入设备
- 键盘
- 薄膜键盘
- 机械键盘
- 电容键盘
- 键盘
- 图像输入设备
- 鼠标
- 数位板
- 输入板和压感笔
- 扫描仪
常见输出设备:
- 显示器
- 打印机
- 投影仪
输入输出接口的通用设计:
需要向设备发送数据、读取数据、判断设备是否被占用、检查设备是否已经启动或正常连接
- 数据线
- 状态线
- 命令线
- 设备选择线
CPU 与 IO 设备的通信方法:
- 程序中断
- DMA(直接存储器访问)
计算机的存储器
- 计算机的存储器概览
- 计算机的主存储器与辅助存储器
- 计算机的高速存储器
计算机的存储器概览
- 存储器的分类
- 存储器的层次结构
存储器的分类:
按存储介质分类:
- 半导体存储器
- 内存
- U 盘
- 固态硬盘
- 磁存储器
- 磁带
- 磁盘
- 半导体存储器
按存取方式分类:
- 随机存储器(RAM)
- 随机读取
- 与位置无关
- 串行存储器
- 按顺序查找
- 与位置有关
- 只读存储器(ROM)
- 只读不写
- 随机存储器(RAM)
存储器的层次结构:
选购存储器的因素:
- 速写速度:5400 转/7200 转,越高越好
- 存储容量:2T/4G,越高越好
- 价格,越低越好
性价比:容量 + 价格 => 位价(每比特位价格)
根据位价划分层次结构:
- 缓存:CPU 里面的寄存器,高速缓存。速度快,位价高。
- 主存:计算机里面的内存。速度适中,位价适中。
- 辅存:外部辅存设备,扩展容量,比如磁盘、U 盘、移动硬盘。速度慢,位价低。
局部性原理
当 CPU 访问存储器时,无论是存取指令还是存取数据,所访问的存储单元都趋于聚集在一个较小的连续区域中。
实现:在 CPU 与主存之间增加一层速度快、容量小的缓存,可以解决主存速度不足的问题,有效提高 CPU 的效率。
计算机的主存储器与辅助存储器
- 主存储器:内存
- 辅助存储器:磁盘
为什么计算机断电,内存数据会丢失,而磁盘数据不会丢失?
主存储器:内存
就是计算机中的内存条,存取方式属于随机存储器(RAM)
。
RAM
通过电容存储数据,必须隔一段时间刷新一次,刷新需要有电。如果断电,那么一段时间后将丢失所有数据。
- 主存储器与操作系统的位数有关系:
- 32 位系统
- 最多支持 4GB 的内存,因为地址总线只有 32 位
- 64 位系统
- 最多能支持
2的34次方
GB 的内存
- 最多能支持
- 32 位系统
辅助存储器:磁盘
- 物理结构
- 调度算法
计算机的高速存储器
高度缓存是为了解决 CPU 与主存的速度不匹配的瓶颈问题
- 高速缓存的工作原理
- 高速缓存的替换策略
高速缓存的工作原理
字:是指存放在一个存储单元中的二进制代码组合,比如一个数据、一个指令、一个字符串
字块:存储在连续的存储单元中而被看作是一个单元的一组字,包含多个字
CPU 从高速缓存中取数据。命中率。访问效率。
高速缓存的替换策略
当 CPU 所需的数据不在高速缓存中,需要从主存载入所需数据。
- 随机算法
- 先进先出算法(FIFO)
- 最不经常使用算法(LFU)
- 最近最少使用算法(LRU)
计算机的 CPU
- 计算机的指令系统
- 计算机的控制器
- 计算机的运算器
- 指令执行过程
计算机的指令系统
- 机器指令的形式
- 机器指令的操作类型
- 机器指令的寻址方式
机器指令的形式:
机器指令主要由两部分组成:操作码、地址码
操作码:指明指令所要完成的操作,位数反映了机器的操作种类
地址码:给出操作数或者操作数的地址,分为三地址指令、二地址指令、一地址指令
机器指令的操作类型:
数据传输类型:数据读写、交换地址数据、清零等操作
算术逻辑操作类型:加减乘除运算、与或非逻辑运算
移位操作类型:左移、右移
控制指令类型: 等待指令、停机指令、中断指令
机器指令的寻址方式:
指令寻址
- 顺序寻址
- 跳跃寻址
数据寻址
- 立即寻址
- 直接寻址
- 间接寻址
计算机的控制器
组成部分:
程序计数器:用来存储下一条指令的地址,循环拿出指令
时序发生器:用于发送时序脉冲
指令译码器:翻译操作码对应的操作,以及控制传输地址码对应的数据
指令寄存器:从主存或高速缓存取计算机指令
主存地址寄存器:保存当前 CPU 正要访问的内存单元的地址
主存数据寄存器:保存当前 CPU 正要读或写的主存数据
通用寄存器:用于暂时存放传输数据和指令
计算机的运算器
运算器是用来进行数据运算加工。
组成部分:
ALU:算术逻辑单元。由逻辑门组成
数据缓冲器:暂时存放输入或输出的数据
状态字寄存器:存放运算状态和运算信息
通用寄存器:用于暂时存放传输数据和指令
指令执行过程
- 指令执行过程
- CPU 的流水线设计
指令执行过程:
- 取指令
- 分析指令
- 执行指令
CPU 的流水线设计
类似于工厂的流水线,多个产品可以同时被加工,不同时刻产品位于不同的加工阶段。
用来提高 CPU 的工作效率。
第三部分
- 进制运算的基础知识
- 二进制数据的表示方法
- 二进制数据的运算
进制运算的基础知识
- 进制的概述
- 二进制的运算基础
逻辑门
加减乘数,计算的底层原理是逻辑门,一大堆逻辑门巧妙的连接在一起:NOT
、AND
、OR
、XOR
,本质上只 true 和 false,或只是 0 和 1。
层层抽象,使用几百个逻辑门制作成ALU
计算工具。
有些设备用使用加减法,来代替乘数法。
进制的概述
- 进制的定义
- 常见的进制
进制的定义:
进制是一种记数方式,也称为进位记数法或位值记数法
使用有限数字符号,来表达无限的数值
使用的数字符号的数目称为这种进制的基数或底数,比如十进制使用 0-9 十个数字符号
常见的进制:
二进制
八进制:使用 0-7 八个数字
十进制
十六进制:网卡地址,使用 0-9 和 A、B、C、D、E、F,十六个数字符号
二十进制:玛雅文明的玛雅数字
六十进制:运用在时间、坐标、角度等量化数据,比如一个小时六十分钟,六十作为一个进制
TIP
计算机中常用八进制或十六进制,是因为计算机本来喜欢二进制,但是二进制表达太长,所以使用八进制或十六进制来编码,从而缩短长度,且八和十六都满足 2 的 n 次方的要求。
二进制的运算基础
- 二进制转换十进制:按权展开法
使用 2 的次方来计算二进制,从 0 开始
小数运算:
- 十进制转换二进制:重复相除法
小数运算:
十进制与二进制的对比计算:
二进制数据的表示方法
- 原码表示法
- 二进制补码表示法
- 二进制的反码表示法
有符号数与无符号数
负数怎么表达?
- 生活中使用
+
表示正数,-
表示负数,计算机中前面使用0
表示正数,使用1
表示负数,比如:+237
=011101101
,-237
=111101101
- 符号位在数值第一位,后 8 位是数字位
- 这就是
原码表示法
- 会存在一些问题,某些情况的运算会非常复杂
二进制补码表示法
解决原码表示法的问题。使用正数替代负数。使用加法代替减法操作。
二进制的反码表示法
消除转换过程中的减法。
二进制数据的运算
- 定点数与浮点数
- 定点数的加减法运算
- 浮点数的加减法运算
- 浮点数的乘数法运算
第四部分
- 实现双向链表
- 实现置换算法
实现双向链表
- 原理
- 实践
双向链表原理
双向链表的好处:
- 可以快速找到一个节点的下一个节点
- 可以快速找到一个节点的上一个节点
- 可以快速去掉链表中的某一个节点
双向链表实践
实现置换算法
使用双向链表实现以下算法:
- 先进先出算法(FIFO)
- 最不经常使用算法(LFU)
- 最近最少使用算法(LRU)
层层抽象
- 计算机早期历史
- 电子计算机
- 布尔逻辑和逻辑门
- 二进制
- 算术逻辑单元&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 抽象硬件。
虚拟内存是新一层抽象。操作系统会自动处理虚拟内存和物理内存之间的映射,对程序来说得到的虚拟内存一直是连续的,真实的物理内存是分开的。程序的内存大小可以灵活增减,这叫动态内存分配
。这样可以简化很多东西,同时运行多个程序有极大的灵活性,如果某程序出了问题,也不会影响到其它程序的内存,这是内存保护
。