Java架构师成长之道之浅谈计算机系统架构
Java架构师成长之旅1.1 信息技术发展趋势
目前信息技术主要经历了互联网、移动互联网以及以大数据、云计算、人工智能和区块链为代表的新兴技术三个阶段。而5G网络的到来则会加速物联网、无人驾驶的应用场景落地。
互联网
互联网从20世纪90年代逐渐兴起,主要是连接了世界各地的笔记本、台式机以及背后提供后台数据服务的服务器集群,其中绝大多数笔记本、台式机运行着Windows,macOS系统,而服务器主要是以类Unix(CentOS,Ubuntu)占据主要市场。依靠互联网崛起的硬件公司有Intel,软件公司有微软、谷歌、亚马逊、阿里巴巴、腾讯、百度等等。移动互联网
移动互联网自从由智能手机的普及以及谷歌的Android系统和苹果的IOS系统发展而使得移动互联网将世界各地的移动设备(手机、电视、汽车等等)连接起来。依靠移动互联网崛起的硬件公司有小米,三星,华为,苹果,软件公司有美团、滴滴、字节跳动和蚂蚁金服等等。云计算、大数据
随着用户规模的爆发式增长,以海量数据为基础的大数据(Hadoop,Spark,Flink)、云计算(OpenStack)技术在大型互联网公司(BAT)拥有广泛的落地场景。人工智能
人工智能作为目前炙手可热的技术之一,国内的BAT纷纷开始布局在各自的业务场景中,阿里巴巴最早将人工智能应用在电商和物流领域,百度开发出了对话式人工智能操作系统和自动驾驶平台Apollo,腾讯则将人工智能应用在游戏领域,目前国内著名的人工智能公司有商汤科技,旷视科技。区块链
区块链经历了数字货币、智能合约和超级账本三个阶段,区块链技术可以广泛使用在金融、供应链、物流以及公共服务领域,解决互联网的信任问题,目前国内的蚂蚁金服、京东有大量的区块链应用落地。物联网
随着5G技术的成熟,世界各地的智能设备都将会通过5G网络连接起来,形成万物互联的时代,到时候就可以实现通过终端控制物联网的世界。
1.2 计算机系统
计算机系统主要由硬件系统和软件系统所组成,通过软硬件一体化的协作,完成人们生活和工作中所需的各种日常任务,例如听歌、看电影、购物、聊天等等。
1.2.1 计算机硬件系统
现代计算机是基于冯.诺依曼体系结构,主要由运算器、控制器、存储器、输入设备和输出设备五大部分组成,它们各司其职完成了数据的存储、计算以及传输的任务。
1.2.1.1 常用组件及其功能
计算机硬件的核心组件包含了CPU,内存、磁盘和IO设备。
CPU:
冯诺依曼的计算机体系结构中的运算器和控制器组成了CPU,主要功能负责数据的计算以及其他设备的控制,程序运行时CPU负责从内存中读取程序的指令和数据执行后将结果返回给内存或者是写入磁盘。
内存
冯诺依曼体系结构中的存储器就是指的内存和外存,其中内存是程序运行时的工作区,即程序运行时的指令和数据都会被加载到内存中,断电后内存的数据容易丢失,内存是编址存储的,通常32位操作系统只能寻址4G,而64位操作系统则会操过4G,通常按照计算机不同的用途是16G-128G之间。
磁盘
磁盘是冯诺依曼体系结构中存储器的一种,负责永久性存储大容量的数据(TB甚至是PB级别),按照不同的用途可以分为机械硬盘和固态硬盘两大类。
IO设备
顾名思义就是负责计算机数据的输入输出,常用的输入设备有鼠标、键盘,常用的输出设备有声卡、显卡。
网卡也是IO设备的一种,主要是负责数据在网络中的传输。
在后期程序排查异常时除了考虑程序本身的问题,还要考虑硬件问题,例如网络不通、磁盘存储空间以及内存运行空间不足等等。
1.2.1.2 计算机各组件IO性能汇总
每个计算机组件的IO性能也各不相同,核心组件(CPU,内存,磁盘)都遵循容量越大,IO性能越差,如下图所示,汇总了它们的IO性能,在后期程序优化时,通常需要考虑时间和空间的问题。
计算机各组件IO性能汇总
1.2.1.3 开发者必备硬件配置
开发者在购买笔记本或者台式机时,通常需要关注CPU,内存、磁盘以及显卡的相关配置。
和普通用户不同,由于开发时需要安装许许多多相关的应用程序和配置各个集成开发环境,因此推荐购买高配置的电脑,如果你想购买MacBookPro,可以参考如下配置。
macOS
如果你想购买运行Windows的笔记本,参考如下配置。
如果是想要成为软件开发人员,电脑最低配置不要低于8代 CPU i7 + 内存 16G+ 固态硬盘 256G
1.2.2 计算机软件系统
计算机软件就是运行在硬件之上的各种应用程序。软件的出现改善了人和计算机的交互方式,软是由开发者编写的一系列计算机指令和不同业务逻辑产生的数据所组成。
1.2.2.1 计算机软件系统分类
软件按照不同的用途分类可以分为系统软件和应用软件。
系统软件:系统软件有Unix,Linux,macOS,Windows,Android,IOS,编译器、数据库等等。
应用软件:应用软件有淘宝、京东、微信、支付宝等等。
1.2.2.2 计算机软件的交互方式
不同平台的软件有不同的交互方式:
服务器端:运维开发人员基于命令行的字符界面实现人机交互。
PC桌面端:开发人员、普通用户通常是基于图形化界面实现人机交互。
移动端:用户通常是通过语音,手势触控实现人机交互。
1.2.2.3 Windows系统常用命令
主流的操作系统(Windows,Linux(Ubuntu),MacOS)及大多数应用程序都提供了基于命令行和图形化界面两种交互方式,而移动端是采用手势触控、语音等进行交互。作为普通用户来讲,图形化界面容易上手,而且交互效果更加直观。
但是作为一个程序员来讲,应该去熟悉各个操作系统的命令行的使用,因为命令行相对图形化界面而言,绝大多数场景下使用更加高效。而且图形化界面本质是对命令行的封装,能用图形化界面实现的基本都可以采用命令行实现。而且在服务器端(CentOS,RedHat)基本上是不会安装图形界面。
Windows系统可以按下windows键然后输入cmd,如下图所示
windows键搜索cmd
回车之后,便可以进入Windows下的命令行终端,如下图所示
dos命令窗口
Windows下常用的文件目录和系统应用相关的命令如下所示,只要开启了终端就可以在终端内通过使用文件目录相关和系统应用相关的命令实现快捷操作。
文件目录相关
系统应用相关
1.2.2.4 常用应用的软硬件协作实现
聊天:应用程序监听键盘输入的数据,放到内存,然后传给网卡,通过网络传递给另外一个网卡,再从网卡传到内存,显示在显示器上。
听音乐:应用程序将音乐数据加载到内存之后,然后写到声卡上。
看视频:应用程序将视频数据加载到内存,然后写到显卡上。
读文档: 应用程序将磁盘中的文档数据加载到内存后显示到屏幕上。
写文档: 应用程序将内存中的数据写入到磁盘上。
1.2.3 操作系统
操作系统(Operating System)是实现通用目的的程序,其内核(Kernel)负责和底层硬件交互,应用软件运行在操作系统之上。因此操作系统起着承上启下的作用,操作系统提供的功能如下
硬件驱动进程管理内存管理网络管理安全管理文件管理
操作系统分类:
桌面:Windows10,macOS10.14,Ubuntu18.04
服务器:CentOS7.6, RHEL,Ubuntu Server
移动设备:Android,IOS
ABI(Application Binary Interface)描述了应用程序与OS之间的底层接口,允许编译好的目标代码在使用兼容ABI的系统中无需改动就能运行
API(Application Programming Interface)定义了源代码和库之间的接口,因此同样的源代码可以在支持这个API的任何系统中编译
开发人员在编写应用程序时,通常都是借助API接口实现通用目的的功能,而应用程序编译后,通过ABI接口编译链接后运行。
1.2.4 开发者必备软件
1.2.4.1 社交篇
微信/企业微信QQ钉钉阿里旺旺1.2.4.2 常用应用篇
百度网盘迅雷下载WPS Office有道词典网易邮箱大师QQ音乐1.2.4.3 开发篇
JDKVisual Studio QTXCodeVisual Studio CodeIntelliJ IDEA/Pycharm/Goland/WebStormGit/Github /GitlabMavenNavicat/DataGripChrome/FirefoxSecureCRTXmind Zen亿图图示PowerDesigner印象笔记/剪藏Typora/小书匠VMWare WorkStation/Parallels Desktop1.2.4.4 macOS特供篇
Dash 帮助文档iTerm 终端IINA 视频播放Screen Flow 录屏Parallels Desktop 虚拟机iStat Menus 系统资源监控Fantanstical 日历CleanMyMac X1.3 编程语言发展史及其应用场景
1.3.1 编程语言发展史
任何事物都是从无到有,逐步发展壮大起来的,编程语言也是一样。
计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言三个阶段,其特点是使得程序员用编程语言开发、测试、部署应用程序越来越方便、高效。但是是以牺牲效率为代价,但是随着计算机硬件的发展,绝大多数应用场景的效率损失可以忽略不计。
机器语言
计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。
汇编语言
随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。
高级程序设计语言
高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心计算机底层硬件差异而只需要专注于业务模块实现即可。甚至是可以实现 一次编译,到处运行,这里以Java为例子:通过实现不同平台的JVM,编译生成的字节码文件可以在任意的JVM上运行。
高级语言通常都需要编译器或者是解释器将源码编译或者解释后执行。
高级语言主要分为面向过程和面向对象两种,其中典型的面向过程语言就是C,面向对象的编程语言有Java,C++,Python等等。
1.3.2 编程语言应用场景
如果想知道目前主流的编程语言有哪些,可以访问tiobe 首页获取编程语言排行榜,如下图所示,从Tiobe官网获取最新(6月)的编程语言排行榜的前20名,
根据Tiobe排行榜得知,Java/C/Python 分别排在前三名, 随后紧跟着C++,,C#,JavaScript,PHP等等,每种语言都有不同的应用场景和擅长的领域,如下表格所示。
1.4 程序及其运行机制
1.4.1 程序和指令
程序:程序是为了完成某项特定任务(例如聊天,听音乐等等)而使用某种编程语言编写的一组指令序列
指令:令是对计算机进行程序控制的最小单位,由操作码和操作数组成,操作码指的是机器要执行什么操作(例如加减乘除),而操作数就是具体执行的对象(具体的数据以及存放数据的位置),所有指令的集合称为计算机的指令系统,常见的电脑指令系统有Intel X86指令集,常见的手机指令系统有ARM。因此手机上的应用程序不加修改是不能在电脑上直接运行,因为不同的指令集是不兼容的。
1.4.2 程序的运行机制
无论哪种编程语言编写的程序,最终都会转换成二进制的机器码后在内存中执行。
目前主流的编程语言按照运行机制可以分为编译型和解释型两种。
编译型使用编译器将源程序一次性编译成特定平台(Windows,Linux,macOS)二进制格式机器码,并链接生成特定平台的可执行程序格式(例如Windows通常是.exe),可以脱离开发环境独立运行。其特点就是运行效率高,但是不能移植。典型的编译型语言有C/C++/Swift等等
解释型是使用解释器对源程序进行解释成特定平台的机器码并立即执行,解释型语言编写的程序通常不能脱离开发环境独立运行,可以理解成每次运行时都需要再次编译;因此解释型的语言相对于编译型的语言而言运行效率低,但是可以移植。典型的解释型语言有Python/Ruby等等。
1.5 计算机数据存储
1.5.1 常用计算机存储单位及其换算
在计算机最底层,数据都是以二进制(01010)的补码方式存储,而计算机中最小的存储单位是位(bit),用来表示0或者1。
计算机中最基本的存储单位是字节(Byte),1个字节对应8个位(Bit)。
而日常应用中常使用的基本存储单位包括KB,MB,GB,TB。它们之间都是以1024换算的,如下所示
1TB=1024GB1GB=1024MB1MB=1024KB1KB=1024B1B=8bit
1.5.2 计算机内存存储
现在通常笔记本的内存通常是8G,16G,32G,64G等等,而运行在笔记本之上的操作系统普遍都是64位的,因为32位系统只能使用4G内存,下面是4G的内存换算
4G=2^2 * 2^10 * 2^10 * 2^10 =4*1024*1024*1024=2^32
因为4G只能够寻址到2^32,使用16进制表示就是0xFFFFFFFF,这里可以借助Visual Studio的调试功能查看内存的寻址,如下图所示
1.5.3 计算机网速换算
使用迅雷下载某些资源时的网速就是KB或者MB,而网络运营提供商(例如长城宽带、移)声称的百兆带宽实际上是100Mb(bit),但是网络下载速度是以字节(KB)为单位的,因此真实的网速(下载速度)理论上只有100Mb/8=12.5MB
1.5.4 计算机磁盘容量换算
在购买内存或者买移动硬盘时,通常使用的存储单位就是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