计算机组成原理的概述
最近在看一些计算机基础课,边看边输出总结吧,方便自己查阅,也希望对读者有用。
计算机发展的四个阶段
- 电子管计算机(第二次世界大战因为破解密文发明的):1946-1957
- 晶体管计算机:1957-1964
- 集成电路计算机(IBM可以卖电脑,且操作系统有了雏形):1964-1980
- 超大规模集成电路计算机(乔布斯发明了一代苹果电脑):1980-现在
微型计算机的发展历史
集成电路计算机之后就算是微型计算机了
- 单核CPU:1971-现在
- 多核CPU:2005-现在
计算机的分类
- 超级计算机:运算速度超过TFlops/s(每秒一万亿次浮点运算)
- 大型计算机:IOE基本包揽(IBM ORACLE EMC,但维护费用很高,阿里在2008年提出”去IOE“,于是有了2009年的阿里云)
- 迷你计算机(服务器):联想、华为、浪潮等生产
- 工作站:性能比普通计算机强劲,适用于图形或视频工作者
- 微型计算机:就我们普通用的电脑,分为台式机、笔记本、一体机
计算机的体系
早期的计算机功能单一,想要切换功能,需要重新接电路之类的复杂操作。
冯诺依曼把程序指令和运行数据存储起来,使得计算机从专用电路计算机发展成为通用电路计算机,这也称为也成为冯诺依曼体系
。
为了实现能切换功能,冯诺依曼体系的主要组成部分如下:
- 存储器:存储程序和数据
- 控制器:切换程序
- 运算器:运算
- 输入设备:把需要的程序和数据送至计算机
- 输出设备:按照要求把处理输出给用户
冯诺依曼的瓶颈:CPU是由控制器和运算器组成,而CPU运行速度远高于存储器的速率,导致CPU经常空转,从而计算机性能无法提升
现代计算机这基础上进行了修改,将存储器放进CPU,以存储器为核心,根据局部性原理设计了存储器的层次结构,大幅提升计算机性能。
计算机的编程语言
人类语言:i am yan
计算机语言:01010110
两者并不相通,为了让计算机明白人类的语言,就需要翻译或者解释人类语言。
所以编程语言分为编译型语言和解释型语言。
- 编译型:程序代码在编译阶段,提前翻译成较低层次的编程语言逻辑(整体),在运行时直接运行。如C++、 OC、GoLang
- 解释型:程序代码在运行阶段,逐行翻译成较低层次的编程语言去执行。如PHP、Python、Javascript
- 有些语言则是两者的混合,C#、Java,如:Java => 编译 => JVM字节码(JVM虚拟机) => 解释 => 机器码
计算机的层次结构
先说三个概念
- 机器语言:是方便计算机理解和运行的编程语言,一般程序员无法理解,如
0101
- 汇编语言:是方便程序员描述硬件逻辑的编程语言,与底层硬件接近,如
PUSH DS;MOV DS,AX
- 高级语言:是程序员接触的高级语言,与人类语言接近,如Python、Java
为了理解计算机的整体体系,将其大致划分为7个层次结构,从下到上:
- 硬件逻辑层:门、触发器等逻辑电路组成,属于电子工程领域
- 微程序机器层:编程语言是微指令集,微指令所组成的微程序直接交由硬件执行,由硬件公司的程序员编写
- 传统机器层:编程语言是CPU指令集,编程语言和硬件直接相关,不同架构的CPU使用不同的CPU指令集
- 操作系统层:向上提供操作界面,向下对接了指令系统管理硬件资源,是位于软件和硬件之间的适配层
- 汇编语言层:编程语言是汇编语言,经过汇编器可以直接翻译成可执行的机器语言
- 高级语言层:编程语言是程序员接触的高级语言,如Python、Java、GoLang、C/C++
- 应用层:满足计算机针对某种用途而专门设计的APP,如Word
计算机的计算单位
主要是容量单位和速度单位
容量单位
计算机在物理层面,用高低电平记录信息,高表示1低表示0,只认识0/1两种状态,0/1也就是一个比特位bit
1个bit能表示的信息太少了,后来用8个bit表示一个字节,也就是 1Byte = 8bits
后来Byte也不足以描述容量,于是有了更大的单位
1G = 1024MB = 1024*1024KB = 1024*1024*1024B = 1024*1024*1024*8bits
也就是 1G = 1024^3B
这里有个梗,买电脑的时候说的500G硬盘,到家打开发现只有465G?
因为厂商的1G = 1000^3B
,换算成真实的容量500*1000^3/1024^3 = 465G
速度单位
- 网络速度:描述网络速度的常用单位是比特率,是指每秒传送的比特(bit)数。单位为 bps(Bit Per Second),比特率越高,每秒传送数据就越多。
- CPU速度:描述CPU速度的常用单位是Hz,表示是每秒中的周期性变动重复次数的计量,也可以简单理解为在单位时间内完成振动的次数。如蝴蝶的翅膀震动的频率是15Hz,表示1s中翅膀震动15次,蜜蜂是400Hz。CPU这里表示高低电平变换的频率。
再说一个梗:为啥光纤说的百兆宽带,实际使用中只有12M多?
因为:100Mbps = 100Mbit/s = (100/8)MB/s = 12.5MB/s
为什么人能听到蜜蜂的声音听不到蝴蝶的声音?
因为:人耳听到的范围是20Hz~2wHz
计算机的字符和编码集
字符编码集的历史
- ASCII编码集:共有128个字符(95个可打印,33不可打印的字符),128 = 2^7,所以使用7个bits就可以表示所有的ASCII码
- 扩充ASCII编码集:随着计算机开始普及,一些字符就不能用ASCII码表示了,如π,于是开始将7个bits变成8个bits,从而可以表示255个字符
- Unicode标准:普及到各个国家,需要兼容各个国家的语言,于是有了unicode标准,可以用不同的编码实现,比如UTF-8、UTF-16、UTF-32。编程推荐
utf-8
。
中文编码集的发展
- GB2312:1980年诞生的,但是不符合国际标准,外国人访问中国网站,因为本地没有,所以会乱码
- GBK:1995年诞生的,向下兼容了
GB2312
且向上支持国际ISO标准,收录21003个字符,支持中日韩汉字
一个问题,假设有10000个汉字,6000个日本字,3000个韩国字,1000个特殊字符,如果让你设计一套通用的编码集,请问每个字至少几个比特位?
1个比特位,只能表示2种信息,0表示1种,1表示1种。 2个比特位,能表示4种信息,00、01、10、11 对,就是排列组合,n个比特位能表示2^n种信息 于是,10000+6000+3000+1000 = 20000 < 2^15,也就是15个比特位
引用
本文图片是截图自咚咚呛老师的编程基础课
本文多数是总结性文字,也部分引用课程文字~