Chpater1 计算机概要与技术
写在前面
其实这本书对应的是国内开设的计算机专业课-计算机组成原理。实际上考研中408对应的考试指定参考教材是唐老爷子(唐朔飞)的计算机组成原理,这本书我虽然没有看过,但是相当多的读者都反应阅读这本书的难度实在不小,故本人按照推荐选择了这本由两位著名的计算机领域的学者编写的《计算机组成与设计:硬件/软件 接口》一书,这两位更有名的著作是《计算机体系结构:量化研究方法》一书,可以说是入门计算机体系结构必读的经典。
本人已经基本完成了第一到第五章重点部分知识的阅读,可以说这本书确实在叙述上十分平易近人,虽然对于这门课不可避免的存在大量的定义,但是本书都能采用甚至让人感觉啰嗦的方式去让读者明白这个概念到底是什么,同时辅以适当的例子以及图片加深理解。但是第四章处理器的难度着实不小,虽然已经编者已经尽可能的简化语言叙述了,但这仍然是全书最重要也是最难懂的一章。
本人写这本书的动机不仅是为了加深自己的理解,也可以作为其他跟我一样入门者的参考,如果直接硬啃这本书的话,难度确实还是有的,希望这一系列的笔记能够帮助到你。
作为计算机科学与技术专业的在读本科生,我认为了解计算机底层的构造对于我们写出性能更高的程序有非常大的帮助,我们不能只埋头去写一些我们完全不知道为什么存在的代码,我们有必要去了解这些代码到底是以何种方式运行在计算机底层结构中的。换言之,我们需要对身边的一切事物保持一种追问的冲动,去试图弄明白到底是为什么。
另外,我所阅读的这本书是MIPS版本的,这本计算机组成与设计一书,还有ARM,RISC-V两个版本。
想要了解MIPS、ARM、RISC-V这几个有什么区别的话,可以自行搜索百度。
计算机系统结构中的8个伟大思想
面向摩尔定律的设计
摩尔定律我相信有些小伙伴都或多或少的听过。实际上,计算机设计者面临的一个永恒问题就是摩尔定律所驱动的快速变化。
摩尔定律指出单芯片上的集成度每18~24个月翻一番。所以计算机设计者必须预测其完成设计时的工艺水平,而不是设计开始时。
使用抽象简化设计
抽象是我认为理解计算机中最重要的概念之一,抽象的概念实际上就是屏蔽下层的实现细节,只提供几个最重要的接口给上层,供上层使用。提高硬件和软件生产率的主要技术之一就是使用抽象来表示不同的设计层次。
加速大概率事件
我们都知道一个事实,大概率事件发生的可能要远大于小概率时间发生的可能。所以在计算机实现中,加速大概率事件远比优化小概率事件更能提高性能。
通过并行提高性能
在生活中,并行执行任务的情况已经随处可见。实际上,从计算的诞生开始,计算机设计者就通过并行执行操作来提高性能。在之后的学习中,将会看到许多并行性能的例子。
通过流水线提高性能
在计算机系统结构中,一个特别的并行场景就是流水线。我们可以将许多事情的完成拆分成多个步骤,在并行执行任务中,可以在完成A的第一部分执行第二部分的时候,同时执行B的第一部分,这样下去就形成了流水线。
通过预测提高性能
在某些情况下,如果假定从误预测恢复执行代价不高并且预测的准确率相对较高,则通过猜测的方式提前开始某些操作,要比等到确切知道这些操作应该启动时才开始要快一些。
存储器层次
存储器的速度经常影响性能,存储器的容量限制了解题的规模。我们通常想要一个完美的解决方案即存储器容量更大、速度更快、价格更便宜。但实际上这是违背客观规律的,因此设计师们发现可以通过存储器层次来解决这些麻烦。有关存储器技术的相关知识,我们已经在第五章讲述过,在这里不具体展开。
通过冗余提高可靠性
计算机不仅需要速度快,还需要一定的可靠性。由于任何一个物理器件都可能失效,因此我们可以使用冗余部件的方式来提高系统的可靠性。
程序概念入门
我们给出一个抽象的关系图可以描述软件以及硬件之间的关系。
系统软件有两种是对现代计算机而言十分重要的:操作系统和编译程序。
操作系统是用户的软件与硬件之间的接口,操作系统可以对上层的用户提供借口来实现用户对底层硬件的操作。操作系统最重要的作用是:
- 处理基本的输入和输出操作( I/O操作)
- 内存管理(分配外存和内存)
- 为多个应用程序提供共享计算机资源的服务
高级语言到硬件语言
我们首先从底层说起,最底层的信息传递都是我们所知道的二进制传输。即所有的信息都是通过0和1来传递的,0代表低电平,1代表高电平。我们通常认为计算机语言就是二进制数。每个字母是二进制元数字中的一位。
在最开始的古老时代,程序员是直接使用二进制数与计算机通信的。所以他们发明了助记符,以符合人类的思维方式。随后又开发了一种称为汇编程序的软件,可以将助记符形式的指令自动翻译成对应的二进制。
机器可以理解的二进制语言我们成为机器语言,而以助记符表示的机器指令我们称为汇编语言。
但这仍然太过麻烦了,汇编语言要求程序员写出计算机执行的每条指令,例如数据在寄存器之间来回的传递过程。高级程序语言以及其编译程序的出现大大提高了软件的生产率。这其实也是我们之前谈到的抽象的一个例子。
我们在编译软件上编写的C语言代码,是如何变成机器语言的呢?大概可以分为以下几个步骤。
我们之前所学的C语言、C++语言以及Java语言都属于高级编程语言。
软件部分的基本概念就到此结束,接下来我们说一说不是那么了解的硬件部分概念。
硬件概念入门
我们可以将计算机抽象成一个黑盒,那么最重要的部分一定就是黑盒的输入和输出,所以计算机两个关键的部件就是输入设备和输出设备。输入设备和输出设备不仅仅局限于我们认知范围内的东西,无线网络可以即是输入设备又是输出设备。
显示器
大多数个人移动设备都用液晶显示(LCD)来获得低功耗的显示效果。大多数LCD显示器采用动态矩阵显示技术,其中每个像素都由一个晶体管精确地控制电流,是图像更加清晰。
处理器
集成电路俗称芯片,芯片上包含着处理器。处理器是计算机中最为活跃的部分,它严格的按照程序中的指令运行。人们也通常将处理器称为中央处理单元。
处理器从逻辑上包含两个主要部件:数据通路和控制器。数据通路负责完成算术运算,控制器负责指导数据通路、存储器等其它设备按照指令运行。
数据安全
在第五章的讲述中,我们并没有特意强调数据安全的问题,实际上,数据安全的重要性经常被忽视。例如机械硬盘不能磕碰,过于剧烈的振动会导致机械硬盘内部的机械结构造成损坏,数据丢失。固态硬盘的寿命会随着你写入数据而逐渐降低。
计算机中的内存是易失性存储器,在断电之后,内存中的所有数据消失。而磁盘是非易失性存储器,在断电之后仍然能保存数据。
处理器制造技术
晶体管仅仅是一种受电流控制的开关。集成电路是由成千上万个晶体管组成的芯片。我们通常用超大规模集成电路来描述现在的芯片。
芯片的制造从硅开始。因为硅的导电能力不强,我们称硅为半导体材料。用特殊的化学方法对硅添加某些材料,可以把其转化为以下三种类型之一:
- 良好的导电体
- 良好的绝缘体
- 可控的导电体或绝缘体
下图展示了集成电路制造的整个流程:
成品率被定义为合格芯片数占总芯片数的百分比。当芯片尺寸增大时,集成电路的价格会快速上升,因为成品率和晶圆中芯片的总数都下降了。为了降低价格,大芯片采用下一代工艺进行尺寸收缩,从而改进每晶圆的芯片数和成品率。
合格之后的芯片要连接到I/O引脚上,这一过程被称为封装。
性能的度量
响应时间:也叫执行时间,是计算机完成某任务所需的总时间,包括硬盘访问、内存访问、I/O活动、操作系统所花费的时间、CPU执行时间等。
吞吐率:也叫带宽,性能的另一种度量参数,表示单位时间内完成的任务数量。
我们可以有如下式子:
我们经常使用"X是Y的n倍快"来表示性能的比较。
我们可以使用CPU执行时间这一概念只表示与CPU有关的消耗时间。CPU执行时间还可以进一步被分为用户CPU时间和系统CPU时间。
一个程序的CPU执行时间 = 一个程序的CPU执行时钟数 × 时钟周期时间
一个程序的CPU执行时间 = 一个程序的CPU时钟周期数 / 时钟周期时间
CPU时钟周期数 = 程序的指令数 × 每条指令的平均时钟周期数
现在可以用指令数来写出性能公式: