计算机系统漫游
信息就是 位 + 上下文
看下面一串代码hello.c,它实际上就是一系列二进制序列。
1
2
3
4
int main() {
printf("hello, world\n");
return 0;
}
大部分的现代计算机系统都使用ASCII标准来表示文本字符,ASCII标准用一个字节(8bit)来表示每个字符。
hello.c程序是以字节序列的方式存储在文件中的。
程序被其他程序翻译成不同的格式
在操作系统上,更低级的语言来将代码转换为机器可识别的指令,然后这些指令按照一种称为「可执行目标程序」的格式打包好,并以二进制磁盘文件的形式存放起来。
Unix系统中,该代码的执行流程为:
- 预处理阶段
- 编译阶段:将程序翻译为汇编代码
- 汇编阶段:将汇编代码翻译为机器语言指令
- 链接阶段:合并一些需要的目标文件,比如printf函数存在一个单独的预编译好了的目标文件中,链机器就负责合并它。最后就得到了一个可执行的目标文件,就可以加载到内存中,由系统执行
处理器读并解释存储在内存中的指令
系统的硬件构成
为了理解运行hello程序时发生了什么,我们需要了解一个典型系统的硬件知识。
- 总线:
- 贯穿整个系统的一组电子管道,称为总线,它携带信息字节并负责在各个部件间传递。
- 通常总线被设计为传送定长的字节,这是一个基本的系统参数。平时说的32位机器就是4个字节,64位机器就是8个字节。
- I/O 设备:
- IO(input/output)设备就是系统与外部世界的联系通道,比如键盘、鼠标、硬盘、显示器等。
- 每个IO设备都通过一个适配器与IO总线相连,
- 主存(main memory):主存是一个临时存储设备,也就是我们平时说的内存。主存用于在执行程序时,用来存放程序和其所需的数据。主存物理上来说是由一组动态随机存取存储器(DRAM)组成的。
- 处理器:CPU,是解释或执行存储在主存中的指令的引擎,包含了寄存器和ALU、PC(程序计数器)
高速缓存至关重要
程序运行的时候,涉及到磁盘、主存和CPU之间数据的传输。
根据机械原理,较大的存储设备要比小的存储设备运行的慢,而快速运行的设备造价高于同类的低速设备。
从磁盘拿数据相对于从主存中是较慢的,这个可能差了1000万倍;从主存中读数据相对于从寄存器中读慢了100倍,这类差异使得系统的设计需要更小更快的存储设备,这个设备就是高速缓存存储器(cache memory)
, 它被放在CPU芯片中作为主存和寄存器的中间层来加速数据的访问。
这种系统设计思路总结就是:上一层的存储器作为低一层存储器的高速缓存。
操作系统管理硬件
所有应用程序对硬件的操作都必须通过操作系统。 操作系统有两个基本功能:
- 防止硬件被失控的程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
操作系统通过几个基本的抽象概念实现了这两个功能:
- 文件是对I/O设备的抽象表示
- 虚拟内存是对主存和磁盘I/O设备的抽象表示
- 进程是对处理器、主存和I/O设备的抽象表示
进程
进程是操作系统对一个正在运行的程序的一种抽象,在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
无论是单核还是多核,一个CPU看上去都是在并发地执行多个进程,这是通过cpu在进程间切换来实现的。操作系统把这种交错执行的机制称为上下文切换。
操作系统保持跟踪进程所需要的所有状态信息,这种状态就是上下文,比如寄存器文件的当前值、程序计数器和主存的内容。
线程
一个进程可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,共享同样的数据。
虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占的使用内存。 每个进程看到的内存都是一致的,称为虚拟内存空间。
基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。
文件
文件就是字节序列,仅此而已。
每个IO设备,都可以看作文件,
系统之间利用网络通信
网络可以视为一个I/O设备