执行程序系统
编译系统
- 从源代码文本文件到可执行目标文件的转化由编译系统(compilation system)完成
- 预处理器(cpp):hello.c —> hello.i
- 根据以字符
#
开头的指令修改原始程序
- 根据以字符
- 编译器(cc1):hello.i —> hello.s
- 将预处理之后的文本文件翻译为汇编语言程序(依然是文本文件)
- 汇编器(as):hello.s —> hello.o
- 将汇编语言程序翻译成一系列机器语言指令,然后将机器语言指令打包成可重定位目标程序
- 链接器(ld):hello.o + printf.o —> hello
- 将程序用到的其他模块与当前程序链接到一起,最终得到可执行目标文件
- 预处理器(cpp):hello.c —> hello.i
程序计数器 PC
- 程序计数器为一个字长(64 位系统中是 8 个字节)的存储设备,是 CPU 的核心
- 在任何时刻,PC 都指向内存中的某条机器语言指令,也就是说,PC 中保存着一条机器语言指令的地址
- CPU 不断地执行 PC 指向的指令,然后更新 PC,使其指向下一条指令(前后指令不一定相邻)
存储器层次结构
- L0:CPU 寄存器
- L1 ~ L3:L1 ~ L3 高速缓存(SRAM,静态随机访问存储器)
- L4:主存(DRAM,动态随机访问存储器)
- L5:本地磁盘
- L6:远程存储设备(分布式文件系统、Web 服务器)
局部性原理
- 程序具有访问局部区域里的数据的趋势
操作系统抽象
进程:对处理器、主存和 I/O 设备的抽象
- 处理器在多个进程间快速切换,称为上下文切换
- 单处理器在任一时刻只能执行一个进程的代码
- 当操作系统把控制权从一个进程转移到另一个进程时,便进行上下文切换:
- 保存当前进程的上下文
- 恢复新进程的上下文
- 将控制权转移到新进程
线程
- 一个进程可以由多个线程组成,每个线程都运行在进程的上下文中,并共享相同的代码和全局数据
- 线程一般比进程高效,多线程之间共享数据也比进程之间容易
虚拟存储器:对主存和磁盘 I/O 的抽象
- 每个进程使用专有的虚拟地址空间,从而形成每个进程独占主存的假象
- 每个进程看到的虚拟地址空间由一组准确定义的区构成,从低地址到高地址依次为:
- 程序代码和数据
- 运行时堆
- 共享库
- 用户栈
- 内核虚拟存储器
文件:对 I/O 设备的抽象
- 文件就是字节序列,别无其他
- 每个 I/O 设备都可视为文件
- 系统的所有输入输出都通过一组 Unix I/O 系统函数调用读写文件来实现
信息存储
字
- 任一计算机的字长指明了整数和指针数据的标称大小
- 字长决定了虚拟地址空间的最大大小,对于字长为 w