Java架构师成长之道之计算机组成原理概述篇
1.1 信息技术发展趋势
目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、人工智能和区块链为代表的新兴技术三个阶段。而5G网络的到来则会加速物联网、无人驾驶的应用场景落地。
- 互联网
凡是能彼此之间通信的设备组成的网络就叫互联网,互联网从20世纪90年代逐渐兴起,主要是连接了世界各地的笔记本、台式机以及背后提供后台数据服务的服务器集群,其中绝大多数笔记本、台式机运行着Windows,macOS系统,而服务器主要是以类Unix(CentOS,Ubuntu)占据主要市场。依靠互联网崛起的硬件公司有Intel,软件公司有微软、谷歌、亚马逊、阿里巴巴、腾讯、百度等等。 - 移动互联网
移动互联网自从2010年由智能手机的普及以及谷歌的Android系统和苹果的IOS系统发展而使得移动互联网将世界各地的移动设备(手机、电视、汽车等等)连接起来。依靠移动互联网崛起的硬件公司有小米,三星,华为,苹果,软件公司有美团、滴滴、字节跳动和蚂蚁金服等等。 - 云计算、大数据
随着用户规模的爆发式增长,以海量数据为基础的大数据(Hadoop,Spark,Flink)、云计算(OpenStack)技术在大型互联网公司(BAT)拥有广泛的落地场景。 - 人工智能
人工智能作为目前炙手可热的技术之一,国内的BAT纷纷开始布局在各自的业务场景中,阿里巴巴最早将人工智能应用在电商和物流领域,百度开发出了对话式人工智能操作系统和自动驾驶平台Apollo,腾讯则将人工智能应用在游戏领域,目前国内著名的人工智能公司有商汤科技,旷视科技。 - 区块链
区块链经历了数字货币、智能合约和超级账本三个阶段,区块链技术可以广泛使用在金融、供应链、物流以及公共服务领域,解决互联网的信任问题,目前国内的蚂蚁金服、京东有大量的区块链应用落地。 - 物联网
随着5G技术的成熟,世界各地的智能设备都将会通过5G网络连接起来,形成万物互联的时代,到时候就可以实现通过终端控制物联网的世界。
1.2 计算机的发展简史
1.2.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.2.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 .3计算机的分类
计算机可以按照不同的用途分为超级计算机,大型机,小型机,个人计算机。
-
超级计算机
超级计算机是功能最强,运算速度最快,存储容量最大的计算机,主要用于国家高科技领域尖端技术研究,我们使用每秒一万亿浮点数计算(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,内存、磁盘和IO设备。
-
CPU:
现代计算机结构的运算器和控制器、存储器组成了CPU,主要功能负责数据的计算以及其他设备的控制,程序运行时CPU负责从内存中读取程序的指令和数据执行后将结果返回给内存或者是写入磁盘。 -
内存
冯诺依曼体系结构中的存储器就是指的内存和外存,其中内存是程序运行时的工作区,即程序运行时的指令和数据都会被加载到内存中,断电后内存的数据容易丢失,内存是编址存储的,通常32位操作系统只能寻址4G,而64位操作系统则会操过4G,通常按照计算机不同的用途是16G-128G之间。 -
磁盘
磁盘是冯诺依曼体系结构中存储器的一种,负责永久性存储大容量的数据(TB甚至是PB级别),按照不同的用途可以分为机械硬盘和固态硬盘两大类。 -
IO设备
顾名思义就是负责计算机数据的输入输出,常用的输入设备有鼠标、键盘,常用的输出设备有声卡、显卡。
网卡也是IO设备的一种,主要是负责数据在网络中的传输。
在后期程序排查异常时除了考虑程序本身的问题,还要考虑硬件问题,例如网络不通、磁盘存储空间以及内存运行空间不足等等。
1.3.3 计算机各组件IO性能汇总
每个计算机组件的IO性能也各不相同,核心组件(CPU,内存,磁盘)都遵循容量越大,IO性能越差,如下图所示,汇总了它们的IO性能,在后期程序优化时,通常需要考虑时间和空间的问题。

1.3.4 开发者必备硬件配置
开发者在购买笔记本或者台式机时,通常需要关注CPU,内存、磁盘以及显卡的相关配置。
和普通用户不同,由于开发时需要安装许许多多相关的应用程序和配置各个集成开发环境,因此推荐购买高配置的电脑,如果你想购买MacBookPro,可以参考如下配置。
组件名称 | 配置 |
---|---|
CPU | i9 2.3HZ |
内存 | 32G |
磁盘 | 512SSD |
显卡 | Radeon pro Vega 20 |

如果你想购买运行Windows的笔记本,参考如下配置。
如果是想要成为软件开发人员,电脑最低配置不要低于Intel i7 CPU + 内存 16G+ 固态硬盘 256G,出色的硬件能够提高开发效率
1.4 计算机软件系统
1.4.1 计算机软件系统概述
计算机软件就是运行在硬件之上的各种应用程序。软件的出现改善了人和计算机的交互方式,软是由开发者编写的一系列计算机指令和不同业务逻辑产生的数据所组成。
软件按照不同的用途分类可以分为系统软件和应用软件。
系统软件:系统软件有Unix,Linux,macOS,Windows,Android,IOS,编译器、数据库等等。
应用软件:应用软件有淘宝、京东、微信、支付宝等等。
不同平台的软件有不同的交互方式:
服务器端:运维开发人员基于命令行的字符界面实现人机交互。
PC桌面端:开发人员、普通用户通常是基于图形化界面实现人机交互。
移动端:用户通常是通过语音,手势触控实现人机交互。
1.4.2 Windows系统常用命令
主流的操作系统(Windows,Linux(Ubuntu),MacOS)及大多数应用程序都提供了基于命令行和图形化界面两种交互方式,而移动端是采用手势触控、语音等进行交互。作为普通用户来讲,图形化界面容易上手,而且交互效果更加直观。
但是作为一个程序员来讲,应该去熟悉各个操作系统的命令行的使用,因为命令行相对图形化界面而言,绝大多数场景下使用更加高效。而且图形化界面本质是对命令行的封装,能用图形化界面实现的基本都可以采用命令行实现。而且在服务器端(CentOS,RedHat)基本上是不会安装图形界面。
Windows系统可以按下windows键然后输入cmd,如下图所示

回车之后,便可以进入Windows下的命令行终端,如下图所示

Windows下常用的文件目录和系统应用相关的命令如下所示,只要开启了终端就可以在终端内通过使用文件目录相关和系统应用相关的命令实现快捷操作。
文件目录相关
命令名称 | 功能描述 |
---|---|
dir | 列出当前目录列表 |
cd | 切换目录(只能在根盘符(例如C盘)内切换) |
md | 创建目录 |
rd | 删除空目录 |
echo | 输出提示信息 例如echo %PATH%查看环境变量 |
del | 删除文件 |
type | 显示文本文件内容 |
cls | 清除屏幕内容 |
exit | 退出终端 |
系统应用相关
命令名称 | 功能描述 |
---|---|
notepad | 记事本 |
calc | 计算器 |
mspaint | 画图 |
explore | 文件资源管理器 |
timedate.cpl | 日期和时间 |
cleanmgr | 磁盘清理 |
desk.cpl | 分辨率设置 |
powercfg.cpl | 电源设置 |
regedit | 注册表编辑器 |
msconfig | 系统配置 |
mstsc | 远程连接 |
firewall.cpl | 防火墙 |
appwiz.cpl | 添加或修改程序 |
tasklist | 查看进程列表 |
taskkill /f /im process.exe | 关闭指定进程 |
msinfo | 系统信息 |
sticky notes | 便签 |
ipconfig | 查看ip |
winver | 查看windows版本 |
dxdiag | DirectX诊断工具 |
1.4.3 常用应用的软硬件协作实现
聊天:应用程序监听键盘输入的数据,放到内存,然后传给网卡,通过网络传递给另外一个网卡,再从网卡传到内存,显示在显示器上。
听音乐:应用程序将音乐数据加载到内存之后,然后写到声卡上。
看视频:应用程序将视频数据加载到内存,然后写到显卡上。
读文档: 应用程序将磁盘中的文档数据加载到内存后显示到屏幕上。
写文档: 应用程序将内存中的数据写入到磁盘上。
1.4.4 开发者常用软件
如下列表展示了日常使用的开发工具和应用程序
- 即时通讯
- 微信/企业微信
- 钉钉
- 阿里旺旺
- 常用应用篇
- 百度网盘
- 迅雷下载
- WPS/Office
- 有道词典
- 网易邮箱大师
- QQ音乐/网易云音乐
- 开发篇
- JDK
- Visual Studio
- QT
- XCode
- Visual Studio Code
- IntelliJ IDEA/Pycharm/Goland/WebStorm
- Git/Github /Gitlab
- Maven/Gradle
- Navicat/DataGrip
- Chrome/Firefox/Safari
- SecureCRT
- Xmind Zen
- 亿图图示
- PowerDesigner
- 印象笔记/剪藏
- Typora/小书匠
- 葫芦加速器
- macOS特供篇
- Dash 帮助文档
- iTerm 终端
- IINA 视频播放
- Screen Flow 录屏
- Parallels Desktop 虚拟机
- iStat Menus 系统资源监控
- Fantanstical 日历
- CleanMyMac X
1.4.5 操作系统
操作系统(Operating System)是实现通用目的的程序,其内核(Kernel)负责和底层硬件交互,应用软件运行在操作系统之上。因此操作系统起着承上启下的作用,操作系统提供的功能如下
- 硬件驱动
- 进程管理
- 内存管理
- 网络管理
- 安全管理
- 文件管理
目前(2019/7/15)主流的操作系统包含运行在桌面端的Windows10,macOS10.14,Ubuntu18.04以及移动设备的Android 9, IOS12和服务器端的CentOS7.6,Ubuntu Server。
ABI(Application Binary Interface)描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行,ABI涉及了程序的各个方面,比如:目标文件格式、数据类型、数据对齐、函数调用约定以及函数如何传递参数、如何返回值、系统调用号、如何实现系统调用等。
API(Application Programming Interface)定义了源代码和库之间的接口,因此同样的源代码可以在支持这个API的任何系统中编译。
开发人员在编写应用程序时,通常都是借助API接口实现通用目的的功能,而应用程序编译后,通过ABI接口链接生成可执行的程序格式后运行。
1.5 计算机的层次与编程语言
1.5.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.5.2 计算机程序和编程语言
计算机的层次由上到下可以分为如下几个层次:
-
应用层
-
高级语言层
高级语言就是用来开发日常应用的计算机语言,常见的高级语言有C/C++/Java/Python/Go等等。 -
汇编语言层
汇编语言也是一种编程语言,汇编语言可以编译成直接执行的机器语言,而完成编译的过程就是汇编器,从汇编语言开始使用的语言就是人类比较容易理解的语言。 -
操作系统层
操作系统主要是用于给应用软件提供运行平台,同时管理和调度硬件资源。位于软件和硬件的适配层。 -
传统机器层
编程语言主要是CPU指令集(机器指令),而开发人员使用机器指令编写的程序可以交由微程序直接进行解析,指令集存储在CPU内部,对CPU的运算进行指导和优化应用程序。CPU可以通过指令集运行程序以及进行相应的逻辑处理。
传统机器层的编程语言和硬件直接相关,但是由于不同架构的CPU使用的是不同的CPU指令集,也就是英特尔的CPU上运行的程序不能在AMD的CPU上运行。 -
微程序机器层
编程语言主要是微指令集,微指令所组成的微程序直接交由硬件执行。主要由硬件厂商的开发人员编写。一条机器指令对应一个微程序,一个微程序对应一组微指令,微程序=机器指令。 -
硬件逻辑层
硬件逻辑层主要有门电路、触发器等逻辑电路组成,所属电子工程领域。
传统机器层、微程序机器层和硬件逻辑层属于实际机器层,和物理设备相关。
操作系统层、汇编语言层、高级语言层和应用层称为虚拟机器。而操作系统层、汇编语言层、高级语言层统称为系统软件,应用层主要是完成日常任务的各种程序,例如Office,微信等等。
1.5.3 编程语言发展史
任何事物都是从无到有,逐步发展壮大起来的,编程语言也是一样。
计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段,其特点是使得程序员用编程语言开发、测试、部署应用程序越来越方便、高效。但是是以牺牲效率为代价,但是随着计算机硬件的发展,绝大多数应用场景的效率损失可以忽略不计。
-
机器语言
计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。 -
汇编语言
随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。 -
高级程序设计语言
高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心计算机底层硬件差异而只需要专注于业务模块实现即可。甚至是可以实现 一次编译,到处运行,这里以Java为例子:通过实现不同平台的JVM,编译生成的字节码文件可以在任意的JVM上运行。
高级语言通常都需要编译器或者是解释器将源码编译或者解释后执行。
高级语言主要分为面向过程和面向对象两种,其中典型的面向过程语言就是C,面向对象的编程语言有Java,C++,Python等等。
1.5.4 编程语言应用场景
如果想知道目前主流的编程语言有哪些,可以访问tiobe 首页获取编程语言排行榜,如下图所示,从Tiobe官网获取最新(2019年6月)的编程语言排行榜的前20名,
根据Tiobe排行榜得知,Java/C/Python 分别排在前三名, 随后紧跟着C++,VB.NET,C#,JavaScript,PHP等等,每种语言都有不同的应用场景和擅长的领域,如下表格所示。
编程语言 | 应用场景 |
---|---|
C | 硬件驱动、操作系统、系统软件 |
C++ | 系统软件、网络通讯、科学计算、游戏 |
C# | Windows应用,Web应用、游戏 |
Java | 大型互联网应用(淘宝、天猫),Android,大数据 |
Python | 人工智能、机器学习、自动化运维、数据分析 、图形处理 |
PHP | 中小型网站开发 |
Objective-C/Swift | macOS,iPhone,iPad应用开发 |
JavaScript | 浏览器端、服务端、PC桌面 |
Go | 高并发、区块链 |
1.6 计算机的计算单位
1.6.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.6.2 速度单位
- 网络速度
网络常用的单位是Mbps
而网络带宽提供商(例如长城宽带)声称的百兆带宽实际上是100Mbit/s,但是100M光纤测试的峰值速度只会有12MB/s,它们之间的换算是100Mbit/s=(100/8)MB/s=12.5MB/s。
- CPU速度
CPU的速度一般是由CPU的时钟频率所体现的,而时钟频率的单位是赫兹(HZ),目前主流的CPU时钟频率一般都在2GHz以上,而赫兹(Hz)其实就是秒分之一,也就是每秒钟的周期性变动重复次数的计量。
2GHz=21000^3Hz=2100010001000=20亿,也就是说2GHz的CPU每秒可以变化20亿次。
1.7 计算机的字符与编码集
1.7.1 字符集编码
在计算机底层(内存、硬盘)都是使用01001二进制的方式存储数据,而字符编码集是描述了计算机数据(例如字符数据)和底层二进制数据的对应关系,例如在ASC||码中字符a对应的十进制整数是97,字符A对应的十进制整数是65。
1.7.2 字符编码集的历史
-
ASC||码
由于计算机最早是诞生在英美,因此最早的字符集是ASC||,用于表示日常开发中常用的大小写字母以及常用的符号,使用7bits表示,包含95个可打印字符课33各个不可打印字符(包括控制字符),95+33=128,即2的7次方。 -
可扩展的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.7.3 中文编码集
1980年国内发布了中文编码集 GB2312,一共收录了7445个字符,包含6763个汉字和682个其他符号,但是GB2312不符合国际标准,后来在1995年推出了GBK编码,向下兼容GB2312,向上支持国际ISO标准,GBK收录了21003个汉字,支持全部中日韩汉字。
但是GBK,GB2312都只是本地化的编码集,如果中国人使用GBK或者GB2312开发了一个网站程序,被国外的用户访问了,但是国外的用户不支持GBK或者GB2312,那么看到的网站内容就是乱码。
在国内,Windows系统的默认编码是GBK编码,而日常开发中最常使用的是UTF-8字符集。