Content
1.1 信息就是位 + 上下文
hello 程序的生命周期是从一个源程序(或者说是源文件)开始的。源程序由 0 和 1 组成的位(bite
),8 个位为一个字节。
hello.c
的ASCII
文本表示
# | i | n | c | l | u | d | e | SP | < | s | t | d | i | o | . | h | > |
---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|---|
35 | 105 | 110 | 99 | 108 | 117 | 100 | 101 | 32 | 60 | 115 | 116 | 100 | 105 | 111 | 46 | 104 | 62 |
\n | \n | i | n | t | \n | m | a | i | n | ( | ) | \n | { | \n | SP | SP | SP |
10 | 10 | 105 | 110 | 116 | 10 | 109 | 97 | 105 | 110 | 40 | 41 | 10 | 123 | 10 | 32 | 32 | 32 |
SP | p | r | i | n | t | f | ( | “ | h | e | l | l | o | , | SP | w | o |
32 | 112 | 114 | 105 | 110 | 116 | 102 | 40 | 34 | 105 | 101 | 108 | 108 | 111 | 44 | 32 | 119 | 111 |
r | l | d | \ | n | “ | ) | ; | \n | SP | SP | SP | SP | r | e | t | u | r |
114 | 108 | 100 | 92 | 110 | 34 | 41 | 59 | 10 | 32 | 32 | 32 | 32 | 114 | 110 | 116 | 117 | 114 |
n | SP | 0 | ; | \n | } | \n | |||||||||||
110 | 32 | 48 | 59 | 10 | 125 | 10 |
1.2 程序被其他程序翻译成不同版本
在Unix系统上,从源文件到目标文件的转化是由 编译器驱动程序 完成的。
Linux$ gcc hello.c -o hello
编译执行四个阶段
预处理
读取头文件,修改源程序。
编译阶段
翻译成文本hello.s,其中包含汇编语言程序。main函数如下:
1 main:
2 subq $8, %rsp
3 movl $.LC0, %edi
4 call puts
5 movl $0, %eax
6 addq $8, %rsp
7 ret
汇编阶段
翻译成机器语言hello.o
文件。
链接阶段
合并其他库函数文件到hello
文件中(这里指printf.o
文件)。
1.4 处理器读并解释储存在内存中的指令
linux$ ./hello
hello, world
linux$
1.4.1 系统的硬件组成
1. 总线
贯穿整个系统的是一组电子管道,称作总线。
2. I/O 设备
I/O (输入/输出)设备是系统与外部世界的联系通道。
3. 主存
主存是一个临时存储设备(动态随机存取存储器DRAM
芯片组成),在CPU
执行程序时,用来存放程序和程序处理的数据。
4. 处理器
中央处理单元(CPU
),简称处理器,是解释(或者执行)存储在主存中指令的引擎。
1.4.2 运行 hello 程序
1.5 高速缓存至关重要
1.6 存储设备形成层次结构
1.7 操作系统管理硬件
操作系统有两个基本功能:
(1)防止硬件被失控的应用程序滥用;
(2)向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
1.7.1 进程
进程是操作系统一个正在运行的程序的抽象。而并发运行,则是说一个进程的指令和另一个进程的指令是交错执行的。
操作系统保持跟踪进程运行所需的所有状态信息。这种状态称为上下文。
1.7.2 线程
一个进程可以由多个线程的执行单元组成。
1.7.3 虚拟内存
虚拟内存是一个抽象概念,其为每个进程提供一个假象,即每个进程都在独占地使用主存。
每个进程看到的内存都是一致的,称为虚拟地址空间。
几个概念:
程序代码和数据。
堆。
共享库。
栈。
内核虚拟内存。
1.7.4 文件
文件就是字节序列。
1.9 重要主题
1.9.1 Amdahl 定律
若系统执行某应用程序需要时间为Told
。 假设系统某部分所需执行时间与该时间的比例为a
, 而该部分性能提升比例为k
。即该部分初始所需时间为a * Told
, 现在所需时间为(a * Told)/ k
。因此,总的执行时间应为:
Tnew = (1 - a) * Told + (a * Told) / k = Told * [(1 - a) + a / k ]
由此,可以计算加速比 S = Told / Tnew
为
S = 1 / [(1 - a) + a / k ]
1.9.2 并发和并行
并发指一个同时具有多个活动的系统。
并行指用并发来使一个系统运行的更快。
超线程有时称为同时多线程(simultaneous multi-threading
),是一项允许一个CPU执行多个控制流的技术。
指令级并行在较低的抽象层次上,现代处理器可以同时执行多条指令的属性。
超标量(super-scalar
)处理器是指处理器可以达到比一个周期一条指令更快的执行速率。
单指令、多数据(SIMD
并行)指在最低层次上,拥有特殊的硬件的处理器,允许一条指令产生多个可以并行执行的操作。
1.9.3 计算机系统中抽象的重要性
抽象的使用是计算机科学中最为重要的概念之一。
例如: 应用程序接口(API
)。
例如:指令集架构提供了对实际处理器硬件的抽象。
1.10 小结
计算机系统是由硬件和系统软件组成的,他们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位(bite),他们依据上下文有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和链接器翻译成二进制的可执行文件。
处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间在内存、I/O 设备和CPU寄存器之间复制数字,所以将系统中的存储设备划分为层次结构——CPU寄存器在顶部,接着是多层的硬件高速缓存存储器、DRAM主存和硬盘存储器。在层次模型中,位于更高层的存储设备比底层的存储设备要更快,单位比特造价也更高。层次结构中较高层次的存储设备可以作为较低层次设备的高速缓存。通过理解和运用这种存储层次结构的知识,程序员可以优化C程序的性能。
操作系统内核是应用程序和硬件之间的媒介。它提供三个抽象: 1)文件是对 I/O 设备的抽象; 2) 虚拟内存是对主存和硬盘的抽象; 3) 进程是处理器、主存和 I/O 设备的抽象。
最后,网络提供了计算机系统间通信的手段。从特殊系统的角度来看,网络是一种 I/O 设备。