1.计算机组成原理
1.计算机的分类--背景篇
计算机可以分为5类:
超级计算机:
例如: 神威太湖之光,天河2号,天河1号
【应用场所:在尖端科研领域提供算力 运算速度以TFlop/s为单位。普通个人计算机是GFlop/s为单位】
大型计算机:
应用于证券交易所,石油勘探,08年以前的阿里巴巴
主要制造公司是IBM,有专门的编程语言。
08年阿里巴巴提出了去“IOE”行动,09年创建了阿里云。“IOE”指的是IBM的大型机,Oracle的Oracle数据库,EMC的存储设备
将集中式架构变成了分布式架构
【算力比超级计算机低】
迷你计算机(服务器)
也就是服务器,国内主要厂商是联想,华为,浪潮。
【在大多数企业中已经通过服务器集群可以代替大型机】
工作站
影视工作者们常用的提高生产力工具。性能和个人计算机还是有明显的界线差别。
个人计算机
常用的电脑。分为一体机,台式机,笔记本电脑
5类计算机价格由低到高
2.计算机的体系与结构--背景篇
冯诺依曼体系:
将程序指令和数据一起存储的计算机设计概念结构
将程序存储起来,同时设计的是通用电路。当我们需要运行某种程序的时候,先将这段程序翻译成电路能够理解语言,然后让通用电路去执行相关的逻辑。
核心概念:存储程序指令,设计通用电路
冯诺依曼体系下的计算机的5大组件:
1.必须有一个存储器
【存储要运行的程序,以及要程序运行所需要的数据】
2.必须有一个控制器
【因为我们需要存储程序,就需要知道执行到哪一步,下一步该执行什么程序。这一切的操作需要有一个控制器来控制流程】
3.必须有一个运算器
【负责完成运算的操作】
4.必须有一个输入设备
【输入数据】
5.必须有一个输出设备
【反馈结果】
现代计算机都是冯诺依曼机。同时计算机领域的很多"轮子"都用的是冯诺依曼体系这种设计思想!
冯诺依曼机的功能:
1.能够把需要的程序和数据送至计算机中
这一点通过输入设备来实现
2.能够长期记忆程序、数据、中间结果及最终运算结果的能力
这一点是依赖冯诺依曼机中的存储器来实现的
3.能够具备算术、逻辑运算和数据传送等数据加工处理的能力
由运算器和控制器所完成的
4.能够按照要求将处理结果输出给用户
这一点通过输入设备来实现的
结构图:
可以看到控制器控制着着另外4个组件。从输入设备传来的数据,只经过运算器的直接处理。****数据由存储器或者运算器发送给输出设备
冯诺依曼瓶颈:
产生原因:CPU和存储器是分开的
造成影响:CPU和存储器之间的问题无法调和。CPU处理速率很快,而存储器的处理速率相比较慢。这样就导致,不断由CPU产生的新数据,存储器来不及存储。CPU因此经常空转等待数据的传输。这样非常浪费资源。把CPU跑满才是充分利用计算机的表现。
现代计算机的结构:
(是什么?)概念:现代计算机是在冯诺依曼体系结构的基础上进行修改
(为什么?)产生的原因:主要是为了解决CPU与存储设备之间的性能差异。
(怎么样?)如何解决冯诺依曼瓶颈:现代计算机的CPU=运算器+控制器+存储器 3者在同一块芯片上面。
存储器(广义定义):可以存储设备的介质
一般说存储器,可能首先想到的是磁带和硬盘,但是在CPU中的存储器指的是CPU的寄存器,同时还有计算机的内存也是为了解决性能差异的。两者都是围绕控制器和运算器的更高速的设备。
因此现代计算机的结构可以理解为:以存储器为核心
3.计算机的层次与编程语言--背景篇
1.程序翻译和程序解释
程序翻译:将人类语言(英语,汉语等)翻译成计算机语言(0101010111)
需要进行语言之间的转换
为了做到转换我们需要:
1.较为高级的计算机语言,这里称之为L1
2.较为低级的计算机语言,这里称之为L0
我们用L1 编写代码(L1进行程序逻辑的描述)然后通过编译器生成逻辑等价的L0编写的代码(产生了新的程序)。这里的L0是计算机实际执行的语言。我们将L1生成L0称为程序翻译
我们用L1编写代码(L1进行程序逻辑的描述,为了实现L1,我们还需要用L0实现 另外一个程序。而这个程序将L1作为输入进行执行(这个用L0写的程序我们称为解释器),每一条L1语句都会被等价逻辑转化成L0所编写的代码(没有产生新的程序)。我们将这个过程称为程序解释。
两者的区别与联系:
1.计算机执行的指令都是L0
2.翻译过程生成新的L0程序,解释过程不生成新的L0程序(它只是将L1代码输入到解释器中,然后解释器将其转化为L0代码。可以理解为点石成金)
常见的翻译性语言:C/C++ Object-C Golang
常见的解释性语言:Python PHP JavaScript
翻译+解释:JAVA C#
why,java???
java先编译成JVM字节码,然后通过解释器变成机器码
2.计算机的层次与编程语言
总共有7个层次:
7.应用层
6.高级语言层
5.汇编语言层
4.操作系统层
3.传统机器层
2.微程序机器层
1.硬件逻辑层
1、2、3三层属于实际机器层 ,而4、5、6、7这4层是虚拟机器层。同时虚拟机器还可以分为2个部分。5、6、7这三层属于系统软件,而应用层主要是应用软件。
分开来看:
1.硬件逻辑层:
门、触发器等逻辑电路
属于电子工程领域
2.微程序机器层:
编程语言是微指令集
微指令所组成的微程序直接交由硬件执行
3.传统机器层:
编程语言是CPU指令集(机器指令),它存储在CPU内部,对CPU的运算和优化 进行指导。
在这一层,程序员所用机器指令编写的程序,可以交由微程序直接进行解释执行。
编程语言和硬件是直接相关。
inter和AMD的最大区别也是在这里,它们所使用的指令集不同。同一个厂商也可以生成不同指令集的CPU,例如X86架构和X64架构
不同架构的CPU使用不同指令集
微指令、微程序、机器指令三者之间的关系:
1.一条机器指令对应着一个微程序
2.一个微程序对应着一组微指令
总体来说:微指令<微程序=机器指令
4.操作系统层:
向上提供了简易的操作界面
向下对接了指令系统,管理硬件资源
由此可见操作系统是在软件和硬件之间的适配层
5.汇编语言层:
编程语言是汇编语言
汇编语言可以翻译成可直接执行的机器语言
完成翻译的过程的就是汇编器
从这层起,使用的编程语言都是人类比较容易理解的编程语言
PUSH DS
PUSH AX
MOV AX,0040
MOV DS,AX
6.高级语言层:
编程语言为主流程序员所接受的高级语言
高级语言的类别非常多,有几百多种
常见的高级语言有:Python,Java,C/C++,Golang等
7.应用层
满足计算机针对某种用途而专门设计
例如:ppt,word
也可以把它理解为面向问题的应用语言
最后,分层的目的是便于理解,而不是固定的。今天的软件可能变成明天的硬件
4.计算机的速度单位--背景篇
1.容量单位
在物理层面,高低电平记录信息。高电平表示1,而低电平表示0
理论上只认识0/1两种状态。这里的0/1称为bit(比特位)
0/1能够表示的内容太少了,需要更大的容量表示方法
因此有人就想到了用8个bit来表示一个字节
| bit | byte | kb | MB | GB | TB | PB | EB | |
|---|---|---|---|---|---|---|---|---|
| 名字 | 比特位 | 字节 | 千字节 | 兆字节 | 吉字节 | 太字节 | 拍字节 | 艾字节 |
| 比例 | - | 8byte | 1024b | 1024MB | 1024MB | 1024GB | 1024TB | 1024EB |
| 常见设备 | 门电路 | - | 寄存器 | 高速缓存 | 内存/硬盘 | 硬盘 | 云硬盘 | 数据仓库 |
1024=2^10
常见的习题:
1GB内存,可以存储多少字节的数据?可以存储多少比特的数据?
$$
1GB=1024MB=10241024KB=102410241024byte=81024102410244bit
$$1073741824byte 8,589,934,592bit
1GB=10243byte=8*10243bit
为什么买的500GB的移动硬盘,格式化后就只剩465G了
硬盘商是10进制来标记容量的,他们眼中的1GB=1000MB,而不是1024MB
先化成bit,再由bit换为GB
$$
500*10003/10243 =465
$$
容量换算的结果大约是465GB
U盘中也是类似的。使用10进制位来标记容量是为了记录硬盘扇区,这里使用人类常用的十进制会更好理解和沟通。
常见的2M宽度,10M宽带,100M宽度。这里的兆是否是容量单位?
这里的100M并不是指容量单位,那100兆指的什么???
**指的是100Mbps或者说是100Mbit/s,bit/s变成byte/s需要进行除8单位换算,100Mbit/s也就是12MByte/s **
2.速度单位
网络速度单位
为什么100M宽带,测试峰值速度只有12MB每秒?
网络常用的单位为Mbps,只是我们使用时,经常将其省略为M
也就是说:100M/S=100Mbps=100Mbit/s=(100/8)MB/s=12.5MB/s
100M指的是Mbit/s而不是Mbyte/s,Mbyte/s简写为MB/S
CPU速度单位
CPU的速度一般体现为CPU的时钟频率
CPU的时钟频率的单位一般都是赫兹(Hz)
主流CPU的时钟频率都在2GHz以上
Hz其实就是秒分之一。它是每秒的周期性变动重复次数的计量
常见的:蝴蝶翅膀振动的频率为每秒15次,也就是15Hz。而蜜蜂振动每秒可达400次,也就是400Hz。而我们人耳可以听见的声音的频率的范围为20~20000Hz
我们知道CPU是用高低电平来表示0/1的,由0到1,由1到0这算是一次周期性变化。而计算机CPU就是在不断的做着这样的CPU变化。
2GHz=2*1000^3Hz=每秒20亿次
主流的2GHz也就代表着CPU可以做着每秒20亿次高低电平的变换
5.计算机的字符与编码集--背景篇
ACSII码:
7个bit位(2进制中的位)就可完全表示ACSII码
包含95个可打印字符
33个不可打印字符(包括控制字符),在表的前两列(32个),以及表的最后一个
33+95 =128=2^7
这里的bit位,表示的是每一个bit表示一个ASCII码时,表示完所有的ASCII码,所需要的bit数的位数。
bit位:表示完所有地址/方案/元素所需的bit的个数的个数
ACSII码表
extended ACS||码
由8bits代替了7bits。由于是8位,变成了256个字符
扩充包括:
常见的数学字符
带音标的欧洲字符
其他常用的符,表格符
字符编码集的国际化
出现的原因:
欧洲,中亚,东亚,拉丁美洲国际的语言的多样性
语言体系不一样,不以有限的字符组合的语言
以中国,韩国,日本的语言最为复杂
中文编码集
GB2312:国标2312,全称为《信息交换用汉字编码字符集—基本集》
一共收录了7445个字符
包括了6763个汉字,以及682个其他符号
GB2312需要多少bits?
$$
10242=2048,20482=4096,4096*2=8192
$$
1024=210,8192=213
GBK:全称《汉字内码拓展规范》 1995年推出
向下兼容了GB2312,向上支持了国际的ISO标准
收录了21003个汉字,支持了全部中日韩汉字
但这是本地的编码集,并不是国际化的编码。如果外国人本地用的不是GBK或者GB2312的编码集访问中文网站,就会出现乱码
兼容全球的字符集:Unicode
Unicode:统一码,万国码,单一码
Unicode规定了世界通用的符号集,UTF-*实现编码
UTF-8就是以1个字节(8个bit)为单位对Unicode进行编码
Unicode是字符集 ,UTF-8则是对进行编码之后的编码集
实际开发中推荐使用UTF-8来编码
Windows系统中文环境默认是GBK编码(它向下兼容GB2312,显示时可能是GB2312),设置IDE时就需要将编码集改成UTF-8
6.计算机的总线--组成篇
(是什么?)总线的概述:
USB全称为通用串行总线
*提供了对外连接的接口
*不同设备可以通过USB接口进行连接
*连接的标准,促使外围设备接口的统一
除此之外,还有PCI总线(插显卡的),ISA总线,Thunderbolt总线等
(有什么用?/为什么要有总线?)总线的主要作用:解决不同设备的通信问题
如果没有IO总线,5大设备各自分散连接,如果要新增一个输出设备就需要各自连接其他4个设备!
如果是IO总线,所有设备都连接在总线上面,以总线为核心。如果新增设备,直接连接在总线上面即可!优点是简化结构的复杂度,使结构清晰,容易梳理
总线的分类:
片内总线:
指的是CPU内的总线,它连接的是高速缓存、控制器、中断系统、运算器
芯片内部的总线
连接寄存器与寄存器之间
寄存器与控制器、运算器之间
总体来说,片内总线:高集成度的芯片内部的信息传输线
系统总线:CPU、主内存、IO设备、各组件之间的信息传输线
可以分为三类:
数据总线:一般与CPU位数相同(32位,64位) 【线上走的是数据信息】
作用:双向传输各个部件的数据信息
数据总线的位数(总线宽度)是数据总线的重要参数。如果是32位,那它一次就可以传32bits,也就是4个字节的数据。如果是64位则可以一次传8个字节的数据
地址总线:指定源数据或目的数据在内存中的地址 【线上走的是地址信息】
作用:用于数据的寻址
地址总线的位数与存储单元的位数有关
地址总线位数=n,寻址范围0~2^n
控制总线: 【线上走的是控制信息】
作用:发出各种控制信号
控制信号经由控制总线从一个组件发给另一个组件
控制总线可以监视不同组件之间的状态(就绪/未就绪) 。例如键盘是否就绪,如果就绪就可以使用它作为输入设备。
总线的仲裁
(为什么?) 为什么要有总线的仲裁?
假设:
主存需要和硬盘和IO设备交换数据,此时总线是该由硬盘还是该由IO设备使用?
这时就需要一个第3方的仲裁器!
出现的原因(回答那个问题):为了解决总线使用权冲突问题
总线仲裁方法
1.链式查询:
仲裁控制器通过仲裁控制线连接着设备。假如设备2需要使用总线,它需要先通过仲裁控制器向仲裁控制器发出总线使用的请求。然后仲裁器控制器释放出允许使用的信号。经过设备1时若是设备1也发出了请求,则最后优先使用设备的就是设备1,而不是设备2。
好处:电路复杂度低,仲裁方式简单
坏处:优先级的设备难以获得总线使用权。设备的优先级就体现在链式查询中的先后顺序。
坏处:对电路故障敏感(串联 电路都有)
2.计时器定时查询
仲裁控制器给每一个设备都有一个编号。同时它自身有一个计数器,最开始是1,因此它向所有设备通过仲裁控制器发送计数值1。如果计数值与发出仲裁信号的设备编号相等,则该设备获得总线使用权。图中是设备2发出的信号。当仲裁控制器发出计数值1的时候,设备1并没有发出仲裁信号,其他设备则是自身编号与计数值不相等。此时的计数器累计计数,计数值由1变成了2,然后通过仲裁控制线向所有设备发送计数值2,此时设备2的编号与计数值2相等!因此设备2得到了总线使用权。如果此时设备3向仲裁控制器发送了请求,则下一次计数器使用时,又加1由2变成了3。然后下一次仲裁控制器向所有设备发送计数值3.
仲裁控制器对设备编号并使用计数器累计计数
接受到仲裁信号后,往所有设备发出计数值
计数值与发送仲裁信号的设备编号一致则获得总线使用权
独立请求:
每个设备均有总线独立连接仲裁器
设备可单独向仲裁器发送请求和接受请求
当同时收到多个请求信号,仲裁器有权按优先级分配使用权
好处:响应速度快,优先顺序可动态改变
坏处:设备连线多,总线控制相对复杂