Java架构师成长之道之计算机组成原理概述篇
Java架构师成长之道
1.1 计算机的发展简史
1.1.1 计算机发展的四个阶段
自从1945年至今,计算机经历了电子管计算机,晶体管计算机,集成电路计算机以及超大规模集成电路计算机。
- 电子管计算机(1945年-1957年)
第二次世界大战是电子管计算机产生的催化剂,而最著名的电子管计算机是来自美国的埃尼阿克(ENIAC),这一时期的计算机有如下特点:
- 集成度小,占用空间大
- 功耗高,运行速度慢
- 操作复杂,更换程序需要接线
- 晶体管计算机(1957年-1964年)
1948年,贝尔实验室的三个科学家发明了晶体管,相比电子管而言,晶体管有着更小的体积,更低的功耗以及更高的运算效率。而全世界第一台晶体管计算机TX-0诞生于麻省理工大学的MIT林肯实验室,而当时性能最高的计算机是PDP-1,它具备4K的内存,每秒可以执行20W条指令,同时配备了512*512的显示器,晶体管相对于电子管计算机而言:
- 集成度相对较高,占用空间相对较小
- 功耗相对较低,运行速度较快
- 操作相对简单,交互更加方便
- 集成电路计算机(1964年-1980年)
集成电路计算机出现的背景是德州仪器的工程师发明了集成电路(IC),
- 计算机变得更小
- 功耗相对较低,
- 运行速度较快
- 具备进入千家万户的条件
在集成电路计算机阶段,IBM有两款畅销的计算机 IBM 7094和IBM 1401 ,但是这两款计算机主打的功能不同,并且相互无法兼容,而且企业购买IBM 7094和IBM1401后也不愿意投入两组人力开发,在此背景下IBM推出了兼容的产品System/360,也就是操作系统的雏形,它的出现使得不同的电子元器件,不同电路的计算机都能在同一个操作系统下运行。
- 超大规模集成电路计算机(1980年-今)
CPU就是超大规模集成电路的典型产品,一个芯片可以集成上百万的晶体管。
而且超大规模集成电路计算机速度更快,体积更小,价格更低,更能被大众接受,同时在此阶段计算机用途也变得丰富起来,可以用于文本处理,表格处理以及高交互的游戏和应用。
而乔布斯在这个阶段推出了Apple,Apple二代。
- 未来计算机
随着计算机的发展,未来会出现生物计算机和量子计算机。
生物计算机是以蛋白质分支作为主要原材料,和人体结合起来进行相关的运算。而且生物计算机体积小,不易损坏,提供生物级别的自动修复以及不受信号干扰和无热损耗。
量子计算机是遵循量子力学的物理计算机。
目前量子计算机已经有相关的研究成果
- 2013年5月,谷歌和NASA发布了D-Wave Tow
- 2017年5月,中国科学院宣布制造出光量子计算机。
- 2019年1月,IBM展示了世界首款商业化量子计算机
而且目前国内的阿里和腾讯在量子计算机领域进行相关的研究。
1.1.2 微型计算机的发展历史
微型计算机主要是计算机发展你的第三个阶段集成电路计算机开始。
微型计算机的发展主要是从计算能力区分的,在早期微型计算机是使用的单核CPU,而单核CPU的发展也经历了如下几个阶段
- 1971年-1973年 500KHz频率的微型计算机(字长8位)
- 1973年-1978年 高于1M频率的微型计算机(字长8位)
- 1978年-1985年 500MHz频率的微型计算机(字长16位)
- 1985年-2000年 高于1GHz频率的微型计算机(字长32位)
- 2000年-今 高于2GHz频率的微型计算机(字长64位)
而关于CPU性能,还有一个著名的定律-摩尔定律:当价格不变的情况下,集成电路元器件每隔18-24个月会提升一倍,性能就会提升一倍。
但是到21世纪,单核CPU逐渐出现了性能的瓶颈。而多核CPU的出现是为了解决单核CPU的性能瓶颈
- 2005年CPU产商Intel发布了奔腾系列CPU
- 2006年CPU产商Intel发布了酷睿四核CPU
- 目前在个人电脑可以选配Intel酷睿系列16核CPU,而服务器领域可以选择Intel至强系列56核CPU
1.2 计算机的分类
计算机可以按照不同的用途分为超级计算机,大型机,小型机,个人计算机。
- 超级计算机
超级计算机是功能最强,运算速度最快,存储容量最大的计算机,主要用于国家高科技领域尖端技术研究,我们使用每秒一万亿浮点数计算(1TFlop/s)指标来衡量超级计算机的性能。
如果想要了解超级计算机的排名,可以访问网站 https://www.top500.org/。
- 大型计算机
大型计算机又称为大型机、大型主机、主机等等,大型计算机具有高性能。可处理大量数据与复杂运算,应用场景通常是银行、证券等金融机构。在大型机市场领域,IBM占据着很大的份额。
由于大型机造价高昂,不够灵活,伸缩性弱,目前很多企业替换成小型机。
阿里巴巴在2008年发起去IOE行动,I就是IBM大型机,O就是商业数据库Oracle,E就是EMC存储,IOE代表了高成本,高维护费用的存储系统。去IOE就是将大型机换成了普通的服务器,将Oracle替换成了分布式的MySQL,去IOE行动直接驱动了阿里云的诞生。
- 服务器
服务器也被称为小型机,普通服务器,相对于大型机而言,不要特殊的空调场所,同时也具备不错的算力。常见的服务器厂商包括戴尔,联想,IBM。
普通服务器已经替代了传统的大型机,成为大规模企业计算机的中枢纽,比如国内的阿里云、腾讯云、华为云都是基于服务器构建的。
- 工作站
工作站是高端的通用微型计算机,可以提供比个人计算机更强大的性能,类似于普通台式电脑,体积大,性能强劲,例如Mac Pro。
- 微型计算机
微型计算机又称为个人计算机,是最普通的一类计算机,可以分为台式机、笔记本电脑、一体机,微型计算机是成本最低的,但是从构造本质来讲,个人计算机与超级计算机、大型机、小型机、工作站没有区别。
平常开发人员通常接触的比较多的是微型计算机,例如笔记本、台式机,而运维人员通常接触的是服务器。
1.3 计算机的体系结构
1.3.1 冯诺依曼体系
冯诺依曼体系就是将程序指令和数据一起存储的计算机设计概念结构。
早期的计算机仅能运行固定用途的程序,如果想要运行别的程序,必须要更改计算机结构、重新设计电路。而冯洛伊曼是把程序存储起来,并设计通用的电路。存储程序指令,设计通用电路。
冯诺依曼体系由以下部分组成
- 必须有存储器,存储运行的程序和数据,长期记忆程序、数据、中间结果和最终结果的运算能力
- 必须要有控制器,控制程序的流程以及数据的流转
- 必须要有运算器,负责完成数据的算数、逻辑运算
- 必须要有输入设备,负责完成程序指令和数据的输入
- 必须要要输出设备,负责完成程序的处理结果输出
现代计算机都是属于冯诺依曼机。
CPU是由运算去和控制器组成,而冯诺依曼结构是将存储器和CPU分开,会导致冯诺依曼瓶颈:CPU和存储器速率之间的问题无法调和,CPU经常空转等待数据的传输,这样无法充分利用CPU。
1.3.2 现代计算机的结构
现代计算机结构由冯诺依曼结构基础之上进行修改,主要是解决CPU和存储器速度差异的问题:存储器、运算器和控制器集中在一块芯片上。
现代计算机结构
现代计算机结构以存储器为核心的结构。而CPU是由运算器、控制器和存储器(寄存器)组成
1.4 计算机的层次与编程语言
1.4.1 程序编译和程序解释
由于高级编程语言和计算机底层语言是互不相通的,计算机最底层只能识别01010这种二进制的机器指令,因此需要使用工具进行语言之间的转换。这个就是程序编译或者解释的由来。
为了理解程序编译和程序解释,这里引入两种语言,分别是高级计算机语言L1,以及低级计算机语言L0。
- 程序编译
开发人员使用高级编程语言L1编写的应用程序通过编译器生成成计算机底层能够识别的低级语言L0,L0就是计算机实际执行的语言,而编译器生成的计算机底层识别的二进制机器指令过程就是程序编译。常见的编译型语言有C/C++/Objective-C/Go
- 程序解释
首先使用L0语言实现另外一个程序,也就是解释器,然后将开发人员使用高级语言L1编写的应用程序作为输入,每一句L1编写的程序都会在L0中作为等价的转换然后执行,解释的过程就是由L0编写的解释器去解释L1程序。常见的解释型语言有PHP,Python,JavaScript。
而Java和C#属于编译+解释型语言,以Java为例子,Java程序在运行之前首先被编译成Java字节码,然后在JVM虚拟机上解释运行。
1.4.2 计算机程序和编程语言
计算机的层次由上到下可以分为如下几个层次:
- 应用层
- 高级语言层
高级语言就是用来开发日常应用的计算机语言,常见的高级语言有C/C++/Java/Python/Go等等。
- 汇编语言层
汇编语言也是一种编程语言,汇编语言可以编译成直接执行的机器语言,而完成编译的过程就是汇编器,从汇编语言开始使用的语言就是人类比较容易理解的语言。
- 操作系统层
操作系统主要是用于给应用软件提供运行平台,同时管理和调度硬件资源。位于软件和硬件的适配层。
- 传统机器层
编程语言主要是CPU指令集(机器指令),而开发人员使用机器指令编写的程序可以交由微程序直接进行解析,指令集存储在CPU内部,对CPU的运算进行指导和优化应用程序。CPU可以通过指令集运行程序以及进行相应的逻辑处理。
传统机器层的编程语言和硬件直接相关,但是由于不同架构的CPU使用的是不同的CPU指令集,也就是英特尔的CPU上运行的程序不能在AMD的CPU上运行。
- 微程序机器层
编程语言主要是微指令集,微指令所组成的微程序直接交由硬件执行。主要由硬件厂商的开发人员编写。一条机器指令对应一个微程序,一个微程序对应一组微指令,微程序=机器指令。
- 硬件逻辑层
硬件逻辑层主要有门电路、触发器等逻辑电路组成,所属电子工程领域。
传统机器层、微程序机器层和硬件逻辑层属于实际机器层,和物理设备相关。
操作系统层、汇编语言层、高级语言层和应用层称为虚拟机器。而操作系统层、汇编语言层、高级语言层统称为系统软件,应用层主要是完成日常任务的各种程序,例如Office,微信等等。
1.5 计算机的计算单位
1.5.1 容量单位
在购买电脑时,通常会选择高配置的内存、硬盘。例如最新款(2019)15寸的macBookPro已经可以选配32G内存和4T的固态硬盘,而这里的32G和4T就是常用的容量单位。
在物理层面,我们使用高低电平来记录信息,通常使用高电平表示1,低电平表示0,因此在计算机底层只能认识0,1两种状态。而0,1能够表示的内容太少了,迫切需要更大的容量表示方法,因此诞生了字节(Byte),千字节(KB),兆字节(MB),吉字节(GB),太字节(TB),拍字节(PB),艾字节(EB),它们之间的换算关系如下所示
1EB=1024PB
1PB=1024TB
1TB=1024GB
1GB=1024MB
1MB=1024KB
1KB=1024B
1Byte=8bit
位(bit)是最小的计算机容量单位,通常用于门电路。
而字节(Byte)表示网络传输,文件大小,是最基本的容量单位。
兆字节(MB)表示网速的容量单位
吉字节(GB)通常用于表示计算机内存、磁盘的容量单位
太字节(TB),拍字节(PB)通常是用于表示云硬盘的容量单位
艾字节(EB)通常是用于表示数据中心的容量单位
现在通常笔记本的内存通常是8G,16G,32G,64G等等,而运行在笔记本之上的操作系统普遍都是64位的,因为32位系统只能使用4G内存,下面是4G的内存换算
4G=2^2 * 2^10 * 2^10 * 2^10 =4*1024*1024*1024=2^32
在购买内存或者买移动硬盘时,通常使用的存储单位就是GB或者是TB,
但是在买4T的移动硬盘时,实际的可用容量却只有3T多,因为计算机的存储单位是以2的10次方(即1024)换算,而硬盘厂商们是以1000为换算单位。
4T的硬盘换算成位如下所示
4T=4*1024GB*1024MB*1024KB*1024B*8bit
而硬盘厂商的实际容量
4T=1000*1000*1000*1000*8
因此实际的可用容量是
4*1000*1000*1000*1000/1024/1024/1024/1024≈3.63T
而在一些互联网巨头(例如国内的BAT,国外的亚马逊、苹果、微软、谷歌,脸书)公司中,可能使用到比TB更大的海量数据,也就是PB或者EB,它们的换算单位如下所示。
1PB=1024TB
1EB=1024PB
1.5.2 速度单位
1.5.2.1 网络速度
网络常用的单位是Mbps
而网络带宽提供商(例如长城宽带)声称的百兆带宽实际上是100Mbit/s,但是100M光纤测试的峰值速度只会有12MB/s,它们之间的换算是100Mbit/s=(100/8)MB/s=12.5MB/s。
1.5.2.2 CPU速度
CPU的速度一般是由CPU的时钟频率所体现的,而时钟频率的单位是赫兹(HZ),目前主流的CPU时钟频率一般都在2GHz以上,而赫兹(Hz)其实就是秒分之一,也就是每秒钟的周期性变动重复次数的计量。
2GHz=21000^3Hz=2100010001000=20亿,也就是说2GHz的CPU每秒可以变化20亿次。
1.6 计算机的字符与编码集
1.6.1 字符集编码
在计算机底层(内存、硬盘)都是使用01001二进制的方式存储数据,而字符编码集是描述了计算机数据(例如字符数据)和底层二进制数据的对应关系,例如在ASC||码中字符a对应的十进制整数是97,字符A对应的十进制整数是65。
1.6.2 字符编码集的历史
1.6.2.1 ASC||码
由于计算机最早是诞生在英美,因此最早的字符集是ASC||,用于表示日常开发中常用的大小写字母以及常用的符号,使用7bits表示,包含95个可打印字符课33各个不可打印字符(包括控制字符),95+33=128,即2的7次方。
1.6.2.2 可扩展的ASC||码
随着计算机的发展以及逐渐普及,ASC||码在很多应用或者国家中的符号无法表示,例如数学符号"≠,≥,≈,π",因此对ASC||进行扩充,由原来的7bit扩充到8bits,因此可以表示256个字符。扩展的运算符增加了数学运算符、带音标的欧洲字符以及其他常用符、表格符等等。
1.6.2.3 Unicode
随着计算机的进一步发展。越来越多的国家开始使用使用计算,而对于欧洲、中亚、拉丁美洲国家的语言多样性,由于语言体系不一样,不以有限字符组合的语言,而中国、韩国、日本的语言最为复杂。
Unicode定义了世界通用的符号集,可以表示世界上所有的国家、所有语言的文字、符号,使用UTF-8,UTF-16,UTF-32实现了编码。
UFT-8:一种变长的编码方案,使用 1~6 个字节来存储;
UFT-32:一种固定长度的编码方案,不管字符编号大小,始终使用 4 个字节来存储;
UTF-16:介于 UTF-8 和 UTF-32 之间,使用 2 个或者 4 个字节来存储,长度既固定又可变。
1.6.2 中文编码集
1980年国内发布了中文编码集 GB2312,一共收录了7445个字符,包含6763个汉字和682个其他符号,但是GB2312不符合国际标准,后来在1995年推出了GBK编码,向下兼容GB2312,向上支持国际ISO标准,GBK收录了21003个汉字,支持全部中日韩汉字。
但是GBK,GB2312都只是本地化的编码集,如果中国人使用GBK或者GB2312开发了一个网站程序,被国外的用户访问了,但是国外的用户不支持GBK或者GB2312,那么看到的网站内容就是乱码。
1.6.2 字符集编码实践
在国内,Windows系统的默认编码是GBK编码,而日常开发中最常使用的是UTF-8字符集。
原文地址:https://www.cnblogs.com/ittimeline/p/11142407.html