电子计算机系统的 抽象层次:
物理(电子)——>器件(晶体管、二极管)——>模拟电路(放大器、滤波器)——>数字电路(与门或门)——>逻辑(加法器、储存器)——>微体系结构(数据路径控制器)———>体系结构(指令寄存器)——>操作系统(设备驱动程序)——>应用软件(程序)
课程链接:
【https://www.bilibili.com/video/av21376839?p=1】
正文
第一课:计算机早期历史
0、课程目标:从高层次总览一系列计算机话题,快速入门计算机科学。
1、计算机技术的影响——进入信息时代
- 出现自动化农业设备与医疗设备
- 全球通信和全球教育机会变得普遍
- 出现意想不到的虚拟现实/无人驾驶/人工智能等新领域
2、计算机的实质:
极其简单的组件,通过一层层的抽象,来做出复杂的操作。
计算机中的很多东西,底层其实都很简单,让人难以理解的,是一层层精妙的抽象。像一个越来越小的俄罗斯套娃。
3、关于计算的历史:
- 公元前2500年,算盘出现,为十进制,功能类似一个计数器。
- 公元前2500年-公元1500年:星盘、计算尺等依靠机械运动的计算设备出现
- 公元1613年:computer的概念出现,当时指的是专门做计算的职业,
- 1694年:步进计算器出现,是世界上第一台能自动完成加减乘除的计算器。
- 1694-1900年:计算表兴起,类似于字典,可用于查找各种庞大的计算值。
- 1823年:差分机的设想出现,能近似多项式可以做函数计算,但计划最后失败,1991年差分机实现。
- 19世纪中期:分析机的设想出现,设想存在可计算一切的通用计算机,有内存,但未实现。
- 1890年:打孔卡片制表机。原理:在纸上打孔→孔穿过针→针泡入汞→电路连通→齿轮使计数+1。
第二课:电子计算机的发展史
1、电子计算机元器件变化:
继电器→真空管→晶体管:提高电路闭合速度。
继电器:用电控制的机械开关
控制线路:控制电路是开还是关,连着一个线圈,当电流流过线圈,线圈产生电磁场吸引金属臂,从而闭合电路。无法快速开关。
真空管:其中一个电极可以加热,从而发射电子;另一个电极会吸引电子,形成"电龙头"的电流。
但只有带正电才行,若带负电荷或中性电荷,电子无法被吸引,越过真空区域,因此没有电流。
二极管:电流只能单向流动的电子部件,缺少电流开关。
两电极之间加入第三个"控制"电极:向控制电极施加正电荷,允许电子流动;施加负电荷会组织电子流动(三级真空管)。
晶体管:它是一个开关,可用控制线路来控制开或关。
晶体管有两个电极,电极之间有一种材料隔开它们,这种材料有时导电有时不导电(半导体)。
控制线连到一个"门"电极,通过改变"门"的电荷可以控制半导体材料的导电性,来控制是否电流流动。
2、计算机的出现背景:
20世纪人口暴增,科学与工程进步迅速,航天计划成形。以上导致数据的复杂度急剧上升、计算量暴增,对于计算的自动化、高速有迫切的需求。
3、电子计算机的发展:
1944年 哈佛马克1:使用继电器,用电磁效应,控制机械开关,缺点为有磨损和延迟。
*1947.9哈弗马克2型最早还因为有虫子飞进去导致故障,引申出bug=故障的意思。
机电(马达、齿轮)—>电子
1943年 巨人1号:使用1600个真空管(三极管),制造出世界上第一个可编程的计算机。
1946年 ENIAC:第一个电子数值积分计算机,为第一台真正的通用计算机,每秒可执行5000次十位数加减法。
1947年 晶体管出现,使用的是固态的半导体材料,相对真空管更可靠。
1950年 空军AN/FSQ-71955: 真空管到达计算极限。
1957年 IBM 608: 第一个消费者可购买的晶体管计算机出现,3000个晶体管,每秒执行4500次加法,80次左右的乘除法。
第三课:布尔逻辑与逻辑门
1、计算机为什么使用二进制:
- 计算机的元器件晶体管只有2种状态,通电(1)&断电(0),用二进制可直接根据元器件的状态来设计计算机。
- 而且,数学中的“布尔代数”分支,可以用True和False(可用1代表True,0代表False)进行逻辑运算,代替实数进行计算。
- 计算的状态越多,信号越容易混淆,影响计算。对于当时每秒运算百万次以上的晶体管,信号混淆是特别让人头疼的的。
2、布尔代数&布尔代数在计算机中的实现
- 变量:没有常数,仅True和False这两个变量。
- 三个基本操作:
- NOT/AND/OR。
1)NOT操作:
1.命名:称为NOT门/非门。
2.作用:将输入布尔值反转。输入的True或False,输出为False或True。
3.晶体管的实现方式:
- 半导体通电True,则线路接地,无输出电流,为False。
- 半导体不通电False,无法接地,则输出电流从右边输出,为True。
2)AND操作
1.命名:AND门/与门
2.作用:由2个输入控制输出,仅当2个输入input1和input2都为True时,输出才为True,2个输入的其余情况,输出均为False。
*可以理解为,2句话(输入)完全没有假的,整件事(输出)才是真的。
3.用晶体管实现的方式:
串联两个晶体管,仅当2个晶体管都通电,输出才有电流(True)
3)OR操作
1.命名:OR门/或门
2.作用:由2个输入控制输出,只要其中一个输入为True,则输出True。
3.用晶体管实现的方式:
使用2个晶体管,将它们并联到电路中,只要有一个晶体管通电,则输出有电流(True)。
3、特殊的逻辑运算——异或
1.命名:XOR门/异或门
2.作用:2个输入控制一个输出。当2个输入均为True时,输出False,其余情况与OR门相同,仅2个输入不同时输出True。
3.图示:
先用一个OR门,将其与AND门并联,AND门与NOT门串联,最后让NOT与AND门并联,获得输出。
4、逻辑门的符号表示
1.作用:将逻辑门简化,将逻辑门用于构建更大的组件,而不至于太复杂。
2.图示:
- 非门:用三角形+圆圈表示
- 与门:用D型图案表示
- 或门:用类似D向右弯曲的图案表示
- 异或门:用或门+一个圆弧表示
5、抽象的好处
使得分工明确,不同职业的工程师各司其职,而不用担心其他细节。
第四课:二进制
1、二进制的原理,存储单元MB/GB/TB解释
0.计算机中的二进制表示:
单个数字1或0,1位二进制数字命名为位(bit),也称1比特。
1.字节(byte)的概念:
1byte=8bit,即1byte代表8位数字。
最早期的电脑为八位的,即以八位为单位处理数据,2^8=256个取值(意味着八位机的游戏只有256种颜色)。为了方便,将八位数字命名为1字节(1byte).
2.十进制与二进制的区别:
- 十进制有10个数字,0-9,逢10进1(不存在10这个数字),则每向左进一位,数字大10倍。
- 二进制有2个数字,0-1,逢2进1,(不存在2这个数字),则每向左进一位,数字大2倍。
- 如何进行二进制与十进制联系起来:
- 将十进制与二进制的位数提取出来,编上单位:
eg.二进制的1011=1*2^0 + 0*2^1 + 1*2^2 + 1*2^3= 14(从右往左数)
eg.十进制的1045= 1*10^3 + 0*10^2 + 4*10^1 + 5*10^0
3.十进制与二进制的图示:
十进制的263
二进制的10110111
4.二进制的运算:
相同的位数相加,逢2进1
5. byte在电脑中的单位换算:
1kb=2^10 = 1024byte =1000byte
1TB=1000GB
1GB=十亿字节=1000MB=10^6KB
8bit(位)=1Byte(字节)
1024Byte(字节)=1KB
1024KB=1MB
1024MB=1GB
1024GB=1TB
6. 32位与64位电脑的区别
32位的最大数为43亿左右2*10^32=4,294,967,295=4G左右
64位的最大数为9.2*10^18
2、正数、负数、正数、浮点数的表示
1)计算机中表示数字的方法
1.整数:
表示方法:
- 第1位:表示正负 1是负,0是正(补码)
- 其余31位/63位: 表示实数
2.浮点数(Floating Point Numbers):
定义:小数点可在数字间浮动的数(非整数)
表示方法:IEEE 754标准下
用类似科学计数法的方式,存储十进制数值
- 浮点数=有效位数*指数
- 32位数字中:第1位表示正负,第2-9位存指数。剩下23位存有效位数
eg.625.9=0.6259(有效位数)*10^3(指数)
3、美国信息交换标准代码-ASCⅡ,用来表示字符
1.全称:美国信息交换标准代码
2.作用:用数字给英文字母及符号编号
3.内容:7位代码,可存放128个不同的值。
4.图示:
4、UNICODE,统一所有字符编码的标准
1.诞生背景:1992诞生,随着计算机在亚洲兴起,需要解决ASCⅡ不够表达所有语言的问题。
为提高代码的互用性,而诞生的编码标准。
2.内容:UNICODE为17组的16位数字,有超过100万个位置,可满足所有语言的字符需求。
第五课:算术逻辑单元
1、什么是算术逻辑单元
1.命名:简称ALU,Arithmetic&Logic Unit
2.组成:ALU有2个单元,1个算术单元和1个逻辑单元(Arithmetic Unit和Logic Unit)
3.作用:计算机中负责运算的组件,处理数字/逻辑运算的最基本单元。
2、算术单元
负责计算机里的所有数字操作
1)基本组件:
- 由半加器、全加器组成
- 半加器、全加器由AND、OR、NOT、XOR逻辑门组成
2)加法运算
1.组件:AND、OR、NOT、XOR逻辑门
2.元素:输入A,输入B,输出(均为1个bit,即0或1)
ps:1true,0false二进制加法的输入和输出,和XOR门的逻辑完全一样,即可以把XOR用作1位加法器(电路设计思路)
3.半加器:
- 作用:用于计算个位的数字加减。
- 输入:A,B(都是1位)
- 输出:总和,进位
- 抽象成一个组件运用:
4.全加器:
- 作用:用于计算超过1位的加法,由于涉及进位,因此有3个输入(C充当进位)
- 3个输入:A,B,C(都是1个bit)
- 两条输出线:总和,进位
半加器制作全加器,原理图示:
抽象全加器:
3)如何用半加器与全加器做8位数的加法
1.说明:以8位行波加法器为例
- 用半加器处理第1位数(个位)的加法,得到的和为结果的第1位。
- 将输出的进位,输入到第2位用的全加器的输入C中。
- 将第2位的2个数用全加器计算,得到的和为结果的第2位(sum)。
- 将第2位计算的进位连接到百位的全加器输入C中。
在第3-8位上,循环第3-4步的操作。
*现在电脑使用的加法器叫“超前进位加法器”
4)算术单元支持的其他运算
专门做乘法的算术单元,更多的逻辑门来实现,处理器性能更优。
3、溢出的概念
内容:在有限的空间内,无法存储位数过大的数,则称为溢出。(两个数字的和太大了,超过了用来表示的位数)
说明:第8位的进位如果为1(第9位有进位),则无法存储,此时容易引发错误,所以应该尽量避免溢出。
4、逻辑单元
作用:执行逻辑操作,如NOT、AND、OR等操作,以及做简单的数值测试。
比如:一个数字是否是负数。
5、ALU的抽象
1)74181用了70个逻辑门,但不能执行乘除
8位ALU需要数百个逻辑门
作用:ALU的抽象让工程师不再考虑逻辑门层面的组成,简化工作。(输入二进制,会执行计算)
2)图示:
抽象成符号像一个大“V”。
3)说明:
图示内容包括:
- 输入A,B
- 输出
- 标志:溢出、零、负数(高级ALU有更多标志)
- 算数结果为负,“负数标志”才是真
- 作差比较法
第六课 寄存器与内存
0、课程导入
当玩游戏、写文档时如果断电,进度会丢失,这是为什么?
- 损失数据的原因是这是电脑使用的是RAM(随机存取存储器),俗称内存,内存只能在通电情况下存储数据。
- 另一种存储(memory)叫持久存储,电源关闭时数据也不会丢失,存其他东西。
- 先由只能存储1位的电路再扩大,做出内存模块,和ALU结合起来做出CPU。
1、概念梳理
- 此前电路都是单向的,向前流动——>可以回向电路,输出连回输入
永久记录1
永久记录0
有用的存储,把两个电路结合起来
- 锁存器:锁存器是利用AND、OR、NOT逻辑门,实现存储1位数字的器件。
- 寄存器:1组并排的锁存器。(并排放8个锁存器,存8位信息)
- 寄存器能存一个数字,这个数字有多少位,叫"位宽"。
- 矩阵:以矩阵的方式来存放锁存器的组合件,n*n门锁矩阵可存放n^2个锁存器,但同一时间只能写入/读取1个数字。(早期为16*16矩阵)
- 启用某个锁存器,就打开相应的行线和列线。
- 位址:锁存器在矩阵中的行数与列数。
- 唯一指定'交叉路口"地址 eg.12行 8列
- 2^4>12,最多16行,4位就够12=【1100】,8=【1000】,12行 8列=【1100 1000】,地址的行列转换。
- 多路复用器:一组电线,输入2进制的行址&列址,可启用矩阵中某个锁存器
- 内存(RAM):随机存取存储器,由一系列矩阵以及电路组成的器件,可根据地址来写入、读取数据。类似于人类的短期记忆,记录当前在做什么事情。
2、锁存器
作用:存储1位的电路,"锁定"了一个值。
写入:放入数据
读取:拿出数据
图示:
2.5、门锁:
锁存器需要同时输入2个数字,不太方便。
为了使用更方便,只用1根电线控制数据输入(将它设为0或1来存储值),发展了门锁这个器件。
另外,用另一根电线来控制整个结构的开关(“启用”内存),启用时允许写入,没启用时就"锁定"。(和复位作用不同)
抽象:
把"门锁"放到盒子里,这个盒子能存一个bit
- 允许写入0(锁门):无论数据输入如何,数据输出不会改变
- 允许写入1(开门):数据输入改变数据输出,关闭允许写入,数据即存储。
3、寄存器
作用:并排使用门锁,存储多位数字
图示:
写入寄存器前,要先启用里面所有锁存器,E=1
然后用8条D数据线发数据,然后将"允许写入线"E设回0,8位值即存起来。
8D+8Q+1E=17根线
4、门锁矩阵
作用:
n*n的矩阵有n^2个位址,则可以存储n^2个数。但1个矩阵只可记录1位数字,n个矩阵组合在一起,才可记录n位数。如1个8位数,会按位数分成8个数,分别存储在8个矩阵的同一个位址中。
8个矩阵,则可以记录256个8位数字。
通俗理解:
16*16的门锁矩阵,可理解为1个公寓,1个公寓256个房间。
8个门锁矩阵并排放,则有了8个公寓。
规定每一个公寓同一个编号的房间,都有一样的标记(地址),共同组成8位数字。
那么8个公寓就能存 (8*256 / 8)个数字。
原因:
16*16的门锁矩阵虽然有256个位置,但每次只能存/取其中1个位置的数字。因此,要表示8位数字,就需要同时调用8个门锁矩阵。
图示:
- 启用某个锁存器,就打开相应的行线和列线。
- 打开交叉处,存储器的"允许写入线",所有其他锁存器,保持关闭
- 可选择当个锁存器,这种行/列排列,用一根"允许写入线"连所有锁存器。锁存器为允许写入,行列必须均为1。
- 实现可以只用一根"数据线"连所有锁存器来传数据(因为只有一个锁存器会启用,只有那个会存数据。其他锁存器会忽略数据线上的值因为没有"允许写入")
- 256位存储只要35条线(【1数据线+1允许写入线+1允许读取线】控制矩阵线+32矩阵线选择锁存器)
4.5、多路复用器
工作方式:
16行,需要1到16多路复用器。输入一个4位数字(二进制),它会把那根线,连到相应的输出线。一个多路复用器处理行;另一个多路复用器处理列。
使用方法:
在多路复用器中输入位址,x行x列(2进制),即可点亮x行x列的锁存器。
举例:
行列数 |
矩阵1 |
矩阵2 |
矩阵3 |
矩阵4 |
矩阵5 |
矩阵6 |
矩阵7 |
矩阵8 |
1行5列 |
1 |
0 |
1 |
1 |
0 |
0 |
1 |
0 |
2行3列 |
0 |
1 |
0 |
0 |
1 |
1 |
0 |
1 |
256位内存抽象当成一个整体:
- 输入一个8位地址:4位代表列,4位代表行;需要"允许写入线""允许读取线";还需要一条数据线,用于读/写数据。
- 256位内存像寄存器一样并排放置,一行8个,可以存一个8位数字(1byte)
- 为了存一个8位数字,同时给8个256位内存一样的地址,每个地址存1位,总共能存256个字节(byte)
- 看成一个整体的可寻址内存
5、内存
粗略定义:将一堆独立的存储模块和电路看做1个单元,组成内存方块,n个内存方块组成内存模块。在一个电路板上所有的内存方块统称为内存(RAM)。
- 一个memory只能存一个bit位,由于地址线、允许写入线、允许读取线是共用的,意味着对每个memory的同一地址进行读取、写入操作。
- 数据的写入、读取是单独分开的,从而实现一个8位数(二进制)的存储。
- 256个内存地址(0-255),每个地址能读或写一个8位值(8个256位内存)。
内存特性:可以随时访问任何位置
图示:
1980年内存RAM条:
128*64=8192位
- 锁存器实现SRAM(静态随机存取存储器)
- DRAM、闪存、NVRAM,用不同的电路存单个位(不同的逻辑门,电容器,电荷捕获或忆阻器)
- 矩阵层层嵌套,来存储大量信息。
第七课 中央处理器(CPU)
1、概念梳理
- CPU(Central Processing Unit):中央处理单元,负责执行程序,程序由一个个操作组成(这些操作叫指令)。
- 通常由寄存器/控制单元/ALU/时钟组成。与RAM配合,执行计算机程序。
- CPU和RAM之间用“地址线”、“数据线”和“允许读/写线”进行通信。
- 指令:指示计算机要做什么,多条指令共同组成程序。如数学指令(加/减)CPU会让ALU进行数学运算;内存指令,CPU和内存通信,然后读/写。
- 微体系架构:CPU有很多组件,重点放在功能,而不是一根根线具体怎么连。当用一条线连接两个组件时,这条线只是所有必须线路的一个抽象,是一种高层次视角。
- 时钟:负责管理CPU运行的节奏,以精确地间隔,触发电信号,控制单元用这个信号,推动CPU的内部操作。
- 时钟速度:CPU执行“取指令→解码→执行”中每一步的速度叫做“时钟速度”,单位赫兹Hz,表示频率。
- 超频/降频:
- 超频,修改时钟速度,加快CPU的速度,超频过多会让CPU过热或产生乱码。
- 降频,降低时钟速度,达到省电的效果,对笔记本/手机很重要。
2、CPU工作原理
1)必要组件:
- 指令表:给CPU支持的所有指令分配ID
- 0010:LOAD_A将RAM地址为后4位的二进制值存入寄存器A
- 0001:LOAD_B将RAM地址为后4位的二进制值存入寄存器B
- 0100:STORE_A将寄存器A的值放入内存
- 1000:ADD后4位,2位2位分别代表2个寄存器,前2位代表的寄存器的值,加到后2位代表的寄存器里
- 读取---》读取---》相加---》存储
- 控制单元:像指挥部指挥CPU所有组件,有序的控制指令的读取、运行与写入。
- 指令地址寄存器:追踪程序运行到哪里了,存当前指令的内存地址。类似于银行取号。该器件只按顺序通报地址,让RAM按顺序将指令交给指令寄存器。
- 指令寄存器:存当前指令,存储具体的指令代码。
- CPU假设配置前提:
- RAM内存
- 4个8位寄存器ABCD:临时存数据和操作数据
- 数据以二进制存在内存,程序同样可以
- 给CPU支持的所有指令,分配一个ID,用前四位存“操作代码”(操作码)后四位代表数据来自哪里(可以是寄存器或内存地址)
- 还需2个寄存器,完成cpu。即:指令地址寄存器和指令寄存器
2)过程
当启动计算机时,所有寄存器从0开始,假设在RAM里放了一个程序。
- CPU的第一个阶段(取指令阶段)
- 取指令:负责拿到指令。
- 指令地址寄存器发地址给RAM→RAM发该地址内的数据给指令寄存器→指令寄存器接受数据
- 首先,将"指令地址寄存器"连到RAM,"指令地址寄存器"值为0因此RAM返回地址0的值,即0010 1110会复制到指令寄存器里
- 指令拿到了,要弄清是什么指令,才能执行,而不是kill,这是解码阶段。
- 解码:指令寄存器根据数据发送指令给控制单元 →控制单元解码(逻辑门确认操作码)
- 前4位0010是LOAD_A指令:把RAM的值放入寄存器A。(把地址为后4位(十进制)的8位二进制放入寄存器A)
- 后4位1110是RAM的地址,转成十进制是14
- 接下来,指令由“控制单元”进行解码
- 控制单元也是逻辑门组成的
- 比如,为了识别“LOAD_A”指令需要一个电路,检查操作码是不是0010,可用很少的逻辑门实现,即:知道了是什么指令就可以,开始执行了。
- 执行阶段:控制单元执行指令(→涉及计算时→调用所需寄存器→传输入&操作码给ALU执行)→调用RAM特定地址的数据→RAM将结果传入寄存器→指令地址寄存器+1
- 用检查是否是 LOAD_A指令的电路,可以打开RAM的“允许读取线”,把地址14传过去
- RAM拿到地址14的值:0000 0011(十进制的3)
- 因为是LOAD_A指令,需要把这个值只放到寄存器A,其他寄存器不受影响,所以需要一根线,把RAM连到4个寄存器,用“检查是否LOAD_A指令的电路”启用寄存器A的“允许写入线”
- 成功把RAM地址14的值,放到了寄存器A,指令完成,关掉线路拿下一条指令
- “指令地址寄存器”+1,"执行阶段"就此结束
- 取指令--->解码--->执行
3)必要组件:
不同指令由不同逻辑电路解码,这些逻辑电路会配置CPU内的组件来执行对应操作,具体解码电路比较繁琐
把“控制单元”包成一个整体
- ADD指令举例1000 0100:ADD后4位,2位2位分别代表2个寄存器,
-
- 2位可以表示4个值(00--寄存器A;01--寄存器B;10--寄存器C;11--寄存器D)
- 前2位代表的寄存器(寄存器B)的值,加到后2位代表的寄存器(寄存器A)里
- 执行该指令,需要整合ALU,“控制单元”复制选择正确的寄存器作为输入,并配置ALU执行正确的操作
- 对于ADD指令,“控制单元”会启用寄存器B,作为ALU的第一个输入;还启用寄存器A,作为ALU的第二个输入,ALU可以执行不同操作所以控制单元必须传递ADD操作码告知ALU执行什么操作。
- 结果应该存到寄存器A
- 但不能直接写入寄存器A,这样新