第1章 计算机系统漫游
1. 信息
源程序是由0和1组成的位(bit)序列,8个位组成一个字节。大部分现代系统都用ASCII标准来表示文本字符。
- 文本文件
- 二进制文件
2. 编译过程
为运行hello.c程序,每条C语句都需要转化为一系列低级机器语言指令。这些指令按照可执行目标程序的格式打好包,并以二进制磁盘文件的形式存放,目标程序也称为可执行目标文件。
unix> gcc -o hello hello.c
编译系统包括四个阶段:
- 预处理阶段:如hello.c中#include <stdio.h>命令告诉预处理器读取系统头文件stdio.h的内容,并将它直接插入到程序文本中。
- 编译阶段:编译器将文本文件hello.i翻译成文本文件hello.s,它包含一个汇编语言程序。
- 汇编阶段:汇编器将hello.s翻译成机器语言指令,把这些程玲打包在可重定位目标程序,并将结果保存在目标文件hello.o中。
- 链接阶段:hello程序调用了printf函数。printf函数存在于一个名为printf.o的单独的预编译好了的目标文件中,而这个文件必须合并到我们的hello.o程序中。链接器负责这种合并,得到hello文件,它是可执行目标文件,可以被加载到内存中,由系统执行。
3.处理器读并解释存储在存储器中的指令
hello.c经过编译得到可执行文件hello后。在unix系统中运行它,需要将它输入到shell中,shell会加载并运行这个文件。
3.1 系统硬件组成
- 总线:通常被设计为传送定长的字节块(也就是字);
- I/O设备
- 主存:是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。逻辑上讲,存储器是一个线性的字节数组,每个字节都有其唯一的地址,这些地址是从零开始;
- 处理器(CPU):其核心是一个字长的存储设备(或寄存器),称为程序计数器(PC)。PC指向主存中的某条机器语言指令(即含有该指令的地址)。处理器不断执行程序计数器指向的指令,在更新程序计数器,使其指向下一条指令。
除以上外,通常还包括高速缓存。
3.2 运行hello程序
unix> ./hello
shell加载可执行文件hello,将hello中的代码和数据从磁盘复制到主存。之后,处理器开始执行hello程序的main中的机器语言指令。这些指令将“hello world\n”字符串中的字节复制到寄存器文件,再从寄存器文件复制到显示设备,最终显示在屏幕上。
3.3 存储设备层次结构
寄存器文件在层次结构中位于最顶部,记为L0。寄存器文件是L1的高速缓存,L1是L2的高速缓存,…,L3是主存的高速缓存,而主存又是磁盘的高速缓存。
4. 操作系统管理硬件
操作系统可看成应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作都需要通过操作系统。操作系统的几个基本的抽象概念:进程,虚拟存储器和文件。
4.1 进程
进程就是一个正在运行的程序。在一个系统上可以同时运行多个进程,每个进程都好像独占使用硬件。并发运行,是指一个进程的指令和两一个进程的指令是交错执行的。
在单核或多核系统中,一个CPU看上去都像是在并发地执行多个进程,这是通过处理器在进程间切换来实现的。操作系统实现这种交错执行的机制称为上下文切换。
操作系统保持跟踪进程所需的所有状态信息(也就是上下文),它包括很多信息,例如PC和寄存器文件的当前值,以及主存的内容。单处理器只能执行一个进程的代码。当操作系统要把控制权从当前进程切换到新进程时,就会进行上下文切换,即保存当前进程的上下文、恢复新进程的上下文,然后将控制权传递到新进程,新进程就会从上次停止的地方开始。
4.2 线程
每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程比多进程更容易共享数据,线程一般也比进程更高效。
4.3 虚拟存储器
虚拟存储器为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的是一致的存储器,称为虚拟地址空间。下图是Linux进程的虚拟地址空间。图中地址从下往上增大。
虚拟地址从低往上:
- 程序代码和数据:对所有进程来说,代码是从同一固定地址开始,紧接着是和C全局变量相对应的数据位置。代码和数据区是按照可执行文件的内容初始化的。
- 堆:代码和数据区是进程一开始运行时就被规定了大小,而当调用malloc或free函数时,堆可以在运行时动态地扩展和收缩。
- 共享库:存放像C标准库和数学库这样共享库的代码和数据。
- 栈:编译器用栈来实现函数调用。栈在程序执行期间也可以动态扩展和收缩。当调用一个函数时,栈就会增长,从一个函数返回时,栈就会收缩。
- 内核虚拟存储器:地址空间顶部视为内核保留的。
每台计算机都有一个字长。因虚拟地址是以这样的一个字来编码的,所以字长决定了虚拟地址空间的最大大小。对一个字长为w位的机器而言,虚拟地址的范围是0~2w-1,程序最多访问2w个字节。32位计算机的虚拟地址空间为4GB。
程序存储器用虚拟地址来寻址。操作系统负责管理虚拟地址空间,将虚拟地址翻译成实际处理器存储中的物理地址。
4.4 文件
文件就是字节序列。每个I/O设备,包括磁盘、键盘、显示器、甚至网络,都可以视为文件。
5. 系统之间通过网络通信
网络可视为一个I/O设备。