深入理解计算机系统结构_ch1
第1章 计算机系统漫游
1.1 信息就是位+上下文
1.2 程序被其他程序翻译成不同的格式
1.3 了解编译系统如何工作是大有益处的
1.4 处理器读并解释储存在内存中的指令
1.5 高速缓存至关重要
1.6 储存设备形成层次结构
1.7 操作系统管理硬件
1.8 系统之间利用网络通信
1.9 重要主题
1.10 小结
1.1 信息就是位+上下文
- hello程序的生命周期是从一个
源程序
开始的,即程序员通过编辑器创建并保存的文本文件,文件名hello.c。源程序实际上就是一个由值0和1组成的位序列。hello.c程序是以字节序列的方式储存在文件中。像hello.c这样只由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
- 大部分现代计算机系统都使用ASCII标准来表示文本字符。
- 系统中所有的信息都是由一串比特表示的。
- 作为程序员,需要了解数字的机器表示方法,因为它们与实际的整数和实数是不同的。它们是对真值的有限近似值。
1.2 程序被其他程序翻译成不同的格式
gcc编译器驱动程序,编译系统Linux> gcc -o hello hello.c
-
预处理阶段.
hello.c -> hello.i.
预处理器cpp根据以字符#开头的命令,修改原始的C程序。读取头文件,插入程序文本中,得到另一个C程序,以.i
作为文件扩展名。 -
编译阶段.
hello.i -> hello.s.
编译器ccl将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序
。 -
汇编阶段.
hello.s -> hello.o.
汇编器as将hello.s翻译成机器语言指令,把这些指令打包成可重定位的目标程序
,并将结果保存在目标文件hello.o中。hello.o文件是一个二进制文件。 -
链接阶段.
hello.o -> hello.
链接器ld负责将printf函数单独预编译的printf.o和hello.o程序合并,得到hello文件,是可执行目标文件,可以被加载到内存中,由系统执行。
1.3 了解编译系统如何工作是大有益处的
了解编译系统工作机制,可
- 优化程序性能。
- 理解链接时出现的错误。
- 避免安全漏洞。
1.4 处理器读并解释储存在内存中的指令
-
hello.c 源程序已经被
编译系统
翻译成可执行的目标文件hello,并存储在磁盘上。执行linux> ./hello
-
典型的系统硬件组织
-
总线.
携带信息字节并负责在各个部件间传递。字,字中的字节数是字长。 -
I/O设备.
系统与外部世界的联系通道。每个I/O设备通过一个控制器
或适配器
与I/O总线相连。控制器
和适配器
之间的区别主要在于它们的封装方式。控制器是I/O设备本身或者系统的主印制电路板(主板)上的芯片组,而适配器时一块插在主板插槽上的卡。功能都是在I/O总线和I/O设备之间传递信息。 -
主存.
临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上来说,主存是由一组动态随机存取存储器(DRAM)芯片组成的
;从逻辑上来说,存储器是一个线性的字节数组
,每个字节都有其唯一的地址(数组索引),地址从零开始。 -
处理器.
中央处理单元(CPU),简称处理器,是解释(或执行)存储在主存中指令的引擎。核心是一个大小为一个字存储设备(或寄存器),称为程序计数器(PC)
。PC任何时候都指向主存中某条机器指令。不断更新程序计数器,指向下一条指令。寄存器文件
是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。加载:从主存到寄存器、存储:从寄存器到主存、操作:寄存器到寄存器、跳转:到PC
。 -
运行hello程序。
- 键盘输入字符,shell程序将字符逐一读入寄存器,再存放到内存中。
- 将hello目标文件中的代码和数据从磁盘复制到主存,利用
直接存储器存取(DMA)
技术,数据可以不通过处理器直接从磁盘到主存。 - 处理器执行机器语言指令,将结果字符串“hello, world\n”中字节从主存复制到器存起文件,再从寄存器文件复制到显示设备。
1.5 高速缓存至关重要
- 根据机械原理,较大的存储设备要比较小的存储设备运行得慢,而快速设备的造价远高于同类的低速设备。
- 针对处理与主存之间的差异,设计
高速缓存存储器
。 - 高速缓存是用
静态随机访问存储器(SRAM)
的硬件技术实现的。 - 利用高速缓存的
局部性
原理。
1.6 储存设备形成层次结构
- 存储器层次结构。
1.7 操作系统管理硬件
-
进程
是操作系统对一个正在运行的程序的抽象。处理器在进程间切换,操作系统实现这种交错执行的机制称为上下文切换
,保存当前进程的上下文,恢复新进程的上下文。通过系统调用
将控制权传递给操作系统。进程转换是由系统内核
管理的,内核是操作系统代码常驻主存的部分,不是一个独立的进程,是系统管理全部进程所用的代码和数据结构的集合 -
线程.
一个进程由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同意的代码和全局数据。 -
虚拟内存.
一个抽象概念,为每个进程提供一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。最上面的区域是保留给操作系统中的代码和数据的,所用进程都是一样的。底部区域存放用户进程定义的代码和数据。程序代码和数据:对所有进程,代码从同一固定位置开始。代码和数据区是直接按照可执行目标文件的内容初始化的
堆:代码和数据区在进程已开始运行时就指定来大小,当调用malloc和free这样的c标准库函数时,堆可以在运行时动态的扩展和收缩
共享库:地址空间中间部分是一块用来存放像C标准库和数据库这样的共享库的代码和数据的区域
栈:位于用户虚拟空间顶部的是用户栈,编译器用它来实现函数调用,可以动态扩展和收缩
内核虚拟内存:地址空间顶部的区域是为内核保留的
-
文件
就是字节序列。每个I/O设备都可以看成是文件。
1.8 系统之间利用网络通信
- 网络可视为一个I/O设备,通过网络适配器。
1.9 重要主题
-
Amdahl定律
Amdahl定律主要观点:想要显著加速整个系统,必须提升全系统中相当大的部分的速度。 -
并发和并行.
1.线程级并发.
2.指令级并行.
流水线,超标量处理器(比一个周期一条指令更快的执行速率)。3.单指令、多数据并行.
SIMD -
计算机系统中抽象的重要性.
文件
是对I/O设备的抽象,虚拟内存
是对程序存储器的抽象,进程
是对正在运行的程序的抽象,虚拟机
是对整个计算机的抽象。