浅谈计算机系统架构
计算机硬件系统
现代计算机是由运算器、控制器、存储器、输入设备、输出设备五大部分组成,它们各司其职,完成了数据的计算、存储、传输任务,整体架构如下图所示
下面是它们各个组件的功能介绍:
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=%dtb=%dtc=%dn", a, b, c);
_asm {
//将变量a的值赋值给eax寄存器
mov eax, a;
//将变量b的值和寄存器eax相加
add eax, b;
//将相加的结果赋值给c
mov c, eax;
}
printf("after a=%dtb=%dtc=%dn", 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(CentOSUbuntu)为主,如果想做服务端底层开发,必须熟练掌握C/C++技术栈,如果想做服务端应用层开发必须掌握Java/Python/Go技术栈。
游戏主要是Cocos2d-x和Unity3d,主要开发语言是C++和C#。
前言的方向是人工智能(Python)以及区块链(Go),物联网
大数据以及云计算因为是以海量数据为基础的,只有在巨头(Google,Amazon,Facebook,Apple,Microsoft,Alibaba,Tencent,Baidu)公司才会有用武之地
C语言概览
起源
1972年,贝尔实验室的Dennis Ritch和Ken Thompson在开发Unix操作系统时设计了C语言,该操作系统的90%以上的代码都是由C语言实现,后期的Linux,MacOS,Android,IOS都是基于Unix发展而来的。
特点
C语言作为面向过程的高级程序设计语言,能够轻松的实现自顶向下的规划、结构化编程和模块化设计,这样使得程序结构更加简洁,可扩展性强以及更加容易维护。
而且C语言有着高效、功能强大(嵌套汇编)以及可移植性(标准库可移植)等优点,而且也存在着对系统平台库依赖严重