CrashCourseComputerScience(1)-计算机历史及硬件
背景
本文是在回顾Crash Course计算机系列视频的笔记,本系列课程的老师是外网有名的Carrie Anne.
关于Crash Course
Crash Course 10分钟速成课,中文叫做“碰撞课程”,是Hank Green和John Green两兄弟在Youtube上制作的系列免费课程.而计算机系列课程是Crash Course是其中的热门课程
此课程的教导目的:
wo`re going to explore a range of computing topics as a discipline and a technology
此系列课程的意义(引用B站评论):
计算机专业不请自来,这系列视频很有用,10分钟可以把我老师十几节讲的东西讲清楚(细节和具体代码自己看),简直神了,这是搭知识框架的东西。现在的大学课程是什么东西呢?大学课程类似于一个花瓶的局部,上面的花纹精美,描绘花纹的技法精妙无比,但是你把每一门课学完,你会觉得,这花纹挺牛逼的啊,但是这花纹是画在哪的呢?这系列课告诉你,哦,这花纹是画在一个花瓶上的。这课有用,简直太有用了!
–宇宙牧场
关于Carrie Anne
最初Anne老师是一名历史学学生,由于兴趣进入了IT领域,最终成为一名YouTube的计算机老师.由于在YouTube的爆火,被Crash Course邀请主持Computer Science系列.最近听说Anne拿到了MBE,恭喜!
计算工具早期历史
graph 公元前2500年算盘发明,用于手动计算-->接下来4000年发明了星盘,计算尺,时钟等工具-->17世纪出现了专门从事计算的职位-->17世界末出现了机械结构的步进计算器,并制作了计算表-->19世纪差分机和分析机的构想提出-->19世界末punch_card结合电子机械计算器帮助美国政府完成人口普查
电子计算机发展历史
graph 1944年,IBM使用了机械继电器制造了哈佛马克1号-->1943年使用真空管制造了巨人1号,使用物理插板配置--> 1946年可编程的计算机ENIAC被制造--> 1957年IBM发布了晶体管制造的消费级计算机
机械继电器: 开关速度慢(约50times/s),易磨损
三极真空管: 开关速度快(几千次/s),容易烧坏
晶体管: 开关速度极快(百万次/s),小型,稳定性高,1947贝尔实验室制造
?我们为什么要用继电器, 为什么要用一个线路的通断控制另一个电路的通断?
这个标题下面全是私货
疑问
Crash Course第一节课讲述了古代的计算工具,而第二节课讲到了电子计算机的时候,则直接跳到了机械继电器的实现原理,以及后续真空管和晶体管对这种结构的优化从而推进了计算机的发展.这让我好奇,为啥这个电流开关这么重要,为什么要通过一个电路控制另一个电路?
关于继电器的作用
- 通过电流小,电压低的线路控制电流大电压高的电路的通断
- 一个独立电路控制另一个独立电路,起到隔离电路的作用
我对继电器和计算机的理解
人类历史上出现最早的计算工具是算盘,下图是我构想的一个继电器控制的算盘电路.如果把被控制电路看成算盘(存储电路),那么继电器就可以看做拨算盘的手(控制电路).如 继电器2 开1次,则算盘10位所在电路通路,拨动算盘10位算子1个,致使算盘10位数字加1.
即: 我们开关继电器的操作,控制了储存的数据
但是为什么我们不直接控制算盘10位的开关呢?
解耦: 算盘电路相当于Springboot中的Dao层,我们可能在不同的算法中用到这个控制电路(借由巧妙的电路设计)
太慢了: 即使最早期的机械继电器每秒也能开关几十次, 我们的手速没那么快.
我们希望的是,
- 我输入表达式如: 1+12+123+…,
- 计算机先把这个表达式转化成几股二进制的电流,使用01控制继电器1,2,3的通断
- 第1次电流,继电器1为1,其他为0,则算盘显示为1
- 第2次电流,继电器1位2,继电器2为1,则算盘显示数字13
- …
- 计算完成,算盘显示计算结果
即:我们需要计算机,把我们的简单的输入结果转化成复杂的计算,再转化为简单的输出结果,为了实现
转化
所以我们必须要用电子开关实现电路对电路的控制
计算机比算盘强在哪里
计算机封装了算盘
每个计算器里面都有一个算盘(不是),看似计算机能完成复杂的计算,只是计算机将表达式转为算盘的加减乘除操作
拨算盘的速度更快了
计算机通过电流的通断来控制运算,还可以同时控制多个算盘,可以让计算速度提升了百亿倍
布尔逻辑和逻辑门
为什么计算机使用二进制传递储存信息?
- 稳定,物理电路的通断代表信息1和0
- 数学理论成熟,布尔代数对于二进制的研究,解决了所有数学法则和运算
逻辑门
组件 | 输入个数 | 输出 | 符号 | 备注 |
---|---|---|---|---|
Not Gate | 1 | 与输出相反与输出相同 | 三角+圆点 | |
And Gate | 2 | 输入均为True,输出True,否则输出False | D | |
Or Gate | 2 | 输入均为False,输出False,否则输出True | 飞船 | |
Exclusive Or | 2 | 输入不同则为True,否则为False | D+笑脸 | |
ALU | 2+1 | 8进制计算结果 | V | 输入2个计算数字以及1个operation Code(表示执行何种运算) |
二进制
二进制如何表示储存信息
- 二进制和十进制运算逻辑相同,只是满2进1
- 二进制最小单位bit,由一个0或者1组成,8bit为1byte
- 通过协议或者编码规则,二进制可以表示负数,小数,文字以及图片等
- 1963年,美国发布编码规范ASCII(American Stardard Code for Information Interchange ),1byte代表1个字符,可以用于表示大小写英文字母,符号,数字等.
- 1992年,Unicode发明,1个字符2byte,可以代表世界所有语言
ALU如何使用晶体管完成二进制运算
计算机中用于逻辑运算的组件 ,由Arithmetic Unit 和 Logic Unit2部分组成
Arithmetic Unit
ALU可以做多种运算,这里以加法为例.抽象层次
graph
逻辑门--> 半加器 --> 全加器 --> 8位加法器
Half Adder半加器
二级制加法运算中,我们2数相加满2进1,半加器可以通过一个异或门和与门实现
Input1 | Input2 | Output-Carry | Output-sum |
---|---|---|---|
0 | 0 | 0 | 0 |
1 | 0 | 0 | 1 |
0 | 1 | 0 | 1 |
1 | 1 | 1 | 0 |
ALU(Arithmetic and Logic Unit):算数逻辑单元
We can use whigh level of abstraction and built our components out of logic gates
全加器
全加器则进一步实现了3个数的相加,即Input1+Input2+LastCarry
8进制加法器
Logic Unit
用于逻辑判断,如判断2个数的大小,ALU会先使用算数单元进行减法运算,逻辑单元通过运算结果判断大小
Flag
如ZERO标志代表输出数字为0,OVERFLOW标志代表计算结果溢出
内存
锁存器Gated Latch
1个锁存器可以储存1位数据,锁存器主要可分为3个功能:
- 数据输入线: 输入写入数据 0 /1
- 允许写入线: 控制数据能否写入
- 图中1_a线路: 用于储存数据
计算机储存0/1,电路上即1_a线路的断/通,反应到物理上就是1_a对应晶体管半导体是不导电还是导电
data_input和write_enable线路都是通过逻辑门的组合控制数据的储存
graph LR data_input--1-->AND_0--1-->OR--1-->AND--1-->output write_enable--1-->AND_1--0-->NOT_1 --1-->AND AND--1_a-->OR data_input--1-->NOT_0--0-->AND_1 write_enable--1-->AND_0
寄存器Register
由多个锁存器组成用于存储数据的组件称为寄存器,为了节省线路,Register使用矩阵将这些锁存器组合起来以节省线路
如果我们的矩阵排列是16*16,那么我们就可以储存256bit数据
内存Memory
为了寻址,除了多个寄存器,我们还需要2个多路复用器Multiplexer,一个row Multipilexer和一个column Mutipilexer.他们可以通过给定的二进制,转为成矩阵中的坐标从而查询修改对应的Latch
内存大小和Register大小一致
graph LR input_data-->256-bit_memory write_enable-->256-bit_memory read_enable-->256-bit_memory 8-bit_address-->256-bit_memory
随机储存器RAM
以静态随机储存器为例,将8个内存组合在一起,存贮一个8位数字(1byte)的时候,使用一个8位地址作为矩阵列表,每个内存按照坐标存一位,最终完成数据的储存
这个RAM大小为8*256位
graph 8-bit_data-->RAM 8-bit_address-->RAM read_enable-->RAM write_enable-->RAM
我们不用知道某一字节对应的address: 一连串数据经常连续储存,读写数据的时候只要知道开始的地址和字节数就可以了,具体过程后面应该会讲到
RAM(Random Access Memery): 随机储存处理器
Persistent Memery: 持久储存
中间处理器CPU
CPU基本结构
CPU负责处理程序,主要由Control Unit,ALU和Clock组成
内部交互:
- Control Unit:控制指令的读取和执行
- ALU: 接受CU的数据和指令,返回数据处理结果
- Clock: 按照时钟速度控制CU执行1次完整操作的节奏
所谓CPU降频,即提高Clock的时钟速度
外部交互:
- RAM: 根据address_code对应的指令code,写入指令或者返回数据给CU,或者Registers
Control Unit
Control Unit中拥有一个指令寄存器和地址寄存器,用于执行和操作代码,
下图为CU和RAM,Register的交互演示:
sequenceDiagram instuction_address_register->>RAM:get_data RAM->>instruction_register:return_data{oprate_code+address_code} instruction_register->>RAM: 通过检查线路执行指令 RAM->>register:write_data
CPU执行指令主要分为3步:
- 取指令:通过地址寄存器取指令到指令寄存器
- 解码: 将指令中的指令code和地址code解码为指令和数据地址
- 执行: 按照解码的指令对对应数据进行处理,地址寄存器+1,进入下一个循环
指令和程序
所有的运行程序最终都会转化成CPU可以识别的指令,每个CPU可以识别的指令是不同的,一个CPU可以识别的指令的集合称为指令集
常见的指令类型:
- 读写数据的指令
- 处理数据的指令
- Jump, 改变指令读取顺序的指令
- Halt: 结束指令
高级CPU设计
- 减少CPU的切换时间
- 增加指令集(不断兼容历史版本)
- CPU加入Cashe用于缓存数据,减少CPU到RAM读取时间
- 通过指令流水线,并行处理多个程序
- 增加核心,增加CPU