如果你想对计算机的组成和系统结构有个系统的了解,推荐你看一本书,叫做《深入理解计算机系统》。这本书也是计算机界的经典书籍,如果能吃透这本书里的内容,你会对计算机系统和软件开发有一个全新的认识。
由于这本书不太容易学习,有很多程序员买了这本书,但可能读了一两个章节发现太过枯燥理解不了,便放下珍藏了。
我和你一样,每次拿起这本书都刻意让自己学下去,但都败下阵来。
后来在知乎发现有人指导如何阅读这本书时,有网友推荐了国人写的教材,与《深入理解计算机系统》内容非常类似,但更易读。
这本书的作者叫袁春风,她是南京大学计算机系的教授,写过2本书《计算机组成与系统结构》(2010年出版)、《计算机系统基础》(2014年出版),两者内容差不多,第二本更像是第一本的升级版。
在阅读这2本书时,发现还是比较容易理解的,这个系列整理出了相关知识点,加深记忆以备忘。
计算机的功能和特性
我们现在使用计算机能做的事情非常多,能够看网页、听音乐、看视频、社交聊天,这背后其实都是对信息的处理。
计算机背后是如何工作的呢?我们先来看计算机的一个简单定义:
计算机是一种能自动化对数字信息进行运算和逻辑处理的高速处理装置,计算机处理的对象都是数字化信息。
计算机的基本功能包括以下3个方面:
- 数据处理:计算机最基本的功能,可以计算加减乘除等运算,也可以处理文字、数字、音乐、视频信息。
- 数据存储:计算机能够自动工作的最基本保证,数据和程序事先被存储好,在需要时被取出自动执行。
- 数据传送:计算机内部各功能部件之间的数据传输,以达到信息交换,计算机外部连接使得信息得以传输到另一台计算机,从而构建出了计算机网络。
有了这些基本功能,计算机中肯定需要有对数据处理、数据存储、数据传送相对应的功能部件,它们分别是:算术逻辑运算器、存储器、总线和IO接口。
计算机主要的核心部件都采用高速电子元器件制造,处理速度极快,这就为运算速度提供了基础保证。
计算机可以处理各种信息,应用也极其广泛,只要现实世界中某个问题能找到相应的算法,就能编写成程序通过计算机执行算出结果,这为计算机的准确性和智能化提供了重要的基础。
计算机发展史
接下来我们看计算机是如何发展起来的,其中都经历了哪些阶段,每个阶段都有什么特点?
诞生
在二战期间,美国急于需要一种高速电子装置来解决弹道的复杂计算问题,当时美国宾夕法尼亚大学的一位物理学博士也常常为物理学研究中的大量枯燥数学计算头疼,也渴望电子计算机帮忙。
接着他们在冯·诺依曼等人的帮助下,在1946年研发出世界上第一台电子计算机ENIAC。
ENIAC是一个庞然大物,占地面积就达170平方米,重30吨,第一次开机甚至整个费城地区的照明灯都开始闪烁。
ENIAC的出现使得军方计算射程弹道的计算时间由原来的20分钟一下子缩短到30秒,ENIAC名声大振。
第一台电子计算机的诞生,人类社会进入一个崭新的电子计算和信息化时代!
第一代计算机
世界第一台计算机ENIAC的逻辑元件采用电子管,并且没有采用二进制运算和存储程序控制,在这段期间也产生出了类似于ENIAC的计算机,它们的特点都是体积大、速度慢(每秒千次或万次)、存储容量小。
1945年,冯·诺依曼领导的小组提出了「存储程序」方式的电子计算机方案EDVAC,这种思想宣告了现代计算计结构思想的诞生。
存储程序方式的基本思想是:事先将编写好的程序和原始数据送入主存后才能执行程序,一旦程序开始执行,计算机不需要人员干预就能自动完成逐条指令的取出和执行任务。
这类计算机被称为IAS计算机,它包括5大基本部件:
- 算术逻辑单元
- 程序控制器
- 存储器
- 输入设备
- 输出设备
ISA计算机结构如下图:
整个计算机以「存储器」为中心,程序和数据首先输入到运算器,然后保存到主存中。程序运行时,从主存调出指令,在程序控制器和运算器中执行,执行的中间结果送入主存保存,最终结果送到输出设备,并且整个计算机内部采用二进制形式表示指令和数据。
IAS计算机直到1951年才研发完成,在此期间(20世纪40年代到50年代末)研发的计算机都属于第一代计算机。
第二代计算机
在1947年,美国贝尔实验室三位科学家发明出了晶体管,然后在1954年研制出晶体管计算机,与第一代相比,这一代晶体计算机体积更小、速度更快、功耗更低、可靠性更高。
此外内存采用磁芯存储器,外存采用磁鼓与磁带存储器,并实现了浮点运算,并在系统结构方面提出了变址、中断、I/O处理器等新概念。
这时计算机软件也得到了发展,出现了多种高级语言及其编译程序。
在这期间(20世界50年代中后期到60年代末)研发的计算机都属于第二代计算机。
第三代计算机
1958年德州仪器公司工程师和仙童半导体公司的工程师同时各自独立发明了集成电路,为现代计算机发展奠定了革命性基础。
1964年IBM公司宣布了世界第一个采用集成电路的通用计算机IBM360,最重要的是出现了新技术:微程序控制、告诉缓存、虚拟存储器、流水线技术等。
这一时期还出现了另一个特点:大型机、小型机同时发展。
在这期间(20世界60年代末到70年代中后期)研发的计算机都属于第三代计算机。
第四代计算机
20世界70年代,微电子学飞速发展,产生了大规模集成电路和微处理器给计算机工业注入新鲜血液。
当时最大的微处理器制造商就是我们熟知的Intel公司。
半导体集成电路的集成度越来越高,速度也越来越快,由于硅技术不断改进,Intel公司的创始人之一戈登·摩尔对半导体芯片工业发展前景进行了预测:每隔18个月,集成度将翻一番,速度将提高一倍,而价格将下降一半,这个规律就是我们熟知的摩尔定律。
现在的计算机运算速度极快,每秒可计算1.6亿次浮点数运算。
这一时期的另一个特点是:计算机网络的发展和广泛应用。
互联网逐渐发展起来,全世界的计算机开始相连,这大大扩展了信息的加速流通,提高了社会的协调和合作能力,也使得个人计算机方式向网络化方向发展。
此后计算机业界不再沿用传统以元器件划分“第X代计算机”的说法。
计算机硬件与软件
在计算机刚刚出现的初期,“计算机”实际上是指计算机硬件,在这期间都是为了改进硬件得以让计算机运算速度更快。
这时的计算机主要是CPU、存储器、I/O控制器、外设、各类总线。
这段时间的计算机主要以科学计算为主,计算量大,但输入输出量不大。
直到20世纪60年代,除了科学计算之外,还出现了不但计算量大,而且输入输出量也较大的需求,这时才逐渐产生了计算机软件的概念。
为了充分利用处理器、存储器和输入输出等计算机资源,逐渐出现了操作系统。
为了提高编程工作效率,出现了高级语言。
为了适应大量的数据处理,出现了数据库管理系统。
随着软件规模和复杂性不断提高,软件开发过程中出现了各种难以控制的局面,即所谓的软件危机,为了克服这种危机,人们研究出了很多技术方法,这就产生了“软件工程”概念和方法出现。
我们来总结一下计算机硬件和软件:
- 硬件:主要包括CPU、存储器、I/O控制器、外设和各类总线
- 软件:
- 系统软件:操作系统、编译器、数据库管理系统等
- 应用软件:科学计算软件、多媒体处理软件、电子邮件软件、文字处理软件等
程序开发与执行
在最早期使用计算机时,计算机只能接收二进制信息,即0和1,操作人员只能通过很多0和1来编写程序,然后让计算机执行,但这样就有一个问题,非常多的0和1,稍微不注意就有可能发生错误,而且很难发现。
逐渐人们开始想,把一组固定的0和1用一个标记表示,以后不再写0和1,而是通过很多标记来表达自己的意图,最终再通过转换得到计算机能够识别的0和1,这个标记语言就是汇编语言。
但人们还是没有得到满足,汇编语言虽然比0和1要容易编写和识别,但编写难度和复杂度还是比较大,且还是不太符合人类的编写程序的逻辑思路,为了解决这个问题,又发展出了高级语言,高级语言的语法更符合人们的逻辑思路习惯,但是要想执行高级语言编写的程序,还是要转换成汇编语言,再通过汇编程序转换成计算机可识别的信息。
可见,一个程序要想在计算机中运行,都要经过层层翻译转换才行。
我们以最简单一个例子,来分析一下程序是如何从开发到执行的。
首先我们需要编写一段程序,打开任意一个编辑软件写下如下代码,并命名为hello.c
:
1 |
|
这段程序是如何存储在计算机中的呢?
在计算机内部,这段代码会以ASCII
字符方式存储,如图,每个字符对应的ASCII
码的十进制值:
有了程序后,我们如何执行它?在计算机世界中,计算机只认识二进制信息,就是0和1,我们要想让一个程序执行,就必须通过某种方式,把我们的程序转换成计算机能够识别的信息。
在C语言中,这种转换包含以下几种方式:预处理、编译、汇编、链接:
通过这几个阶段,我们可以得到一个可执行文件,这个可执行文件才能被计算机执行。
任何一种编程语言,都需要类似这样一个转换翻译的过程,不过转换方式不同,大体分以下3类:
- 汇编程序:将汇编语言程序翻译成机器语言
- 解释程序:将源程序按语句顺序逐条翻译成机器指令并执行,不生成目标程序,例如Python可编写后直接执行
- 编译程序:将高级语言源程序翻译成汇编语言或机器语言程序,例如C、C++、Java都需要编译后执行
我们再来看一个实现两个相邻数据元素交换的程序,从高级语言到机器语言转换的过程如下:
各语言层次的程序表示如下:
- 在编写高级语言时,用3个赋值语句实现
- 转换成汇编语言后,变成4个汇编语句
- 经过汇编程序转换成机器语言时,对应的是计算机识别的机器指令0和1
- 计算机将机器语言翻译成控制信号,驱动硬件执行
计算机系统分层
一个计算机系统可以分为硬件和各类软件层次化方式构建的分层系统,不同用户工作在不同的层次,如下图:
可以看到不同层次的用户,对计算机的关注点是不同的。
图中虚线部分是我们这个系列重点关注的模块,只有了解计算机内部是如何工作,从上到下是如何让计算机执行的,我们在编写程序时,才能有更深刻的认识。