计算概论(二)计算机与程序运行基本原理
计算概论(二)计算机与程序运行基本原理
本篇是对北大信息技术学院
李戈
老师计算概论与程序设计基础
课程的笔记和总结,源课程地址
计算机的过去与未来
什么是计算机
计算机
名称的起源:
- 1646年正式出现”computer ”这一英文单词
- 当时是指专门从事计算工作的人
- 而用来计算的机器在1940年以前称为“计算器”或“制表机”
- 直到1940前后发明第一台电子计算设备,
计算机
这一名词才正式具备今天的内涵
计算机
是一种能够根据存储的一系列指令,接收输入、处理数据、存储数据并产生输出的设备
历史上的计算机
由于课程中介绍的计算机历史内容较多,就不一一列举了,简单介绍一些和文章关联性比较大的几个啦
普遍认为的第一台计算机
ENIAC
:全称Electronic Numeric Integrator and Computer
,叫做电子数字积分计算机
如图:
- 宾夕法尼亚大学摩尔学院 莫契利 (J. Mauchly) 和
埃克特 (J.Eckert) - 1943年开始,1945年完成,1946年2月14日正式启动
- 17468只电子管、7200个二极管、70000多电阻器,10000多只电容器和6000只继电器,电路的焊接点多达50万个;174000瓦功耗
- 30米长、3米高、30吨重、占地面积为170平方米
- 每秒5000次加法可以在3/1000秒时间内做完两个 10位数乘法
ENIAC
的缺点:
- ENIAC 还不是存储程序式的计算机
- 编程是通过手工插接线的方式进行的
从ENIAC
到EDVAC
EDVAC
:全称Electronic Discrete Variable Automatic Computer
,叫做电子离散变量自动计算机
如图:
- 1945年3月,计算技术的先驱
冯·诺伊曼
(John von Neumann) 来到莫尔学院 Mauchly 和 Eckert 进行了 两天讨论,拟定了存储程序式的电子计算机的方案。方案经冯·诺伊曼
整理后于1945年6月发表——存储程序控制原理
EDVAC
于1952年制造完成EDVAC
是世界上第一台存储程序计算机- 是所有现代计算机的原型和范本
现代计算机
全称:
通用电子数字计算机
(General ‐Purpose Electronic Digital Computer)
- 通用:计算机是一种通用信息处理设备,只要有合适的软件,它能适 用于各种用途
- 电子:是计算机硬件实现的物理基础,计算机的运行最终都通过电子 电路中的电流、电位等实现
- 数字化:是计算机的信息表示方式。一切信息,无论原本是数值、文 字、图形、声音等,在计算机里都统一到二进制的数字化表示上。数字化是计算机的一种基本特征,是通用性的重要基础
全新的计算机理论和计算模式
随着摩尔定律的失效,人们需要全新的计算机理论和计算模式。包括但是不限于
量子计算机
和生物计算机
等
量子计算的提出
1982年,理查德·费曼在一个著名的演讲中提出
利用量子体系实现通用计算
的想法。他发现,分析模拟量子物理世界所需要的计算能力远远超过了经典计算机所能达到的能力。用一个可控的量子系统(比如:一台量子计算机)来模拟和计算另外一个我们感兴趣的量子系统(比如:宇宙),会非常高效
量子计算 VS 经典计算
经典计算:
- 一个比特某一时刻只能保持一种状态
- 比如:两个比特,某一时刻只能存储以下一种情况:
00
、01
、10
、11
量子计算:
- 一个量子比特可以同时保持多种状态
- 比如,两个两字比特,某一时刻能同时存储以下所有的情况:
00
、01
、10
、11
理论上,300个量子比特,其承载的数据是2的300次方,这将超过整个宇宙的原子数量总和。
不过现实中,需要对计算过程进行纠错,需要很多个物理量子比特才能获得一个可容错的逻辑量子比特。因此,约1000个物理量子比特才能获得超越经典计算机的计算能力。
课程中还科普了很多量子计算机的基本原理和知识,感兴趣的同学可以去听一听哈
计算机的过去和未来
就先介绍到这里,我们把目光放回到现代计算机
,学习下程序运行的基本原理
。
程序运行的基本原理
我们在计算概论(一)
中已经知道:
电路是能完成计算的,所以,可以设计 加法、 减法、乘法…各种电路…,用它们来完成各种 类型的计算。
所以,是不是可以:
- 需要完成什么计算,就动手设计个相应的电路!
- 设计好很多个原子电路,需要的时候我就把它们临时组装在一起!
ENIAC
就是这样的机器,历史证明它已经过时了。
所以,不能通过重新“组合不同电路”的方式,去完成新的计算任务!
而应该:
- 通过 某种命令来控制计算机,让计算机按照这种命令来运行,这种命令可以用电信号表示;
- 这种命令不是“临时输入”到计算机,而是存放在某个地方,随时可以更改;
- 命令改了,计算机的功能也就改了!
- 这就是
EDVAC
!,世界上第一台存储程序计算机
。现在的计算机都是EDVAC
什么是存储程序计算机
存储程序计算机
又叫冯·诺伊曼式计算机
- 1945年冯·诺依曼以
关于EDVAC的报告草案
为题,起草了一份长达101页的总结报告。 EDVAC
是世界上第一台存储程序计算机,成为所有现代计算机的原型和范本。
技术特征
- 6000个电子管
- 12000个二极管
- 功率56KW,重7850KG
- 占地45.5平方米
- 需要三十个人同时操作
冯·诺伊曼式计算机
的结构:
控制器
- 统一指挥并控制计算机各部件协调工作
运算器
- 对数据进行算术运算和逻辑 运算。
存储器
- 存储待操作的信息与中间结
果,包括机器指令和数据。
输入设备、输出设备
工作流程
- 在
控制器
指挥下,从存储器
上取出指令 - 分析指令,得到计算
命令
和待操作的数
; - 从
存储器
上取出待计算的数放入运算器
运算器
计算结果- 输出到
存储器
或输出设备
我们先来看下储存器的分类
储存器的分类和特性
分类如下:
- 寄存器
- CPU内部,用于存放待操作数和结果
- 高速缓存
- 通常在CPU内部,用做数据缓冲区
- 内存
- CPU里想放但放不下的部分
- 外存
寄存器特性
- 工作速度与CPU运算部件节拍一致
- 一次存取数据大约花费
0.x纳秒
的时间 寄存器
与运算部件直接连接,运算部件直接对寄存器
进行读写操作寄存器
制作成本高,一般CPU芯片中通常只配备少数寄存器
CACHE(高速缓存)特性
- CPU内部的缓存叫
内部高速缓存
(Internal Cache) - 主板上的缓存叫
外部高速缓存
(External Cache) - 通常又分为多级,不同等级之间工作频率不同
- 一般在纳秒内读写一次
- 容量大小不同(nK-nM)
内存特性
- 内存储器,简称内存
- 存放CPU中的运算数据
- 存放与硬盘等外部存储 器交换的数据
- 临时存放,断电丢失
- 价格低、易于更换
- 工作频率越来越接近CPU工作频率,但仍有差距
CPU 数据读取规则
CPU读取数据时
- 先从缓存中查找,找到立即读取;
- 找不到,就用相对慢的速率从内存中读取并送给CPU处理
- 同时把这个数据所在的数据块调入缓存中
- 可以使得以后对整块数据的读取都从缓存中进行,不必再调用内存。
尽量减少可能的“慢”的读取操作;
局部性原理
- CPU对数据的访问通常具有一定的局部性:
- 时间局部性:如果一个内存地址正在被使用,那么在近期他很可能还会再次被访问
- 空间局部性:在最近的将来可能用到的信息很可能是与当前使用的信息相邻的
储存器相关名称解释
RAM
(Random Access Memory)
DRAM
(Dynamic RAM):可随机存取,但必须周期性的刷新以保持存储内容SRAM
(Static RAM):可随机存取,且不需要周期性刷新的存储器EDO DRAM
(Extended Data Out DRAM)扩展数据输出动态存储器- 在把数据发送给CPU的同时去访问下一个页面,从而提高了工作效率(约比传统的
DRAM
快15~30%)。
- 在把数据发送给CPU的同时去访问下一个页面,从而提高了工作效率(约比传统的
SDRAM
(Synchronous DRAM)同步动态存储器- 工作在CPU外部总线的频率上,与CPU的时钟同步。
DDR
(Double Data Rate SDRAM)双数据输出同步动态存储器DDR SDRAM
从理论上来讲,可以把RAM
的速度提升一倍,它在时钟的上升沿和下降沿都可以读出数据。DDR2
电压1.8v 高端频率可达1000MHzDDR3
电压1.5v 频率可达2000MHz 8bit预读DDR4
电压1.2v 数据传输速率 3.2GT/s
ROM
(Read Only Memory)
ROM
(掩膜 ROM):ROM生产时写入,用户不可更改PROM
(Programmable ROM,熔丝PROM):生产时空白,用户可写入,但写入后不可更改EPROM
(Erasable PROM,紫外线EPROM):可擦除重写,但必须使用专用设备EEPROM
(Electrically EPROM)Flash EPROM
(快速可擦除编程只读存储器)
储存器为什么能存住数字呢?
这个问题其实就是在问:怎样通过电路来储存数据呢?
先看一个循环或
电路:
请按如下思路模拟:
- 最初,
A
、B
输入都为0,则电路输出为0 - 此时,我们尝试改变
A
的输入状态为1 - 电路输出为1,同时
B
的输入状态也会变为1 - 此后,不管如何设置
A
,输出始终为1
再看一个循环与
电路:
请按如下思路模拟:
- 最初,
A
、B
输入都为1,则电路输出为1 - 此时,我们尝试改变
A
的输入状态为0 - 电路输出为0,同时
B
的输入状态也会变为0 - 此后,不管如何设置
A
,输出始终为0
根据上面两个简单电路,我们有了可以分别存储0和1的电路(除非断电),缺点就是无法修改。
然后我们把这两个电路组合优化,就得到一个锁存器
:
请按如下思路模拟:
- 将
RESET
设为1(启动复位),电路输出为0,循环电路输出为0 - 将
RESET
设为0(关闭复位),将SET
设为1,电路输出为1,循环电路输出为1- 此时如果不启动复位,不管
SET
设为何值,电路输出状态始终为1 - 这样就实现了保存数据1的功能
- 此时如果不启动复位,不管
- 然后想把数据变更为0,怎么办?
- 将
RESET
设为1(启动复位) - 将
RESET
设为0(关闭复位)
- 将
到这里,我们就可以回答刚才的问题了,通过锁存器
电路可以实现一个Bit的读写。
不过在此基础上,又优化出了一个门锁
的结构,我们看下电路图:
命令的执行
我们已经知道:
- CPU电路能进行计算;
- 冯诺依曼计算机
- 不需要通过“插线”临时 组合电路完成不同任务
- 以通过读取并执行“存储好的”命令来完成不同功能;
那我们再来了解下和命令执行相关的知识。
指令集
- CPU中用来计算和控制计算机系统的一套指令 的集合
- 在CPU设计时就预先定义好的
- 是体现CPU性能的重要标志。
像Intel X86指令集
、ARM指令集
等
指令
- 最终表现为二进制码
- 其长度随CPU类型不同 而不同;
- 包含一个或多个字节
- 包含
指令码
和操作数
指令码
说明要做的动作操作数
是指要操作的数或地址
CPU 工作方式
了解了
储存实现
和指令集概念
,我们再来简单看下CPU的工作方式。
-
运算器 ALU:Arithmetic Logic Unit
- 专门执行算术和逻辑运算的数字电路。
-
寄存器
- 累加器AC:暂存ALU的计算结果
- 状态条件寄存器PSR:ALU运算结果、系统工作状 态信息
- 数据寄存器MDR:缓存数据
-
控制器
- 程序计数器PC:存放下一条指令的地址
- 指令寄存器IR:存放当前正在执行的指令
- 地址寄存器MAR:存放要访问的主存地址
程序的执行
了解了
指令的执行
,那么我们写的程序又是怎样执行的呢?和指令又有什么关系呢?
看下面这个流程:
- 首先使用高级语言编写程序功能实现
- 通过特定的编译器编译成汇编语言(一句程序有可能转换为多句指令)
- 汇编语言再编译成机器指令,进而被CPU执行
- 整个执行过程是在内存中完成的,并且在内存中的不同区域,分别存放代码和相关的数据
- 整个执行过程在控制器的协调下连续、依次执行相应的指令
我们看下执行过程:
总结
通过计算概论(一、二)两篇文章,我们知道了:
- 计算机是能用电路进行计算的!
- 数 -> 二进制数 -> 都可以用布尔运算来算 -> 都能用电路实现
- CPU是制造好的电路,它能完成指令集里的运算!
- 指令是二进制的码,CPU能看懂,并执行它;
- 想要让CPU按照我们的想法做事,就应该:
- 通过一种编程语言把我们想做的事情写出来
- 把这个写出来的东西,翻译成CPU能看懂得二进制指令
这部分的内容是在学习
JVM
的时候同步学习的,总是可以找出一些相通的地方,计算机的设计真的是很伟大呀,哈哈哈。
计算概论到此就先结束了,后面全身心的进攻Android binder
啦