第一章 计算机系统漫游
1.1 信息就是位 + 上下文
计算机中信息其实都是由0和1所组成的串,0和1就是比特,也叫位。而计算机为了识别这些01串所表达的意思,也就需要区分不同数据对象,唯一的方法就是靠数据对象的上下文。
1.2 程序被其他程序翻译成不同的格式
- 预处理阶段:预处理器(cpp)识别以字符 # 开头的命令。比如导入头文件时,将头文件中的文件内容插入程序文本中,得到以
.i 作为文件拓展名的文件。 - 编译阶段:编译器(ccl)将
.i 文件翻译成 .s 文件,此时为汇编程序。 - 汇编阶段:汇编器(as)将
.s 文件翻译成机器语言指令,把这些指令打包成一种叫做可重定位目标程序的格式,并将结果保存在目标文件 .o 中,此时为二进制文件。 - 链接阶段:比如源程序调用了printf函数,printf函数存在于一个名为
printf.o 的单独的预编译好的目标文件中,链接器将其与我们自己的 .o 文件进行合并。
1.3 了解编译系统如何工作是大有益处的
1.4 处理器读并解释储存在内存中的指令
1.4.1 系统的硬件组成
- 总线:贯穿整个系统的一组电子管道。它携带信息字节并负责在各个部件之间传递。
- I/O设备:系统与外界的联系通道。
- 每个I/O设备都通过一个控制器或适配器与I/O总线相连。
- 控制器和适配器都是用于在I/O总线与I/O设备之间传递信息。
- 控制器和适配器之间的区别主要在于它们的封装方式。控制器是I/O设备本身或者系统的主印制电路板(通常称作主板)上的芯片组。适配器则是一块插桩主板插槽上的卡。
- 主存:物理上来说,**主存是由一组DRAM芯片组成的。**逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),这些地址是从零开始的。
- 处理器:解释(或执行)存储在主存中的指令的引擎。其核心是一个大小为一个字的寄存器——程序计数器(PC)。
1.4.2 运行hello程序
- 键盘输入"./hello"后,shell程序将字符逐一读入寄存器,再把它存放在内存中。
- 键盘输入回车键后,shell程序利用直接存储器存取(DMA)将hello目标文件中的代码和数据从磁盘加载到主存。
- 处理器开始执行hello程序的main程序中的机器语言指令,将"hello, world\n"字符串中的字节从主存复制到寄存器文件中,再从寄存器文件中复制到显示设备,最终显示在屏幕上。
1.5 高速缓存至关重要
为解决处理器与主存之间速度的差异,系统设计者采用了高速缓存存储器(cache),该存储器是一种用SRAM的硬件技术实现的。
1.6 存储设备形成层次结构
1.7 操作系统管理硬件
操作系统有两个基本功能:(1)防止硬件被失控的应用程序滥用;(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
文件是对I/O设备的抽象表示,虚拟内存是对主存和磁盘I/O设备的抽象表示,进程则是对处理器、主存和I/O设备的抽象表示。
1.7.1 进程
进程是操作系统对一个正在运行的程序的一种抽象。上下文是操作系统保持跟踪进程运行所需的所有状态信息。一个系统上可以通过上下文切换机制实现并发运行,也就是一个进程的指令与另一进程指令交错执行。
内核是操作系统代码常驻主存的部分,管理着一个进程到另一个进程的转换。
1.7.2线程
一个进程实际上可以有多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
1.7.3 虚拟内存
虚拟内存时对程序存储器的抽象。
虚拟内存的基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
虚拟内存为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,成为虚拟地址空间。
每个进程看到的虚拟地址空间由大量准确定义的区构成。
- 程序代码和数据
- 堆
- 共享库
- 栈
- 内核虚拟内存:地址空间顶部的区域是为内核保留的。不允许应用程序读写这个区域的内容或直接吊哦用内核代码定义的函数。相反,它们必须调用内核来执行这些操作。
1.7.4 文件
每个I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。系统中的所有输入输出都是通过使用一小组称为 Unix I/O 的系统函数调用读写文件来实现的。
1.8 系统之间利用网络通信
从一个单独的系统来看,网络可视为一个I/O设备。系统从主存复制一串字节到网络适配器,数据流经过网络到达另一台机器,相似地,系统可以读取从其他机器发来的数据,并把数据复制到自己的主存。
1.9 重要主题
1.9.1 Amdahl 定律
系统执行某应用程序需要时间To, 假设系统某部分所需执行时间和该时间的比例为a,而该部分性能提升比例为k。因此,总执行时间为:
T
n
=
(
1
?
a
)
T
o
+
(
a
T
o
)
/
k
=
T
o
[
(
1
?
a
)
+
a
/
k
]
T_n = (1-a)T_o + (aT_o)/k = T_o[(1-a) + a/k]
Tn?=(1?a)To?+(aTo?)/k=To?[(1?a)+a/k] 加速比:
S
=
1
(
1
?
a
)
+
a
/
k
S = {1\over (1-a) + a/k}
S=(1?a)+a/k1?
1.9.2 并发和并行
-
线程级并发 -
指令级并行 在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令级并行。最近的处理器可以保持每个始终周期2~4条指令的执行效率。如果处理器可以达到比一个周期一条指令更快的执行效率,就称之为超标量处理器。 -
单指令、多数据并行 允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即SIMD并行。 行效率。如果处理器可以达到比一个周期一条指令更快的执行效率,就称之为超标量处理器。 -
单指令、多数据并行 允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据,即SIMD并行。
|