目录
本书第一章沿着一个程序的生命周期,简要地介绍一些逐步出现的关键概念、专业术语和组成部分。
一、信息就是位+上下文
在计算机系统中所有的信息都由一串比特来表示。
一串相同的比特(或者几个相同的字节)可以表示不同的信息 —— 整数、浮点数、字符串或者机器指令,这是通过使用不同的编码方式来实现的。
其中由ASCII码表编码的字符构成的文件称为文本文件,所有其他的文件称为二进制文件。
二、程序被其他程序翻译成不同的格式
程序员写的源代码(高级语言)必须被转换成计算机能够识别的低级机器语言指令,也就是源代码(文本文件)会被转换成可执行目标文件(二进制文件)。
这个转换由编译器程序完成,需要经历四个阶段:
- 预处理阶段:预处理器读取头文件的内容,将所有代码整合起来,得到完整的源代码
- 编译阶段:编译器将完整的源代码编译成汇编语言代码
- 汇编阶段:汇编器将汇编语言代码翻译成机器语言指令,然后打包成可重定位目标程序。
- 链接阶段:链接器将可重定位目标程序和预先编译好的目标文件链接起来,得到完整的可执行文件。
三、了解编译系统如何工作的益处
- 优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
四、处理器读并解释储存在内存中的指令
4.1、系统的硬件组成
- 总线:总线是贯穿整个系统的一组电子管道,负责在各个部件间传递信息字节。
- I/O设备:I/O设备是系统与外部世界的联系通道。常见I/O设备有鼠标、键盘、磁盘。每个I/O设备都通过一个控制器或适配器与I/O总线相连。
- 主存:主存是临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。主存是由一组动态随机存储器(DRAM)芯片组成的。
- 处理器:处理器是解释(或执行)存储在主存中指令的引擎。处理器内部的运行围绕程序计数器(PC)、寄存器文件、算术/逻辑单元(ALU)和主存展开。
4.2、运行hello程序
shell程序先将程序从磁盘逐一读入寄存器,再把它存放到内存中,如果使用直接存储器存取(DMA)技术,数据可以不通过处理器而直接从磁盘到达主存。
之后,处理器开始执行程序中的机器语言指令,并将结果从主存复制到寄存器,再从寄存器复制到显示设备并显示。
五、高速缓存至关重要
处理从寄存器文件中读取数据比从主存中读取数据几乎要快100倍,但是寄存器只能存储几百字节的信息。
在寄存器文件和主存之间构建高速缓存存储器(cache),让它存放经常访问的数据,可以加快处理器读取速度。
处理能力强的系统有三级高速缓存:L1、L2、L3,它们是用称为静态随机访问存储器(SRAM)的硬件技术实现的。
程序员可以利用高速缓存将程序的性能提高一个数量级。
六、存储设备形成层次结构
每个计算机系统中的存储设备都被组织成了一个存储器层次结构,在这个层次结构中,从上到下,设备的访问速度越来越慢、容量越来越大,并且每字节的造价也越来越便宜。
程序员可以利用对整个存储器层次结构的理解来提高程序性能。
七、操作系统管理硬件
操作系统可以被看成是应用程序和硬件之间插入的一层软件。
操作系统有两个基本功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。
7.1、进程
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
并发运行就是指一个进程的指令和另一个进程的指令是交错执行的。操作系统实现这种交错执行的机制称为上下文切换。
上下文是指进程运行所需的所有状态信息,包括PC和寄存器文件的当前值,以及主存的内容。
操作系统内核来管理从一个进程到另一个进程的转换,即执行上下文的切换。
7.2、线程
一个进程可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
多线程之间比多进程之间更容易共享数据,线程一般来说都比进程更高效。
7.3、虚拟内存
虚拟内存为每个进程提供了假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。
虚拟地址空间由大量准确定义的区构成,每个区都有专门的功能:
- 程序代码和数据区 —— 直接按照可执行目标文件的内容初始化的
- 堆 —— 调用像malloc和free这样的C标准库函数时,堆可以在运行时动态地扩展和收缩
- 共享库 —— 用于存放像C标准库和数学库这样的共享库的代码和数据
- 栈 —— 编译器用它来实现函数调用,和堆一样,在程序执行期间可以动态地扩展和收缩
- 内核虚拟内存 —— 保留给操作系统中的代码和数据
7.4、文件
文件就是字节序列。每个I/O设备都可以看成是文件。
文件向应用程序提供了一个统一的视图,来看待系统中可能含有的所有各式各样的I/O设备。
八、系统之间利用网络通信
系统和系统之间可以通过网络连接在一起,从一个系统来看,网络可视为I/O设备,系统可以往里写、读数据。
telnet应用建立了telnet客户端和telnet服务器端的数据传输和交流。
九、重要主题
9.1、Amdahl定律
Amdahl定律揭示了系统的某个部分性能提升程度与相应的系统整体性能提升程度的差异。
推导过程:
系统整体执行所需时间为,系统某部分执行所需时间为
,则系统该部分执行所需时间与系统整体执行所需时间的比例为
,
。
系统该部分性能得到提升后所需的执行时间为,该部分初始所需时间为
=
,则该部分性能提升比例为k,k =
/
=
/
。
系统该部分性能提升后,系统整体执行所需时间为,
= (
-
) +
。
现在已知,
,k,则
= (
-
) +
/ k =
[(1 -
) +
/ k]。
加速比为S = /
= 1 / [(1 -
) +
/ k]
Amdahl定律的主要观点:要想显著加速整个系统,必须提升全系统中相当大的部分的速度。
习题:
这里的整个行程时间25小时就相当于。
针对问题A,(150公里/小时) / (100公里/小时) = 1.5就相当于k,1500公里 / 2500公里 = 0.6 就相当于,代入上面的公式得到答案整个行程的加速比是1.25。
针对问题B,加速比S为1.67,为0.6,带入公式可得k约为2.7,所以必须以2.7 * 100 = 270公里/小时的速度通过蒙大拿州
9.2、并发和并行
并发指一个同时具有多个活动的系统。并行指的是用并发来使一个系统运行得更快。
①线程级并发
并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换来实现的。
单处理器系统是指由单个处理器来完成并发任务,多处理器系统是指由多个处理器来共同完成并发任务,多处理器系统中每个处理器都有自己的L1、L2高速缓存,同时多个处理器间共享更高层次的高速缓存,例如L3。
多处理的使用可以从两方面提高系统性能:
- 减少了在执行多个任务时模拟并发的需要。
- 可以使程序运行得更快
②指令级并行
现代处理器可以同时执行多条指令的属性称为指令级并行
③单指令、多数据并行
现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据(SIMD —— Single Instruction Multiple Data)。
9.3、计算机系统中抽象的重要性
抽象的目的是为了提供对系统中不同层次的简单表示,来隐藏实际实现的复杂性。
计算机系统中的主要抽象有:
- 文件 —— I/O设备的抽象
- 虚拟内存 —— 主存和I/O设备的抽象,即对程序存储的抽象
- 指令集架构 —— 对处理器的抽象
- 进程 —— 对处理器、主存和I/O设备的抽象,即对一个正在运行的程序的抽象
- 虚拟机 —— 对整个计算机的抽象,包括操作系统、处理器和程序