第一章 计算机系统概述
1.1 计算机基本工作原理
1.1.1 冯诺依曼结构基本思想
图灵提出了图灵机模型,成为了现代计算机的理论根基。而冯诺依曼则通过提出一种结构则实现了图灵的这种设想。这种结构就是冯诺依曼结构。
其基本思想是存储程序。将事先编制好的程序和原始数据送入主存中,启动执行后,不需要人员干预,自动地逐条完成指令的取出和执行的任务。
主要特征有:
- 存储程序的工作方式
- 由 运算器,控制器,存储器,输入设备和输出设备五个基本部件组成
- 存储器既存放数据,也存放指令,形式上数据和指令没有区别,但是计算机可以试别;控制器能自动执行指令;运算器能进行算数运算,也可以进行逻辑运算;操作人员通过输入/输出设备使用计算机
- 计算机内部以二进制形式表示指令和数据,每条指令由操作码和地址码组成,操作码指出操作类型,地址码指出操作数的地址;由一串指令组成程序。
1.1.2 冯诺依曼基本结构
用一张图来表示,算是比较清晰,其中各部分的作用如果有不明白的可以自行去百度百科一下。
控制部件就是控制CPU的部分,他根据指令寄存器中的操作命令和标志寄存器的数据,控制ALU计算,控制内存读写,并修改程序计数器。程序计数器和上一条指令的地址共同作用计算出下一条指令的地址。该地址被存放在MAR中,至于是往这个地址中存放数据还是删除数据,就看控制部件是怎么控制的了。而无论是将要存进去的数据还是将要取出来的数据,都放在MDR中,将要取出来的数据,会从MDR放入IR中,而将要放进主存的数据,一般都是ALU的计算结果。以图为准吧,这张图还算简洁清晰。而ALU进行计算的原始数据,都是从寄存器中获得的。
1.1.3 程序和指令的执行过程
指令是一个01串,是CPU可以完成的一个原子操作(即不可再分的操作)。
- 取数指令 从主存单元中取数到通用寄存器里
- 加法指令 将两个通用寄存器内容相加后送入结果寄存器
- 传送指令 将一个寄存器中的值放到另一个寄存器中
指令被分为多个字段 有操作码,地址码等字段 - 操作码字段:指出指令的操作类型
- 地址码字段:指出指令所处理的操作数的地址
程序的执行就是周而复始地执行
原书中有易于理解的详细例子,在此不赘述了
根据PC取指令 指令译码 pc+1 取操作数并执行 送结果
每一个指令都包含若干个微操作(虽然刚才说过一条指令就是一个原子操作了,不过确实是有微操作的)
而微操作是有顺序的,所以需要时钟信号来进行定时,每一个时钟信号宽度就是时钟周期,一条指令的执行包含一个或多个时钟周期。
1.2 程序的开发与运行
程序开发大体上就是将一个任务转化为算法描述,然后将其用编程语言表述出来。
程序语言和自然语言相比,有严格的执行顺序,不存在二义性。
1.2.1 程序设计语言和翻译程序
- 机器语言:机器可以直接理解的语言
- 汇编语言:和机器语言一一对应的指令,比用机器语言写程序简单一些
- 高级程序设计语言: 面向算法设计,比较接近日常英语书面语言的程序设计语言
而将高级编程语言转换为汇编语言,机器语言的软件就是翻译程序。 - 汇编程序又称汇编器 将汇编语言源程序翻译成机器语言目标程序
- 解释程序又称解释器 将源程序中的语句按照执行顺序逐条翻译成机器指令并立即执行(一般这种程序如Python写出来的程序,一般是弱类型,可能在运行时间出现意想不到的和变量类型有关的问题)
- 编译程序又称编译器 将高级语言的源程序翻译成汇编语言或机器语言目标程序
1.2.2 从源程序到可执行文件
从源程序到可执行文件需要经过4个步骤
- 预处理阶段 对源程序中以#开头的命令处理
- 编译阶段 对预处理后的源程序编译,生成汇编源程序文件
- 汇编阶段 对汇编语言源程序进行汇编,生成可重定位目标文件
- 连接阶段 将多个可重定位目标文件合并城一个可执行目标文件
最终,生成的可执行文件被保存在磁盘上,可以通过某种方式启动来运行。
1.2.3 可执行文件的启动和执行(以hello word程序为例)
- shell程序将用户的输入逐一读入CPU寄存器后再保存到主存中
- shell调出操作系统内核中相应的服务例程,由内核加载磁盘上的可执行文件hello到存储器中
- 内核加载完后,将hello的第一条指令送到PC,处理器就会开始执行程序了。
操作系统在此过程中必不可少,提供人机接口环境和内核服务历程
1.3 计算机系统的层次结构
通过层层抽象,一个层次向上层用户提供一个抽象的简介接口而将降低层次的实现细节隐藏起来。计算机解决问题的过程就是不同抽象层转换的过程。
1.3.1 计算机系统抽象层的转换
计算机系统的抽象层次大体上是
- 应用(问题)
- 算法
- 编程(语言)
- 操作系统/虚拟机
- 指令集体系结构ISA
- 微体系结构
- 功能部件
- 电路
- 器件
其中ISA 定义了一台计算机可以执行的所有指令的集合,每条指令规定了计算机执行什么样的操作,以及所处理的操作数存放的地址空间的操作数类型。
是软件能够感知到的部分,也称软件可见部分。
1.3.2 计算机系统核心层之间的关联
ABI是为运行在特定ISA及特定操作系统纸上的应用程序规定的一种机器级目标代码层接口,包含了运行在特定ISA及特定操作系统上的应用程序所对应的目标代码生成时必须遵循的约定。
还有API的定义,比较高层次的程序接口,可以自行去查。
ISA ABI API 之间的关系在此不赘述了
1.3.3 计算机系统的不同用户
计算机系统下的软件一般有 系统软件和应用软件
有不同的用户 最终用户,系统管理员,应用程序员,系统程序员
1.4 计算机系统性能评价
1.4.1 计算机性能的定义
- 吞吐率:单位时间内完成的工作量
- 带宽:单位时间内传输的信息量
- 响应时间: 作业从提交开始到作业完成所用的时间
- 执行时间和等待时间: 一个任务所用时间的度量
不同应用场合,性能期望不同。不只是强弱,也包括性能的方向。
1.4.2 计算机性能的测试
CPU时间指CPU用于执行本程序的时间,分为用户cpu时间和系统cpu时间
- 用户CPU时间: 真正用于运行程序代码的时间
- 系统CPU时间: 为了执行用户程序而需要CPU运行操作系统的时间
- 其他时间: 等待IO操作完成的时间或CPU用于执行其他用户程序的时间
计算机系统的性能评价主要考虑CPU性能 - 系统性能:系统的响应时间,与CPU以外的其他部分也有关
- CPU性能:用户CPU时间
时钟周期 时钟频率的定义此处略
CPI(Cycles Per Instruction) 执行一条指令所欲的时钟周期数
用户CPU时间 = 程序总时钟周期数/时钟频率 =程序总时钟周期数时钟周期
程序总时钟周期数 = 程序总指令条数CPI(CPI是平均后的)
综合CPI = 程序总时钟周期数/程序总指令条数
用户CPU时间 = CPI程序总指令条数时钟周期
注意,指令条数少/时钟周期短/CPI小不代表执行速度快,时钟周期,指令条数 CPI是相互制约的关系
1.4.3 用指令执行速度进行性能评估
MIPS(Million Instructions Per Second):平均每秒执行多少百万条命令
用该指标衡量性能并不准确可靠,书中有例子
MFLOPS(Million Floating-point operations Per second) 每秒执行的浮点运算有多少百万次
1.4.4 用基准程序进行性能评估
就是一种程序,计算机通过运行它,来考察计算机性能,当然,基准程序也有很多种。
SPEC测试程序集是应用最广泛,最全面的。
1.4.5 Amdahl定律(阿姆达尔定律)
用于衡量对计算机中某个硬件部分或软件部分进行改进,所带来的对系统整体性能的改进程度。在此不赘述。
1.5 本书的主要内容和组织结构
- 计算机系统概述
- 数据的机器级表示和处理
- 程序的转换及机器级表示
- 程序的链接
- 程序的执行
- 层次结构储存系统
- 异常控制流
- IO操作的实现