计算机系统基础-计算机系统概述
1. 计算机基本工作原理
1.1 计算机基本工作原理
1.1.1 存储程序基本思想:必须将实现编写好的程序和原始数据送入主存后才能执行程序,一旦程序被启动执行,计算机在不需要操作人员干预的情况下自动完成逐条指令取出和执行的任务。
1.1.2 冯诺依曼结构基本思想:
1.1.2.1 采用存储程序的工作方式。
1.1.2.2 计算机由运算器、控制器、存储器、输入设备和输出设备 5 个基本部件组成。
1.1.2.3 存储器不仅能存放数据,也能存放指令,形式上数据和指令没有区别,但是计算机应能区分它们;控制器能够自动执行指令;运算器应能进行算术运算,也能进行逻辑运算;操作人员可以通过输入/输出设备使用计算机。
1.1.2.3 计算机内部已二进制形式表示指令和数据;每条指令由操作码和地址码两部分组成,操作码指出操作类型,地址码指出操作数的地址;由一串指令组成程序。
1.2 程序和指令的执行过程
1.2.1 指令(instruction)是用 0 和 1 序列,用来指示 CPU 完成一个特定的原子操作;指令通常划分为若干字段,包含操作码、地址码等字段。操作码字段指出指令的操作类型,如取数、存数、加、减等;地址码字段指出指令所处理的操作数地址,如寄存器编号、主存单元编号等。
1.2.2 指令执行各阶段都包含若干微操作,微操作需要控制信号控制。每条指令执行过程中,所包含的为操作具有先后顺序关系,需要时钟信号进行定时。通常,CPU 中所有微操作都由时钟信号进行定时,时钟信号的宽度作为一个时钟周期。一条指令的执行时间包含一个或多个时钟周期。
2. 程序的开发与运行
2.1 程序设计语言和翻译程序
2.1.1 使用特定计算机规定的指令格式而形成的 0/1 序列成为机器语言,计算机能理解和执行的程序成为机器代码或机器语言程序,其中每条指令由 0 和 1 组成,称为机器指令。这种语言不便于读写,又引入一种机器语言的符号表示语言,用简短的英文符号和机器指令建立对应关系,成为汇编语言,机器指令对应的符号表示称为汇编指令,汇编语言编写的程序必须转化为机器语言程序才能被执行。汇编指令和机器指令都与特定的机器结构相关,因此都属于低级语言,统称为机器级语言。
2.1.2 面向算法设计的、较接近于日常英语书面语言的程序设计语言,称为高级编程语言。
2.1.3 计算机无法理解高级编程语言,需要将其转换为机器语言,转换程序称为翻译程序,被翻译的语言和程序分别称为源语言和源程序,翻译生成的语言和程序分别称为目标语言和目标程序。翻译程序包含如下三类:
2.1.3.1 汇编程序:也称为汇编器(assembler),实现将汇编语言源程序翻译成机器语言目标程序。
2.1.3.2 解释程序:也称为解释器(interpreter),实现将源程序的语句按其执行书序逐条翻译为机器指令并立即执行。
2.1.3.3 编译程序:也称为编译器(compiler),实现将高级语言源程序翻译成汇编语言或机器语言目标程序。
2.2 从源程序到可执行文件
hello.c 示例代码如下:
#include<stdio.h>
int main()
{
printf("hello, world\n");
}
运行 gcc -o hello hello.c 将包括如下步骤:
2.2.1 预处理阶段:预处理程序(cpp)对源程序中以字符 # 开头的命令进行处理,例如,将 #include 命令后面的 .h 文件内容嵌入到源程序文件中。预处理程序的输出结果还是一个源程序文件,以 .i 为扩展名。
2.2.2 编译阶段:编译程序(ccl) 对预处理过后的源程序进行编译,生成一个汇编语言源程序文件,以 .s 为扩展名,例如,hello.s 是一个汇编语言源程序文件。因为汇编语言与具体的机器结构相关,所以,对同一台机器来说,不管何种高级语言,编译转换后的输出结果都是同一种机器语言对应的汇编语言源程序。
2.2.3 汇编阶段:汇编程序(as)对汇编源程序进行汇编,生成一个可重定位目标文件,以 .o 为扩展名,是一种二进制文件,其中代码已经是机器指令。
2.2.4 链接阶段:连接程序(ld)将多个可重定位目标文件和标准函数库中的可重定位目标文件合并成一个可执行目标文件,简称可执行文件。本例中,连接器将 hello.o 和标准库函数 printf 所在的可重定位目标模块 printf.o 进行合并,生成可执行文件 hello。
2.3 可执行文件的启动和执行
shell 程序执行 ./hello ,此时:
2.3.1 shell 程序会将用户从键盘输入的每个字符逐一读入 CPU 寄存器中。
2.3.2 然后保存到主存中,在主存的缓存中形成字符串 ".hello"。
2.3.3 当收到 [Enter] 按键时,shell 将调出操作系统内核的相应服务进程,由内核来加载磁盘上的可执行文件 hello 到存储器。
2.3.4 内核加载完可执行文件中的代码及其所要处理的数据(这里是字符串 "hello, world\n")后,将 hello 第一条指令的地址送到程序计数器(PC)中,CPU 永远都是将 PC 的内容作为将要执行的指令的地址,因此,处理器随后开始执行 hello 程序,将加载到主存的字符串 "hello, world\n" 中的每个字符从主存中取到 CPU 的寄存器中。
2.3.5 最后将 CPU 寄存器中的字符送到显示器上显示出来。
3. 计算机系统性能评价
3.1 计算机性能的定义
3.1.1 吞吐率和响应时间是考量一个计算机系统性能的两个基本指标。
3.1.2 吞吐率表示在单位时间内所完成的工作量,类似的概念是带宽,表示单位时间所传输的信息量。
3.1.3 响应时间是指从作业提交开始到作业完成时间所用的时间,类似的概念时执行时间和等待时间,都表示一个任务所用时间的度量值。
3.1.4 不同应用场合下,计算机用户所关心的性能是不同的。
3.2 计算机性能测试
3.2.1 如果不考虑应用背景而直接比较计算机性能,大多用程序的执行时间来衡量。通常把用户感觉到执行时间分为以下两个部分:
3.2.1.1 CPU 时间:CPU 用于本程序执行的时间,包含两部分,用户 CPU 时间,指真正用于运行用户代码的时间;系统 CPU 时间,指为了执行用户代码而需要 CPU 运行操作系统程序的时间。
3.2.1.2 其他时间:等待 I/O 操作完成的时间或 CPU 用于执行其他用户程序的时间。
3.2.2 计算机系统性能评价主要考虑 CPU 性能,但是系统性能并不和 CPU 性能等价。系统性能是指系统的响应时间,而 CPU 性能指用户 CPU 时间,只包含 CPU 运行用户代码的时间。对 CPU 时间进行计算有如下几个概念与指标:
3.2.2.1 时钟周期:计算机执行一条指令被分成若干步骤(微操作)完成,每一步都由相应的控制信号来控制,这些控制信号何时发出、作用时间长短,都由相应的定时信号进行同步。因此,计算机必须能够产生同步的时钟定时信号,也就是 CPU 的主脉冲信号,其宽度称为时钟周期。
3.2.2.2 时钟频率:CPU 的主频就是 CPU 的主脉冲信号的时钟频率,是 CPU 时钟周期的倒数。
3.2.2.3 CPI:CPI(Cycles Per Instruction) 表示执行一条指令所需的时钟周期数。由于不用指令的功能不同,所需的时钟周期也不同,因此,对于一条特定指令而言,其 CPI 指执行该指令所需的时钟周期数,此时 CPI 是确定值。对于一个程序或一台机器来说,其 CPI 指该程序或该机器指令集中的所有指令执行所需的平均时钟周期数,此时,CPI 是一个平均值。
3.2.3 总结如下公式:
3.2.3.1 计算用户 CPU 时间:
3.2.3.2 已知程序总指令条数和综合 CPI,求总时钟周期数:
3.2.3.3 已知程序共有 n 种不同」类型指令,第 i 种指令条数和 CPI 分别为 和 ,则:
3.2.3.4 程序的综合 CPI 也可由以下公式求得,其中, 表示第 i 种指令在程序种所占比例:
3.2.3.5 已知程序综合 CPI 和总指令条数,则可计算用户 CPU 时间为:
3.2.4 用户 CPU 时间度量公式中的时钟周期、指令条数、CPI 三个因素相互制约,例如,更改指令集条数可以减少程序总指令数,但是,同时,可能引起 CPU 结构的调整,从而可能会增加时钟周期的宽度(即降低时钟频率)。对解决同一问题的不同程序,即使在同一台计算机上,指令条数少也不一定意味着执行最快。
3.3 Amdahl 定律
阿姆达尔定律(Amdahl Law) 是计算机系统设计方面的重要定量原则之一,基本思想在于:对系统中某个硬件部分或者软件中的某个部分进行更新所带来的系统性能的改进程度,取决于该硬件部分或者软件部分被使用的频率或者其执行时间占总执行时间的比例。有如下两种表示形式:
或
对并行计算系统进行性能分析时,会广泛使用阿姆达尔定律。阿姆达尔定律适用于对特定任务的一部分进行优化的所有情况,可以是硬件优化,也可以是软件优化。例如,系统中异常处理程序的执行时间只占整个程序运行时间的很小部分,即使对异常处理程序进行了非常好的优化,对整个系统带来的性能提升也会很小。