前面已经将整个C语言的体系学完了,这个时候开启我们的计算机的组成的学习了,很多优化都是基于硬件来的,所以我们多少要了解下计算机的硬件的部分,计算机的组成。
计算机的科学幻想,车载计算机、手机、人类基因组项目、万维网、搜索引擎等等。如今已经成为了现实。
不管是家电还是手机再或者是超级计算机,虽然都是使用了一套通用的硬件技术,但不同的应用具有不同的世界要求,并以不同的方式使用核心硬件技术。主要是下面三种不同的应用场景中:
后PC时代,替代个人电脑的是个人移动设备。个人移动设备是连接到互联网的小型无线设备;它们依靠电池供电,并通过下载APP的方式来安装软件。常见的例子有智能手机和平板电脑。
云计算接替了传统的服务器,它依赖于现在仓储级计算机的巨型数据中心。通过互联网提供服务的大规模服务器集群,一些服务提供商动态将不同数量的服务器作为像水、电一样的公用资源进行租用。提供软件即服务,通过互联网以服务的方式提供软件和数据,通常是通过一个小型客户端程序连接网络以运行程序或获取数据,而不是必须完全在本地设备上安装和运行所有二进制代码。具体的例子包括web搜索和社交网络。
计算机设计者面临的一个永恒的问题就是摩尔定律驱动的快速变化。摩尔定律指出单芯片上所集成的晶体管资源每18至24个月翻一番。
抽象来表示不同的设计层次,隐藏低层细节以提供给高层一个更简单的模型。
对常用的指令、热指令,进行加速,常用的指令的也是经常用的,所以要加速。
通过并行计算操作来获得更高性能。
并行性的一种特殊场景在计算机体系结构中非常普遍,因此它有着专有名称:流水线。
在某些情况下,假设从预测错误中恢复的代价并不高,且预测相对准确,则平均来说进行预测并开始工作可能会比等到明确结果后再执行更快。
在存储层次中,速度最快、容量最小并且每位价格最昂贵的存储器处于顶层,而速度最慢、容量最大且每位价格最便宜的存储器处于底层。
计算机不仅要速度快,更需要工作可靠。由于任何物理设备都可能发生故障,因此我们通过引入冗余组件来使系统可靠,该组件在系统发生故障时可以替代失效组件并帮组检测故障。
一个应用程序,可以由数百万行代码构成,并依靠软件库实现异常复杂的功能。众所周知,计算机中的硬件只能执行极为简单的低级指令。从复杂的应用程序到原始的指令涉及若干软件层次来将高层次操作解释或翻译成简单的计算机指令,这可以作为伟大的抽象思想的一个例子。
外层是应用软件,中心是硬件,系统软件位于两者之间。系统软件中最重要的就是操作系统和编译器。操作系统是用户程序和硬件之间的接口,为用户提供各种服务和监控的功能。主要的作用如下:
编译器完成另外一项重要的功能:把高级语言编写的程序编译成硬件能执行的指令。
从高级语言到硬件语言,对于计算机来说,最简单的信号就是通和断。就直接可以用0、1表示,我们称为二进制位。计算机服从我们的命令,即计算机术语中的指令。指令是能被计算机识别并执行的位串,可以将其视为数字。
第一代程序员是直接使用二进制数与计算机通信的,不便于记忆,所以后来他们发明了助记符。最初助记符是手工翻译成二进制的,其过程显然过于烦琐。随后就发明了一种称为汇编器的软件。即汇编语言。而机器可以理解的二进制语言是机器语言。认识到可以编写一个程序来将更强大的高级语言翻译成计算机指令死计算机早期的一个重大突破。高级编程语言及其编译器大大地提高了软件的生产率。有如下几个好处:
任何一台计算机的基础硬件都要完成相同的基本功能:输入数据、输出数据、处理数据和存储数据。
输入为计算机提供数据,输出将计算结构送给用户。
组成计算机的五个经典的部件是输入、输出、存储器、数据通路和控制器。其中后两个部件通常合称为处理器。
大多数个人移动设备都用液晶显示(LCD)来获得轻巧、低功耗的显示效果。大多数LCD显示器采用动态矩阵显示技术,其每个像素都由一个晶体管精确地控制电流,使图像更清晰。在彩色动态矩阵LCD中,还有一个红-绿-蓝屏决定三种颜色分量的强度,每个点需要三个晶体管开关。
图像由像素矩阵组成,可以表示成二进制位的矩阵,称为位图。
计算机硬件采用光栅刷新缓冲区来保存位图以支持图像。要显示的图像保存在帧缓冲区中,每个像素的二进制值以刷新频率读出到显示设备。
触摸屏可采用多种方式实现,许多平板电脑采用电容感应实现。如果绝缘玻璃上覆盖一层透明的导体,人的手指接触到平铺范围时,由于人是导体,将会使屏幕的电场发生变化,进而导致电容的变化。这种技术允许同时接触多个点,可提供非常好的用户界面。
处理器是计算机中最活跃的部分。它严格按照程序中的指令运行,完成数据相加、数据测试、按结果发出控制信号使I/O设备做出动作等操作。
主要包括两个主要部件:数据通路和控制器,分别相当于处理器的身体和大脑。数据通路负责完成算术运算,控制器负责指导数据通路、存储器和I/O设备按照程序的指令正确执行。
内存是程序运行时存储空间,它同时也用于保存运行时所使用的数据。内存由DRAM芯片组成。动态随机访问存储器的缩写。还有一种是高速缓存是一种小而快的存储器,一般作为DRAM的缓冲。高速缓存采用的是另一种存储技术,称为静态随机访问存储器。
我们前面最重要的就是抽象,最重要的抽象之一是硬件和底层软件之间的接口。该抽象被命名为计算机指令系统体系结构或简称体系结构。计算机体系结构包含了程序员正确编写二进制机器语言程序所需要的全部信息。一般来说,操作系统需要封装I/O操作、存储器分配和其他低级的系统功能细节,以使得应用程序员无须关注这些细节。提供给应用程序员的基本指令系统和操作系统接口合称为应用二进制接口。
无论硬件还是软件都可以商用抽象分成多个层次,每个较低的层次把细节对上层隐藏起来。抽象层次中的一个关键接口是指令系统体系结构,硬件和底层软件之间的接口。
我们已经知道如何输入数据,如何使用这些数据,但是这些数据一旦断电,所有的数据就丢失了,这些内存是易失性存储。与之对立是非非易失性存储。为了更好的区分,我们将前者称为主存储或主要存储,后者称为辅助存储。辅助存储形成了存储层次中更低的一层。主要是硬盘这种,以及就是固态硬盘。
通过网络,一台计算机可以与其他计算机通信,从而扩展计算机能力。联网的计算机主要优点如下:
晶体管仅仅是一种受电流控制的开关。集成电路是由成千上万个晶体管组成的芯片。
芯片的制造从硅开始,硅是沙子中的一种物质。由于硅的导电能力不强,因此称为半导体。可以通过一些特殊的手段将其转为以下三种类型之一:
硅锭经过切片机切成厚度不超过0.1英寸的晶圆,这些晶圆经过一系列化学加工最宠生成晶体管、导体、绝缘体。
通过切分,可以只淘汰哪些有瑕疵的晶片,而不必淘汰整个晶圆。对这一过程的量化描述可以用工艺良率来表示,其定义为合格晶片数占总晶片数的百分比。
合格晶片要连接到I/O引脚上,使用压焊工艺形成封装。由于封装过程也可能出错,因此在封装之后必须进行最后一次测试再交付给用户。
每 晶 片 的 价 格 = 每 晶 圆 的 价 格 / 每 晶 圆 的 晶 片 数 ∗ 良 率 每晶片的价格=每晶圆的价格/每晶圆的晶片数*良率 每晶片的价格=每晶圆的价格/每晶圆的晶片数∗良率
每 晶 圆 的 晶 片 数 = 晶 圆 面 积 / 晶 片 面 积 每晶圆的晶片数=晶圆面积/晶片面积 每晶圆的晶片数=晶圆面积/晶片面积
工 艺 良 率 = ( 1 / ( 1 + 单 位 面 积 的 缺 陷 数 ∗ 芯 片 的 面 积 / 2 ) ) 2 工艺良率=(1/(1+单位面积的缺陷数*芯片的面积/2))^2 工艺良率=(1/(1+单位面积的缺陷数∗芯片的面积/2))2
如果你在两台不同的桌面计算机上运行同一个程序,那么可以说首先完成作业的那台计算机更快。这儿引入一个概念,响应时间是指从开始一个任务到该任务完成的事件,又被称为执行时间。
如果你运行的是一个数据中心,有好几台服务器供很多用户投放作业,那么应该说在一天之内完成作业最多的那台计算机更快。这儿引入两个概念,提高吞吐率和带宽。在给定的时间内完成的任务数。因此在大多数情况下,我们需要对个人移动设备采用不同的应用程序作为评测基准,并采用不同的性能度量标准。个人移动设备更关注响应时间,而服务器则更关注吞吐率。
时间是计算机性能的衡量标准:完成同样的计算任务,需要时间最少的计算机是最快的。程序的执行时间一般以秒为单位。然而,时间可以用不同的方式来定义,这取决于我们所计数的内容。对时间最直接的定义是挂钟时间,也叫响应时间、运行时间。这些术语均表示完成某项任务所需的总时间,包括了磁盘访问、内存访问、I/O活动和操作系统开销等一切时间。
由于计算机一个处理可能同时运行多个程序。所以,我们往往要将运行自己任务的事件与一般的运行时间区分开来,这里叫CPU执行时间。还可以继续区分,用于用户程序的时间和操作系统为用户程序执行相关任务所花去的CPU时间,前者称为用户CPU时间,后者称为系统CPU时间。
那我们如何去计量这些时间呢?几乎所有计算机的构建都需要基于时钟,该时钟确定各类时间在硬件中何时发生。这些离散时间间隔被称为时钟周期数。
由前面的计算公式,我们得出如下的公式
程 序 的 C P U 执 行 时 间 = 程 序 的 C P U 时 钟 周 期 数 ∗ 时 钟 周 期 长 度 程序的CPU执行时间 = 程序的CPU时钟周期数 * 时钟周期长度 程序的CPU执行时间=程序的CPU时钟周期数∗时钟周期长度
由于时钟频率和时钟周期长度互为倒数,所以可以得出下面的公式
程 序 的 C P U 执 行 时 间 = 程 序 的 C P U 时 钟 周 期 数 / 时 钟 频 率 程序的CPU执行时间=程序的CPU时钟周期数/时钟频率 程序的CPU执行时间=程序的CPU时钟周期数/时钟频率
这个公式清楚的地表明,硬件设计者减少程序执行所需的CPU时钟周期数或缩短时钟周期长度,就能改善性能。
上述性能公式并未涉及程序所需的指令数。然而,由于编译器明确了要执行的指令,且计算机必须要通过执行指令来运行程序,因此执行时间必然依赖于程序中的指令数。于是得到如下的公式
C P U 时 钟 周 期 数 = 程 序 的 指 令 数 ∗ 指 令 平 均 时 钟 周 期 数 CPU时钟周期数=程序的指令数*指令平均时钟周期数 CPU时钟周期数=程序的指令数∗指令平均时钟周期数
指令平均时钟周期数表示执行每条指令所需的时钟的周期平均数,缩写为CPI。根据锁完成的任务的不同,不同的指令需要的时间可能不同,CPI是程序的所有指令所用时钟的周期的平均数。CPI提供了一种相同指令系统在不同实现下比较性能的方法,因为在指令系统不变的情况下,一个程序执行的指令数是不变的。
现在我们可以使用指令数、CPI和时钟周期长度来写出基本的性能公式:
C P U 时 间 = 指 令 数 ∗ C P I ∗ 时 钟 周 期 长 度 CPU时间=指令数*CPI*时钟周期长度 CPU时间=指令数∗CPI∗时钟周期长度
由于时钟频率和市州周期长度互为倒数,于是有了下面的公式:
C P U 时 间 = 指 令 数 ∗ C P I / 时 钟 频 率 CPU时间=指令数*CPI/时钟频率 CPU时间=指令数∗CPI/时钟频率
需要铭记于心的是,时间是唯一对计算机性能进行测量的完整而可靠的指标。
其中指令数量取决于计算机体系结构,并不依赖于计算机的具体实现,因而我们可以在不知道计算机全部实现细节的情况下对指令数进行测量。但是,CPI与计算机的各种设计细节密切相关,包括存储系统和处理器结构,以及应用程序中不同类型的指令所占的比例。因此,CPI对于不同应用应用程序是不同的,对于相同指令系统的不同实现方式也是不同的。
如果某个因素相同,则必须考虑不同的因素才能确定性能的优劣。因为CPI根据指令分布的不同而变化,所以即时时钟频率是相同的,也必须比较指令总数和CPI。指令分布:在一个或多个程序中,对指令的动态使用频度的评价指标。
当前在集成电路技术中占统治地位的是CMOS(互补型金属氧化半导体),其主要的能耗来源是动态能耗,即在晶体管开关过程中产生的能耗,即晶体的状态从0翻转到1或从1翻转到0消耗的能量。每个晶体管需要的功耗是一次翻转需要的能耗和开关频率的乘积。开关频率是时钟频率的函数负载电容是连接到输出上的晶体管的数量和工艺的函数,该阿含糊决定了导线和晶体管的电容。
目前的问题是如果电压继续下降会使晶体管的泄露电流过大,就想水龙头不能被完全关闭一样。
虽然动态能耗是CMOS能好的主要来源,但静态能耗也是存在的,因为即使在晶体管关闭的情况加,也有泄露电流的存在。
功耗成为继承电路设计的挑战的两个原因。首先,电源必须由外部输入并且分布到芯片的每个角落。其次,功耗作为热量形式散发,因此必须进行散热处理。
功耗的极限迫使微处理器的设计产生了巨变,从2002年起,其每年的增长速率从1.5下降到1.2。所以多核的处理器出来了。多核处理器意味着写并行程序,才能提高性能。那么为什么编写并行的程序这么难?
原因一:并行编程以提高性能为目的,这必然增加编程的难度。
原因二:为了发挥并行硬件的速度,程序员必须将应用划分为每个核上又大致向塘的数量的任务,并同时完成。
任务分配必须平衡才能得到预期的加速。必须尽量减少通信和同步的开销。主要有两种方法来解决:共享内存通信和显示消息传输。
谬误是说明我们在实际中经常遇到的误解。陷阱通常是指仅在有限的上下文中才正确的一般原理。
陷阱:在改进计算机的某个方面时期总性能的提高与改进大小成正比。
陷阱:用性能公式的一个子集去度量性能。
谬误:低利用率的计算机具有更低功耗。
谬误:面向性能的设计和面向能效的设计具有不相关的目标。
硬件和软件设计者都采用分层的方法构建计算机系统,每个下层都对其上层隐藏本层的细节。抽象思想是理解当今计算机系统的基础,但这并不意味着设计者只要懂得抽象原理就足够了。也许最重要的抽象层次是硬件和底层软件之间的接口,称为指令系统体系结构。保持指令系统体系结构衡定,使得基于该指令系统体系结构的不同实现能够运行相同的软件。这种方法的一个可能不足是,会阻止某些需要修改该接口的创新。
计算机组织中新思想:
本篇博客主要介绍了下计算机组成的一些东西,大概的了解了下计算机组成的一些宏观的概念,后面的博客会分章节慢慢的介绍。