计算机自从 20 世纪 40 年代诞生以来,一直以史无前例的进步向前发展,如果说农业革命是第一次革命、工业革命是第二次革命的话,那么第三次革命就是 信息革命
。
计算机技术的进步几乎影响着社会的方方面面,硬件的进步使得程序员可以编写出各种各样优秀的应用软件。也许不久的将来虚拟现实、无人驾驶、无现金支付就会成为现实。
计算机从用途上来讲主要分为三种:
个人计算机(Personal Computer)
,也称为 PC,这是人们最熟知的一种计算机,个人计算机强调用户体验,价格低廉,性价比高,个人计算机虽然出现时间很短,但是却大大推动了计算机历史的进程。服务器(Server)
,服务器通常借助网络访问,用于执行大负载任务,可以处理复杂的应用,服务器相比个人计算机,有着更强的计算、存储和 I/O 能力。发生故障时,服务器比个人计算机恢复代价高。
服务器分为两种,一种用于处理简单小型的 web 服务,没有显示器和键盘。而另外一种是高端服务器,高端服务器通常称为超级计算机,一般由成千上万台处理器组成,内存非常大,同时价格也非常高。
嵌入式计算机(embedded computer)
是数量最多的一类计算机,应用和性能十分广泛,一般应用于汽车、电视中的微处理器,飞机、火车、家用冰箱、洗衣机等,嵌入式计算机系统是由单一应用程序或者一组相关联的应用程序组成,用户通常意识不到自己正在使用计算机。
技术的不断发展也让计算机在不断进步,对整个信息技术工业产生影响,自从个人计算机 PC 出现以来,计算机发展迅速,出现了一种个人移动设备(Personal Mobile Device, PMD)
,PMD 由锂电池供电,通过无线的方式访问网络,价格低廉。PMD 不再像 PC 一样拥有显示器和鼠标,作为替代的是一块触摸屏,甚至支持语音输入,PMD 的出现代表后 PC 时代的到来,而 PMD 将在未来生活中扮演更多角色。
云计算(cloud computing)
替代了传统的服务器,它依赖于一种仓储规模计算机(Warehouse Scale Computer, WSC)
的巨型数据中心,比如 AWS ,Google 这样的顶级科技公司,通过云计算实现 软件即服务(Software as a Service, Saas)
是软件工业的使命。
计算机世界的快速发展,离不开几个关键思想的影响,这些思想深刻影响着计算机设计人员
抽象真是一个牛逼的词汇,提高硬件和软件生产率的主要技术之一就是使用抽象(abstraction)
来表示不同的设计层次,对高层次隐藏内部的实现细节,使其只看到一个大致简化版的模型。
计算机设计者一个永恒的问题就是 摩尔定律(Moore's Law)
驱动的快速变化,它是由英特尔的创始人 摩尔
提出的,它的主要内容是:当价格不变时,集成电路上可容纳的元器件的数目,约每隔 18 - 24 个月便会增加一倍,性能也将提升一倍,这一定律揭示了信息进步的速度。
并行处理是计算机的一大进步,并行指的是计算机系统中能同时执行两个或多个处理的一种计算方法,并行处理的主要目的是提高效率,缩短工作时间,但是会带来更大的复杂性。
在计算机结构设计中,一个特殊的并行场景是使用流水线,流水线也是一种硬件并行的设计。你一定见过大型车间或者制造厂中的流水线工业设计。
加速大概率事件要比优化小概率事件更能提高性能,大概率事件通常比小概率事件简单,大概率事件规则意味着设计者需要知道什么事件是经常发生的。
古人通常讲一句话是 未雨绸缪
,表明要做一件事情需要提前做好准备,才能更好的完成工作。预测也是一种提前做好准备的思想,通过预测的方式提前开始某些操作,会比等到确切知道这些操作启动时要快,通过另一方面提高系统性能。
存储器层次我在之前的文章中多次提到了,这是金字塔的层次设计模型,如下图所示
在存储器层次结构中,速度最快,容量最小的并且价格最昂贵的位于顶层,而速度最慢、容量最大而且价格便宜的位于底层。
计算机不仅要保证工作的速度、还要保证工作的可靠。由于任何一个物理器件都有可能会失效,因此可以通过使用冗余部件的方式提高系统的可靠性(dependable)
,冗余部件可以替代失效部件并且可以帮助其检测错误。
一个应用程序可能由数千万行代码组成,我们知道,计算机中的硬件只能提供最简单的低级指令,从复杂的应用程序到简单的指令需要经过软件的几个层次来逐步解释和翻译。下图展示了软件结构的几个层次
最外层是应用软件,最核心是硬件
,系统软件(systems software)
位于两者之间。
系统软件:通常提供服务性质的软件,包括操作系统、编译程序等。
操作系统和编译程序是对于所有计算机来说都是必须的,这两个系统软件是非常重要的,操作系统是计算机硬件和软件之间的接口;为用户提供各种调用和协调服务,操作系统主要的功能如下
而编译程序是完成另一项重要功能的程序:它把高级语言例如 C、Java、C++ 编写的程序翻译成为机器指令,这个翻译过程是非常复杂的。
在计算机世界中,它能识别的只有两个信号:0 和 1,所以我们认为计算机只能识别二进制数。每个字母就代表计算机中的二进制位(binary digit)
或者 一位(bit)
。八个二进制位成为一个字节(byte)
,字节是最小的寻址单元,一连串的二进制位构成了计算机术语中的 指令(instruction)
,即 01010101110110 等等。。。。。。
第一代程序员是直接使用二进制数与计算机通信的,这是一项非常乏味的工作,所以为了改善这种枯燥无聊的编写方式,程序员很快发明了助记符
,最初助记符是通过手工翻译成为二进制的,这种转换过程过于浮躁无聊和繁琐,为了改善这种情况,程序员发明了一种 汇编程序(assembler)
的软件,可以将助记符自动转换为对应的二进制。比如我们使用助记符 add A,B
,这段代码就会自动的被二进制 0101011011
。该指令告诉计算机将使用 A 和 B 进行相加操作。这种助记符使用的语言就是汇编语言(assembly language)
。而机器可以理解的二进制语言称为 机器语言(machine language)
。
然而,随着时代的发展,汇编语言也慢慢面的枯燥乏味,所以出现了像是 C、Java 这样的高级语言,也就是我们开发所使用的语言,高级语言的出现,大大提高了编程效率,但是,万变不离其宗,高级语言也要经过
这一个转换过程。高级编程语言和编译程序大大提高了软件的生产率。
使用高级语言有以下几个好处:
其一,可以让程序员使用更自然的语言来思考
其二,高级语言提高了程序员的生产率,加速程序的开发过程
其三,采用高级语言编写程序提高了程序对于计算机的独立性
看到这里你可能会有疑问,为什么要学硬件呢?换个角度来讲,凭什么培训三个月出来的程序员能够和科班学习四年的程序员一起竞争找工作?想过这个问题没有?
那是因为,培训机构不会为你的长远考虑,短期找到工作能够交差即可。把一个程序员的素养等价为找到工作即可,这本来就是这个行业的污点所在,CRUD 程序员不需要专业的程序素养,完成工作即可。为什么程序总有填不完的坑,不考虑程序健壮性、可拓展性、设计模式,写代码只为了自己,而不是以工程化的标准来要求自己就是培训班和科班的素养和差距。这也是我为什么最近在研究计算机基础的原因,因为我不够有素质
。
为什么学硬件?就是能够让你从计算机的角度思考问题。好了不多说了,说多了该被培训班 diss 了。
任何一台计算机的基础硬件都需要完成最基本的功能:输入数据、输出数据、处理数据、存储数据。我们讨论的主题就是描述这些功能是怎样完成的。
下面我们就要探讨一下这些硬件
显示器是一个非常吸引人的输出设备,大多数个人移动设备都用 液晶显示(Liquid Crystal Display, LCD)
来获得轻巧、低功耗的显示效果。LCD 能够控制光的传输。今天,大多数 LCD 显示器都采用 动态矩阵显示(active matrix display)
技术,其每个像素(pixel)
都由一个晶体管精确的控制电流,从而使图像更加清晰。在彩色动态矩阵 LCD 中,还有一个 红 - 绿 - 蓝屏决定三种颜色分量的强度,每个点需要三个晶体管开关。
图像由像素矩阵组成,可以表示成二进制位的矩阵,称为 位图(bit map)
。不同分辨率所能够支持的矩阵大小不同,彩色显示器使用 8 位来表示每个三原色(红、绿和蓝),每个像素用 24 位表示,可以显示百万种不同的颜色。
计算机硬件使用光栅刷新缓冲区(又称为帧缓冲区)来保存位图以支持图像。
图中的 X0 Y0 ,X1 Y1 都表示像素
后 PC 时代,移动设备的高速发展,使触摸屏成为一种趋势,触摸屏有两种实现
电阻式触摸屏(Resistive touchscreens)
:电阻式触摸屏基于施加到屏幕上的压力来工作。 电阻屏由许多层组成。 当按下屏幕时,外部的后面板将被推到下一层,下一层会感觉到施加了压力并记录了输入。 电阻式触摸屏用途广泛,可以用手指,指甲,手写笔或任何其他物体进行操作。
电容式触摸屏(capacitive touchscreen)
:电容式触摸屏通过感应物体(通常是指尖上的皮肤)的导电特性来工作。 手机或智能手机上的电容屏通常具有玻璃表面,并且不依赖压力。 当涉及到手势(如滑动和捏合)时,它比电阻式屏幕更具响应性。 电容式触摸屏只能用手指触摸,而不能用普通的手写笔,手套或大多数其他物体来响应。
下面是一个 ipad2
的剖面图
这里面包括集成电路,也称为芯片(chip)
、CPU、前置摄像头、后置摄像头、麦克风、耳机插孔、扬声器、加速计、陀螺仪、Wi-Fi 网络和蓝牙网络等。
为了进一步理解硬件,下面展示了一款苹果 A5 微处理器的实现细节,处理器从逻辑上包括两个主要部件:数据通路和控制器
数据通路主要用来执行算数运算
控制器主要负责指导数据通路、存储器和 I/O 设备按照正确的指令进行执行
除此之外,上述剖面图还包括 GPIO
,通用型之输入输出的简称。
DDR SDRM 接口是内存条接口,通过提供多个隔行扫描的内存访问,从而提高内存带宽
内存是程序运行的存储空间,它同时用于保存程序运行时所使用的数据,内存由 DRAM 芯片组成。DRAM(Dynamic random access memory)
是动态随机访问存储器的缩写。在处理器内部使用的是另外一种存储器 - 缓存(cache memory)
,这是一种小而快的存储器,一般作为 DRAM 的缓冲。cache 使用的是 静态访问存储器(Static Random Access Memory, SRAM)
,它的速度要比 DRAM 更快,价格也更加昂贵。
我们上面探讨了影响计算机的几大设计思想,其中非常重要的一个思想就是 抽象
,计算机硬件和软件的接口就是一种抽象,这种抽象又被叫做 指令集体系结构(instruction set architecture)
,或者简称为 体系结构(architecture)
。提供给应用程序员基本指令集和操作系统接口称为 应用二进制接口(Application Binary Interface)
。
这种抽象的好处是让程序员能够单独的实现应用程序,而不用考虑其内部的硬件,内部硬件和系统应用程序只提供对用户的服务。对程序员隐藏内部实现细节。
上面我们已经基本介绍到了输入、输出、控制器、存储器,但是对于计算机,还有一项非常重要的功能我们没有介绍 - 计算机网络
,通过计算机联网,可以实现与其他计算机通信,任何计算机都不能成为信息的 孤岛
,计算机通信能为我们带来下面这些好处
随着传输速度以及通信传输的距离,通信代价也在随之增长,网络的传输是多种多样的,最常见的就是 以太网
,以太网是一种连接局域网的传统技术,它能够使设备通过协议(一组规则或通用网络语言)相互通信,以太网的接入设备可以相互识别对方,以太网中的一个例子就是 局域网(Local Area Network, LAN)
,局域网通过交换机进行组网。还有一种距离更远的网络是 广域网
,广域网可支持万维网(World Wide Web)
。
随着计算机的不断发展,通信速度和性能也在不断提升。
处理器和存储器在高速发展,计算机最初使用的是晶体管,然后后面慢慢出现了集成电路、超大规模集成电路。下表展示了这个演变过程
时间 | 计算机构造 |
---|---|
1951 | 真空管 |
1965 | 晶体管 |
1975 | 集成电路 |
1995 | 超大规模集成电路 |
2013 | 更大规模集成电路 |
晶体管(transistor)
是一种固体半导体器件,具有多种功能。晶体管作为一种可变电流开关,能够基于输入电压控制输出电流。集成电路(IC)
由成千上万的晶体管组成。后面不断的发展为更多晶体管组成的 超大规模集成电路(VLSL)
。
计算机的性能是很难评判的,我们将从以下几个方便来展开探讨
个人计算机用户比较感兴趣的就是 响应时间(response time)
,响应时间就是指一个任务从开始到完成所需要的时间,又称为执行时间。而数据中心感兴趣的常常是 吞吐率(throughput)
。
执行时间(execution time)
,是计算机完成某项任务所需要的总时间,包括硬盘访问、内存访问、I/O 活动、操作系统开销和 CPU 的执行时间等。带宽(bandwidth)
,性能的另一种度量参数,表示单位时间内完成的任务数量。如果使用时间来度量计算机,那么完成同样的任务,需要时间最少的计算机是最快的。程序的执行时间一般以秒
为单位。我们可以使用 CPU 执行时间
来表示在 CPU 上花费的时间,而不包括其他 I/O 或应用程序的时间。CPU 时间可以进一步分为用于用户程序的时间和操作系统为用户服务花去的 CPU 时间,前者称为 CPU 时间,后者称为系统 CPU 时间。
为了一致性,我们使用 CPU 性能表示用户 CPU 时间,用系统性能表示系统空运行的响应时间。
几乎所有的计算机都会使用时钟来驱动硬件中的各种事件。时钟间隔的时间称为 时钟周期(clock cycle)
。也可以用它的倒数来描述,称为 时钟频率(clock rate)
。
我们一般使用下面的公式来表示 CPU 的性能
CPU 执行程序的时间 = 程序 CPU 时钟周期数 * 时钟周期时间
由于时钟频率和时钟周期互为倒数的关系,所以也可以用
CPU 执行程序的时间 = 程序 CPU 时钟周期数 / 时钟频率
有了公式后,我们可以对各个指标进行描述,在时钟周期时间内,程序 CPU 时钟周期数越低,CPU 性能越高。在周期数相同的情况下,时钟频率越高,CPU 性能越高。
CPU 最终是要执行指令的,一个考虑指令执行时间的方法是:执行时间等于执行的指令 * 每条指令的平均时间。所以,一个程序需要的时钟周期数为
CPU 时钟周期数 = 程序指令数 * 每条指令的平均执行周期
我们一般使用 CPI(clock cycle per instruction)
表示执行每条指令所需的时钟周期的平均值。不同指令执行的周期可能不同,所以 CPI 表示的是一个平均值。
所以我们可以使用 CPU 时间 = 指令数 * CPI * 时钟周期时间
或者 CPU 时间 = 指令数 * CPI / 时钟频率
本篇文章我们主要介绍了 计算应用分类、计算机发展的八大思想、计算机结构层次、基本硬件入门,还有计算机通信、处理器发展、性能的定义。