浅谈计算机系统架构
读完本章节,你将收获以下几点
- 计算机硬件架构及其主要硬件的功能描述
- 推荐给全栈开发者的硬件
- 计算机软件架构及其常用软件
计算机硬件系统
现代计算机是由运算器、控制器、存储器、输入设备、输出设备五大部分组成,它们各司其职,完成了数据的计算、存储、传输任务,整体架构如下图所示
下面是它们各个组件的功能介绍:
CPU:也被称为中央处理器,由运算器和控制器组成,其主要作用是用来计算数据(从内存中获取指令并执行后将结果返回给内存或者写入到磁盘)和控制其他设备(声卡显卡,鼠标键盘)协同工作。目前主流的CPU架构有基于Intel的复杂指令集的X86架构(32位和64位)和手机(ARM指令集),服务器(SPARC指令集)的精简指令集。CPU通过总线(数据总线、地址总线、控制总线)和外部进行交互,数据的计算是在CPU内部的寄存器完成的。
内存:采用编址存储,其主要作用是用来作为程序的工作区,程序运行时会被加载到内存,断电后数据会丢失。32位操作系统只能最多使用4G内存(编址的数量2的32次方,已经逐渐被淘汰),64位CPU通常可以使用4G以上的内存(编址可达4G*4G,但是受限于其他组件),单台服务器的内存根据不同的用途通常是16-128G。
硬盘:其主要作用是永久性存储海量(TB或者PB级别)的数据,分为机械式硬盘(HDD)(7500rpm,15000rpm)和固态硬盘(SSD)两大类,门户网站通常是两种硬盘混合使用。
IO设备:其主要作用是用来数据的输入输出,常见的输入设备包括鼠标键盘,常见的输出设备包含声卡,显卡,打印机等等。还有个典型输入输出设备:网卡主要是负责数据在网络上的传输。
在程序故障诊断或者做程序性能优化是时除了考虑程序自身之外还需要考虑CPU,内存,磁盘和网卡的”健康状况“。
计算机硬件的IO各层次性能汇总
组件名称 | 延时、带宽 |
---|---|
CPU | |
Cache L1,L2,L3 | 0.5-15ns、20-60GB/S |
内存 | 30-100ns、2-12GB/S |
SSD硬盘 | 10us-1ms、50MB-2GB/S |
普通硬盘 | 5-20ms、50-200MB/S |
网卡-网卡 | 100us-1ms、10MB-10GB/S |
从该表格中可以看出CPU延时(最低)和带宽(最高),而普通硬盘是性能最差的,根据木桶效应,在性能优化时应该优先优化磁盘。
推荐给全栈开发者(前端+后端(服务端)+大数据/云计算)的硬件配置
目前(2018/01)为止能买到的最好的硬件配置的笔记本
Windows/Linux(Ubuntu):Razer/雷蛇 灵刃专业版 RZ09-0166 GTX1080 Pro游戏笔记本电脑
主要硬件配置如下:
硬件名称 | 规格 |
---|---|
屏幕 | 17.3英寸16:9 4K屏幕 |
CPU | 第七代Intel i7-7820HK 3.9GHz |
内存 | 32GB DDR4-2667MHz |
硬盘 | 512GSSD/1TSSD |
显卡 | NVIDA GeForce GTX1080显卡 8G显存 |
推荐先安装Windows10 x64企业版,然后通过安装的VMWareWorkStation14 Pro虚拟机上安装Linux/CentOS7.3、Linux/OpenSUSE42.2和Linux/Ubuntu16.04三个常见的Linux发行版。
而如果要从事MacOS、IOS和WatchOS的应用开发,首选当然是MacBook Pro,主要硬件配置如下(内容来自于苹果官网):
硬件名称 | 规格 |
---|---|
屏幕 | 15.4英寸 |
CPU | 第七代Intel i7 Turbo Boost 最高可达 4.1GHz |
内存 | 16GB 2133MHz LPDDR3内存 |
硬盘 | 512GB SSD/1T SSD |
显卡 | 显卡Radeon Pro 560 图形处理器,配备 4GB |
MacBookPro则是安装了最新的MacOS10.13,由于缺少极少数必备软件(例如RedisDesktopManager,WPS),可以通过Mac平台上的虚拟机Parallels Desktop 13 安装了Windows10以及一些Mac平台上缺失的软件。
计算机软件系统
软件的出现实现了人和计算机之间更好的交互,软件是由一系列按照特定顺序组织的指令和数据组成。
计算机软件分为系统软件和应用软件两大类,如下列表中包含常见的软件及其运行平台。从交互方式上看经历了字符(命令)交互,图形界面交互和语音手势、重力感应交互的发展过程。
- 系统软件
人机交互方式 | 系统名称 | 平台 |
---|---|---|
命令行界面 | Unix(Solaris,HP Unix,AIX),Linux(CentOS) | 服务器 |
图形界面 | Windows10,MacOS10.13,Linux(Ubuntu17.10) | 桌面 |
自然交互界面(语音、手势) | Android8.0,IOS11 | 嵌入式(手机、汽车、电视) |
* 应用软件
类型 | 名称 | 平台 |
---|---|---|
通讯 | 微信、QQ、钉钉 | Windows,MacOS,Android,IOS |
购物 | 淘宝、天猫 | Android,IOS |
办公 | WPS,Office | Windows,Mac |
支付 | 微信支付、支付宝 | Android,IOS |
外卖 | 美团外卖、饿了么 | Android,IOS |
邮件 | Gmail、网易邮箱 | PC,Android,IOS |
系统软件主要实现和底层硬件交互,给应用软件提供运行平台。操作系统、编译器等都是属于系统软件,目前主流的桌面操作系统是Windows10,Linux(Ubuntu17),MacOS10.13,主流的移动端操作系统是Android8,IOS11,主流的服务端操作系统是Linux(CentOS7.4,Ubuntu17.10),Unix(HP Unix,Solaris,AIX)。
应用软件主要是运行在PC或者是移动终端的操作系统之上,用于解决工作和生活的各种需求,例如购物(淘宝、天猫、),聊天(微信、QQ),听音乐(QQ音乐、网易云音乐),看电影(爱奇艺、腾讯视频,优酷),收发邮件(网易邮箱,Gmail)和支付(支付宝,微信支付)等等。
而应用软分为BS(Broswer/Server)和CS(Client/Server)两种架构。
其中用于BS架构的Browser端应用开发的语言有JavaScript,Server端应用开发有Java,Python,Go,PHP。
而用于CS架构的Client端(Android,IOS,PC端)的开发语言有Java,Objective-C/Swift/C++,Server端的开发语言有Java。* *
MacOS日常开发中常用的软件列表
软件名称 | 功能描述 |
---|---|
Chrome、Firefox、Safari | 浏览器:Web开发必备 |
Tower、GitHub Desktop | Git版本管理、GitHub桌面客户端 |
XCode | MacOS/IOS/WatchOS开发必备 |
SecureCRT | Linux SSH Client |
Postman | Web API 测试 |
AndroidStudio | Android APP开发必备 |
IntelliJ IDEA | Java开发必备 |
Pycharm | Python开发必备 |
WebStorm | 前端开发必备 |
PHPStorm | PHP开发必备 |
GoLand | Go程序开发必备 |
DataGrip、Navicat Permium | Oracle/MySQL客户端 |
EdrawMax | 画图 |
StartUML | 建模 |
PDF Expert | PDF书籍查看 |
微信、钉钉、QQ | 即时通讯必备 |
有道云笔记、印象笔记 | 笔记 |
简书、GitBook、Mweb | 写作 |
TeamViewer | 远程连接 |
ParallelsDesktop | 虚拟机(Mac运行Windows) |
CleanMyMac | 系统管理 |
WireShark、Charles | 网络抓包 |
VPN Plus | 免费VPN |
Axure RP8 | 原型 |
百度网盘 | 资源云端存储 |
Dash | 帮助文档查看器 |
编程语言发展史以及应用场景
读完本章节,你将收获以下几点
- 计算机编程语言的发展史
- 主流编程语言的应用场景
- 信息技术发展方向
编程语言的发展史
计算机程序设计语言经历了机器语言到汇编语言和高级程序设计语言的演进,其特点是让程序越来越容易开发、测试和部署,在了解编程语言发展史以及使用场景前需要了解程序到底是什么?
程序是指为了完成一项特定的任务(例如听音乐,看电影,购物)而用某种编程语言(C,C++,Java)编写的指令序列,指令是计算机进行程序控制的最小单位,由操作码(例如+ -)和操作数(例如010101)组成,所有指令的集合称为计算机的指令系统,常见的指令集包括运行于PC、服务器上基于Intel处理器的X86指令集和运行于手机的ARM指令集。不同的指令集系统是不兼容的,这也就导致PC上的程序不加修改,不能到手机上运行,反之亦然。
机器语言
计算机发展的最早期,程序员编写程序采用二进制的指令(010010101)来实现的,而每种CPU都有各自不同的指令系统(SPARC/Intel X86/ARM),因此在不同的机器上使用不同的机器语言实现。其特点是性能特别高效,而面向机器编程也就意味着不能移植,需要手动处理底层硬件的差异性,而且二进制的指令难以理解和维护。汇编语言
随着时代和计算机技术的发展,汇编语言和编译器的出现解决了机器语言需要记住非常多的二进制机器指令的难题,但是还是没有从根本上解决移植性的问题,只是将机器指令转换为易懂的英文单词,然后由编译器编译成机器指令,因为计算机终归揭底只能识别0001110100110机器指令,而且汇编语言是面向机器的,不同机器(SPARC/Intel X86/ARM)的汇编指令是不相同的。
而机器语言和汇编语言的使用场景只有在追求绝对性能的场合(例如控制导弹的发射等等)中使用。
如下所示案例演示C语言嵌套汇编语言的案例
#include <stdio.h>
/*
C语言嵌套汇编的应用案例
* @author tony ittimeline@163.com
* @date 2017/10/17 16:40
* @website www.ittimeline.net
*/
void use_asm() {
int a, b, c = 0; //初始化声明三个整数变量并赋值为0
a = 4;
b = 6;
printf("before a=%d\tb=%d\tc=%d\n", a, b, c);
_asm {
//将变量a的值赋值给eax寄存器
mov eax, a;
//将变量b的值和寄存器eax相加
add eax, b;
//将相加的结果赋值给c
mov c, eax;
}
printf("after a=%d\tb=%d\tc=%d\n", a, b, c);
}
/*主程序的入口
* @author tony ittimeline@163.com
* @date 2017/10/17 16:38
* @website www.ittimeline.net
*/
int main() {
use_asm();
getchar();
}
高级程序设计语言
高级程序设计语言的高级之处体现在开发人员在编写程序时无需关心硬件差异只需要专注于业务模块实现即可。甚至是可以实现 一次编译,到处运行(**Java通过实现不同平台的JVM,编译生成的字节码文件可以在任意的JVM上运行)。高级语言通常都需要编译器或者是解释器将源码编译或者解释执行。高级语言主要分为面向过程和面向对象两种,其中典型的面向过程语言就是C,面向对象的编程语言有Java,C++等等。**
先看下目前(2018年1月)世界上主流语言的排行榜的前20位,数据来源于tiboe
目前C语言排行第二, 同时C/C++的市场份额是超过Java的。
主流编程语言的应用场景介绍
目前主流的语言主要有Java/C/C++/C#,Pyhton,PHP,JavaScript,Swift,Objective-C,Go语言,它们拥有各种不同的使用场景。
编程语言主要是用来编写软件,而开发软件的类型主要分为系统软件和应用软件,系统软件主要有Windows,Linux(Ubuntu,CentOS,OpenSUSE),MacOS,Android,IOS,通常使用的系统软件开发语言为少量的汇编以及大量的C语言。
目前在典型的中小型互联网公司的应用软件的后台业务逻辑通常都是采用Java或者Python,C/C++/Go实现。前台展示通常包含PC,H5,Android,IOS和微信公众号、微信小程序。
信息技术发展方向
目前国内一线城市(北上广深)中的一线互联网企业主要有阿里巴巴、腾讯、百度、平安、滴滴、新美大等等,他们所涉及的领域包括电商、社交、游戏、人工智能、金融、出行、团购外卖等等。
而这些领域在技术上的实现通常会涵盖移动端、前端和服务端
移动端主要以Android,IOS为主,而开发Android App必须熟练掌握Java/Kotlin技术栈,开发IOS必须掌握Objective-C/Swift技术栈。
前端主要以HTML5+CSS3+JavaScript/ECMAScrip为基础的bootstrap,jQuery,AngularJS,VueJS,ReactJS,NodeJS,Webpack等框架的技术栈。
服务端主要以Linux(CentOS\Ubuntu)为主,如果想做服务端底层开发,必须熟练掌握C/C++技术栈,如果想做服务端应用层开发必须掌握Java/Python/Go技术栈。
游戏主要是Cocos2d-x和Unity3d,主要开发语言是C++和C#。
前言的方向是人工智能(Python)以及区块链(Go),物联网
大数据以及云计算因为是以海量数据为基础的,只有在巨头(Google,Amazon,Facebook,Apple,Microsoft,Alibaba,Tencent,Baidu)公司才会有用武之地
任何事物都是从无到有,可能逐渐发展壮大,也可能转瞬即逝
Java的起源
Java最初是20世纪90年代初期由SUN(Stanford University Network)公司的詹姆斯高斯林(Games Gosling)领导开发的Green项目,该项目最初的目的是为消费类电子产品(微波炉、机顶盒、电视机、电话等等)写一个通用的控制系统。
而90年代末期赶上欧美互联网爆发式的增长,得益于互联网环境的差异性(不同的操作系统,不同的硬件),Java语言开始逐渐流行起来,而且由于开源得到众多公司的支持,其开发平台也逐渐变得强大起来。
Java语言的特点
跨平台:通过在不同的平台(Windows,Linux,MacOS)采用C/C++语言实现不同的JVM(Java Virtual Machine),使得源文件经过编译生成的字节码文件可以运行在在任意平台之上(实际上是运行在JVM之上),通常企业中都是在Windows上开发Java应用程序,然后不做任何修改直接可以部署到Linux(CentOS,Ubuntu)上运行。
简单易用:Java是基于C++语言改编而来,作为一门纯粹的面向对象的编程语言,继承了C++的各种优点,也剔除了C++中难以理解的指针、虚基类、运算符重载等概念,同时有垃圾回收器(Java9默认是G1)来管理对象,不需要程序员手动释放内存。
安全可靠:目前Java由于安全可靠的特性已经被广大的电商、P2P、金融、证券、保险、银行等公司根据自身的业务来构建分布式应用。
开源:通过读取Java设计人员编写的源代码可以提高自身的编程功底,同时Java自从JDK1.4以后为了简化企业级开发,许多开源组织开发了例如MyBatis、Hibernate、Spring Framework,SpringBoot,SpringCloud等开源框架。
Java语言的应用场景
正是由于其跨平台、安全稳定等特性,Java在企业级和移动端应用开发占据广阔的市场。
企业级:银行(中国工商银行、中国建设银行、招商银行)、证券、电信(中国移动、中国联通)、互联网金融(平安、宜信)、电商(淘宝、京东、唯品会)、生活服务(美团点评、饿了么)
移动端:Android App
如果想知道哪些公司在招聘Java工程师,可以去访问拉勾网 或者是猎聘网,然后直接搜索Java即可。
JDK的发展史
JDK全称是Java Development Kit,用来开发和运行Java程序的工具集,自从Java语言在1995年第一次发布后,为了开发功能强大的应用,Sun公司陆续发布了JDK1.0-1.6,而2009年Oracle以74亿美金收购Sun公司,获得两项资产:Java和Solaris。
如下表格所示,列举了JDK的版本及其对应的年份以及主要的特性
版本 | 年份 | 主要特性 |
---|---|---|
JDK1.0 | 1996年 | 运行和开发环境的工具集 |
JDK1.1 | 1997年 | JIT(即使编译)编译器 |
JDK1.2 | 1998年 | 将Java分成三个版本,J2SE,J2ME,J2EE,同时发布JSP,Servlet,EJB规范 |
JDK1.4 | 2002年 | 著名的开源框架struts,spring,hibernate,应用服务器WebLogic,WebSphere诞生 |
JDK1.5 | 2004年 | 改名:J2SE,J2ME,J2EE变为JavaSE,JavaME,JavaEE,同时增加了注解、泛型、可变参数,自动拆装箱等功能 |
JDK1.6 | 2006年 | |
JDK1.7 | 2011年 | 支持二进制整数,数值之间可以使用下划线,支持字符串的switch语句,try with resources语句 |
JDK1.8 | 2014年 | lambda表达式,流式编程 |
JDK1.9 | 2017年 | jshell,模块化系统,G1垃圾回收器 |
Java的三大版本介绍
Java分为三个版本,分别是JavaSE(Java Standard Edition),JavaEE(Java Enterprise Edition)和JavaME(Java Micro Edition),下面是不同版本的应用场景。
JavaSE主要是用于开发桌面应用,例如IntelliJ IDEA,Eclipse,Xmind等等。
JavaME主要用于开发嵌入式设备的应用
JavaEE主要是用于开发企业级应用,例如电商、证券、银行、互联网金融、物流等等都是基于JavaEE技术栈构建的
而JavaSE是Java技术体系的基础内容,那些流行的开源框架(SpringFramework,SpringBoot,SpringCloud,Dubbo,MyBatis,Hibernate)和Web容器(Tomcat,Jetty)都是基于JavaSE基础之上构建的。
JDK的下载安装和配置
JDK的介绍
如果想开发Java程序,必须先去Oracle官网下载和安装JDK,在这之前,先了解下什么是JDK?
JDK(Java Develpoment Kit)是Oracle公司(2009年SUN公司被其收购)推出的开发和**运行**Java程序的工具集,其整体架构(基于JDK8.0)如下图所示。
JDK包含了开发和运行Java程序所需要的编译(javac)和运行(java)环境,但是并没有提供类似于VisualStudio2017那样强大的集成开发环境。
而JRE包含了运行Java程序所需要的运行环境,从上面的架构图看出主要包含了JVM和核心类库、发布工具等等。
这里说明下Java能跨平台的本质原因
当我们去Oracle官网下载JDK时,会让我们选不同操作系统(MacOS,Linux,Windows,Solaris)版本的JDK下载,如下图所示:
通过不同平台的JDK实现屏蔽了底层操作系统和硬件的差异性, 从而实现源码一次编译,到处运行。
JDK9的文档地址:https://docs.oracle.com/javase/9/index.html
JDK的下载
针对各自电脑的操作系统,去Oracle官方下载对应的JDK即可,目前最新的JDK版本为今年(2017/09/21)发布的JDK9。
下载地址为:http://www.oracle.com/technetwork/java/javase/downloads/jdk9-downloads-3848520.html
macOS直接复制http://download.oracle.com/otn-pub/java/jdk/9+181/jdk-9.0.1_osx-x64_bin.dmg该地址即可下载
MacOS10.13下JDK9的安装
在下载完成之后,可以根据JDK9图形化界面引导完成安装,默认的安装路径是/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/,
然后配置环境变量JAVA_HOME和PATH即可,命令如下所示
然后配置环境变量JAVA_HOME和PATH即可,命令如下所示
MacBookPro:~ tony$ su root #切换到root用户
sh-3.2# vim /etc/profile #编辑配置文件
然后按键盘i键,进入编辑模式,在profile文件中增加如下配置
export JAVA_HOME=/Library/Java/JavaVirtualMachines/jdk-9.0.1.jdk/Contents/Home
export PATH=$PATH:$JAVA_HOME/bin
JAVA_HOME环境变量是Maven/Gradle或者Tomcat等Java应用所需要的
然后按esc和:wq 保存并退出vim编辑器,接着 source /etc/profile 也就是让修改后的profile配置文件立即生效
MacBookPro:~ tony$ source /etc/profile
接下来就可以使用Java的javac和java命令来验证JDK是否安装成功了,如下所示
MacBookPro:jdk-9.0.1.jdk tony$ javac -version
javac 9.0.1
MacBookPro:jdk-9.0.1.jdk tony$ java -version
java version "9.0.1"
Java(TM) SE Runtime Environment (build 9.0.1+11)
Java HotSpot(TM) 64-Bit Server VM (build 9.0.1+11, mixed mode)
MacBookPro:jdk-9.0.1.jdk tony$
如果能够正确运行java和javac命令并且能够查看到对应的编译和运行的版本信息,证明JDK已经安装成功。
在公司开发Java项目时,提前询问运维的同事当前项目使用的JDK版本(例如JDK-8u144),然后在开发环境安装相同的JDK版本(JDK-8u144)来开发项目,这样能够屏蔽JDK的差异性,避免开发环境和生产环境因为JDK的版本问题引发程序的Bug。
Java企业级开发环境搭建
在公司开发企业级Java项目时需要用到哪些工具呢?
操作系统
目前主流的桌面系统包含Windows,MacOS,推荐使用MacBook Pro15.4 +MacOS10.13来作为Java开发的操作系统(它的好处后面会慢慢体会到),当然目前国内主流的Java开发的桌面系统是Windows。
集成开发环境
由于JDK虽然提供了开发和运行Java程序的工具集,但是没有提供一个类似于VisualStudio那样功能强大的集成开发环境,当然目前市场上也有像Eclipse的Java IDE,很多Java程序员都应该在项目开发中使用过。这里我推荐一个更加优秀的开发工具IntelliJ IDEA。
IntelliJ IDEA是来自捷克的Jetbrains公司开发的Java开发工具(完爆Eclipse/MyEclipse)。有旗舰版和社区版两大版本,相对社区版而言旗舰版的功能更加丰富。官网提供了两个版本之间差异的详细比较。擅长企业级应用、移动应用以及Web应用开发。
支持MacOS10.7+,Windows7+,Linux(Ubuntu14+)三大主流操系统,支持主流技术(Maven,Gradle,Git,Tomcat…)和框架(Spring,SpringBoot,SpringCloud…),同时支持Scala,Groovy等其他基于JVM的编程语言。
通过插件可以支持Python、Kotlin,PHP等编程语言以及数据库访问等等,还有日常开发中常用的GitHhub,MarkDown等等诸多你想要的好用的工具。
想了解更多信息,可以参考官网信息:http://www.jetbrains.com/idea/
IntelliJ IDEA 下载安装
IntelliJ IDEA提供了主流操作系统(MacOS,Windows,Linux(Ubuntu))的下载,拥有收费的旗舰版和免费的社区版,目前(2017/12/14)最新的版本为2017.3.1版本。
macOS版的下载地址为https://download.jetbrains.8686c.com/idea/ideaIU-2017.3.1.dmg
而IntelliJ IDEA在MacOS下的安装过程也非常简单,只需要把下载完成的IntelliJ IDEA.app拖放到应用程序文件夹即可。
IntelliJ IDEA基本配置
安装完IntelliJ IDEA后,可以根据自身的硬件配置调整IntelliJ IDEA的VM Options通过菜单Help->Edit Custom VM Options,该文件可以调整IntelliJ IDEA的VM配置,若是16G以上的内存可以参考如下配置:
-Xms512m
-Xmx4096m
-XX:ReservedCodeCacheSize=480m
-XX:+UseCompressedOops
-Dfile.encoding=UTF-8
-XX:+UseConcMarkSweepGC
-XX:SoftRefLRUPolicyMSPerMB=100
-ea
-Dsun.io.useCanonCaches=false
-Djava.net.preferIPv4Stack=true
-XX:+HeapDumpOnOutOfMemoryError
-XX:-OmitStackTraceInFastThrow
-Xverify:none
-XX:ErrorFile=$USER_HOME/java_error_in_idea_%p.log
-XX:HeapDumpPath=$USER_HOME/java_error_in_idea.hprof
-Xbootclasspath/a:../lib/boot.jar
IntelliJ IDEA插件安装
在做项目开发之前,需要提前安装几款必备的插件,包括.gitignore,git flow integration,Alibaba Java Coding Guidelines,Key Promoter X,CheckStyle-IDEA,Lombok Plugin
IntelliJ IDEA插件的安装支持在线和离线两种方式安装,在线安装就是通过从IntelliJ IDEA自带的插件仓库搜索需要的插件安装即可,不过安装后需要重启后才能生效。
详细过程如下所示