- 1.信息就是位+上下文
- 2.程序被其他程序翻译成不同的格式
- 3.了解编译系统如何工作是大有益处的
- 4.处理器读并解释储存在内存中的指令
- (1)系统的硬件组成
- (2)运行hello程序
- 5.高速缓存至关重要
- 6.存储设备形成层次结构
- 7.操作系统管理硬件
- 8.系统之间利用网络通信
- 9.重要主题
深入理解计算机系统读此书是为了今后在编程或者开发过程中能让自己在代码的世界享受进去,CSAPP系列是基于博主自身阅读理解总结的,可以说是学习笔记。 1.信息就是位+上下文
#includeint main(){ printf("hello,worldn"); return 0; }
以上hello程序的生命周期是从一个源程序(源文件)开始的,源程序是一系列人类可读的计算机语言指令,常常通过编辑器创建保存的一种文本文件,源程序通过编译转化成计算机程序,是由值0和1组成的位(比特),8个位一组称为字节。对于电脑或硬盘机而言,有效的信息只有0和1两种。
计算机系统一般使用ASCII标准来表示文本字符,实际上就是用一个唯一的单字节大小的整数值来表示每个字符。
一个同样的字节序列可能表示一个整数、浮点数、字符或者机器指令,可以通过读到这些数据对象的上下文进行区分该对象的数据类型。
为了在系统上运行hello.c程序,每条C语句都必须被其他程序转化为一系列的低级机器语言指令,然后这些指令按照一种称为可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放起来,目标程序也称可执行目标文件。
在Unix系统种,源文件到目标文件是由编译器驱动程序完成转化的:
linux> gcc -o hello hello.c
编译驱动程序读取hello.c,把它翻译成一个可执行的目标文件hello,通过四个阶段(预处理器、编译器、汇编器和链接器),这四个阶段构成了编译系统。
预处理阶段:
- (1) 文件包含:把源程序中的#include扩展为文件正文,即把包含的。h文件找到并展开的#include所在处。
- (2)条件编译:预处理器根据#if和#ifdef等编译命令及气候的条件,将源程序中的某部分包含进来或排除在外,通常把排除在外的语句转换成空行。
- (3)宏展开:预处理器将源程序文件中出现的对宏的引用展开成相应的宏定义,即#define的功能,由预处理器来完成。
编译阶段:
一个编译器的各个步骤:
汇编阶段:
将hello.s翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件hello.o中,hello.o是一个二进制文件,它包含的17个字节是函数main的指令编码。
链接阶段:
链接是将各种代码和数据部分收集起来并合并为一个单一文件的过程,该文件最后被加载到存储器中并运行。
了解编译系统的好处:
- (1)优化程序性能
- (2)理解链接时出现的错误
- (3)避免安全漏洞
- a、总线
贯穿整个系统的一组电子管道,它携带信息字节并负责在各部件间传递,通常总线被设计成传送定长的字节块,也就是字。按照计算机所传输的信息种类,计算机的总线可以划分为数据总线、地址总线和控制总线,分别用来传输数据、数据地址和控制信号。总线是一种内部结构,它是cpu、内存、输入、输出设备传递信息的公用通道,主机的各个部件通过总线相连接,外部设备通过相应的接口电路再与总线相连接,从而形成了计算机硬件系统。 在计算机系统中,各个部件之间传送信息的公共通路叫总线,微型计算机是以总线结构来连接各个功能部件的。 - b、I/O设备
管理和控制计算机的所有输入/输出设备(I/O设备)是操作系统的主要功能之一,主要分为字符设备和块设备。一般由机械和电子两个部分组成。作为输入的鼠标和键盘,作为输出的显示器,以及用作长期存储数据和程序的磁盘驱动器。 - c、主存
主存储器(Main memory),简称主存。是计算机硬件的一个重要部件,其作用是存放指令和数据,并能由中央处理器(CPU)直接随机存取。现代计算机是为了提高性能,又能兼顾合理的造价,往往采用多级存储体系。即由存储容量小,存取速度高的高速缓冲存储器,存储容量和存取速度适中的主存储器是必不可少的。主存储器是按地址存放信息的,存取速度一般与地址无关。32位(比特)的地址最大能表达4GB的存储器地址。这对多数应用已经足够,但对于某些特大运算量的应用和特大型数据库已显得不够,从而对64位结构提出需求。 - d、处理器
中央处理器(CPU),是电子计算机的主要设备之一,电脑中的核心配件。其功能主要是解释计算机指令以及处理计算机软件中的数据。CPU是计算机中负责读取指令,对指令译码并执行指令的核心部件。中央处理器主要包括两个部分,即控制器、运算器,其中还包括高速缓冲存储器及实现它们之间联系的数据、控制的总线。
- 键盘输入hello,shell程序(Shell是一种具备特殊功能的程序, 它是介于使用者和 UNIX/linux 操作系统之核心程序(kernel)间的一个接口)将字符足以读入寄存器,再把它放到内存中。
- 敲回车键,shell的程序知道已经结束命令输入,便执行一系列指令加载可执行的hello文件,这些指令将hello文件中的代码和数据从磁盘复制到主存。
- 处理器开始执行hello程序的main程序中的机器语言指令,这些指令将输入字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备。
系统把信息从一个地方挪到另一个地方,这种复制操作会产生开销,往往从处理器的角度而言,从磁盘驱动器上读取一个字的时间开销要比从主存中读取的开销大1000万倍,处理器从寄存器文件中读取数据比从主存中读取几乎要快100倍。根据处理器与主存之间的差异,设计出了更小更快的存储设备,称为高速缓存存储器(简称cache或高速缓存),作为暂时集结区域,存放处理器近期可能用到的信息。
在处理器和一个较大较慢的设备(如主存)之间插入一个更小更快的存储设备(如高速缓存)的想法已经称为一个普遍的观念。由此,每个计算机系统中的存储设备都被组织成了一个存储器层次结构。
操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
-
进程
进程是操作系统对一个正在运行的程序的一种抽象。在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。并发运行是指一个进程的指令和另一个进程的指令是交错执行的。
-
线程
在现代系统中,一个进程实际上可以由多个称为现成的执行单元组成。多线程之间比多进程之间更容易共享数据,一般来说,线程比进程更高效。 -
虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟内存空间。
图中的地址是从下往上增大的。 -
文件
文件就是字节序列。
从一个单独的系统来看,网络可视为一个I/O设备。
- Amdahl定律
定律的主要思想是当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度.
若系统执行某应用程序需要的时间为 .假设系统的某部分所需的执行时间与该随时间的比例为,而该部分系统性能提升比例为.即该部分初始所需时间为,现在所需时间为
因此,总的执行时间为:
由此,计算加速比
为:
可以看出Amdahl定律的主要观点——要想加速整个系统,必须提升全系统中相当大部分的速度.
-
并发和并行
(1) 线程级并发
-
单处理器
有了进程的抽象,可以设计出同时执行多个程序的系统,这也就导致了并发。
从出现分时(time-sharing)以来,计算机系统就有了对并发执行的支持。这种并发执行只是模拟出来的,是通过使一台计算机在它正在执行的进程间快速切换的方式实现的。这样即使处理器必须在多个任务间切换,大多数也是由一个处理器完成的。这个叫做单处理器系统。 -
多处理器
随着近来多核处理器和超线程(hyperthreading)的出现,导致了多处理器系统的存在。
使用线程,可以在一个进程中执行多个控制流。
多核处理器是将多个CPU(”核“)集成到一个集成电路芯片上。下面的图是Intel Core i7处理器的组织结构,其中微处理器芯片有4个CPU核,每个核都有自己的L1和L2的高速缓存,但是它们共享一个更高层次的高速缓存,以及到主存的接口。 -
超线程
超线程,有时候称为同时多线程(simultaneous multi-threading),是一项允许一个CPU执行多个控制流的技术。它涉及到CPU某些硬件有多个备份,比如程序计数器和寄存器文件;而其他的硬件部分只有一份,比如执行浮点运算的单元。常规的处理器需要大约20000个时钟周期做不同线程间的转换,而超线程的处理器可以再单个周期的基础上决定要执行哪一个线程(我个人的理解是因为有些硬件设备不止一份,所以不要进行保存上下文和恢复上下文的操作,只是在一个未使用的硬件设备上来执行一个新的线程)。这样使得CPU可以更好地利用它的处理资源。例如,假设一个线程必须等到某些数据被装载到高速缓存张,那么CPU就可以继续去执行另外一个线程。举例来说,Intel Core i7处理器可以让一个核执行两个线程,所以一个4核的系统实际上可以并行的执行8个线程。
(2) 指令级并行
利用流水线来使指令重叠并行执行,以达到提高性能的目的。
(3) 单指令、多数据并行
允许一条指令产生多个可以并行执行的操作。



