绪论
- 由编写的源代码转换到机器代码的过程,可以分为预编译阶段、编译阶段、汇编阶段和链接阶段。
- 预编译阶段:展开所有的宏定义,将宏名用对应的宏体进行替代;执行所有的预编译指令,如
#include
、#ifndef
等,并滤除所有的注释,并加入行号和文件标识, 生成.i文件。 - 编译阶段:将经过预编译阶段的代码转换为汇编代码,主要执行词义分析、语法分析、语义分析、代码优化、目标代码的生成与优化,生成.s文件。
- 汇编阶段:将汇编代码转换为机器代码,生成.o文件。
- 链接阶段:将用到的库(静态库、动态库)与.o文件进行链接,最终生成可执行文件(.exe/.out)。
进行汇编前的文件均为文本文件,而汇编后的文件则为二进制文件。前者是只由ASCII字符所构成的文件。
- 在linux系统中,通过
g++ -o hello hello.cpp
或g++ hello.cpp -o hello
即可实现整个编译过程并生成相应的可执行程序。对于shell而言,如果输入的第一个单词不是内置的shell命令,则会被解析为可执行文件的名字,系统会加载该可执行文件并运行。
- 系统的硬件组成
- 总线:贯穿整个系统的一组电子管道,负责携带信息字节并在各个部件间传递,通常设计为传送定长的字节块。
- I/O设备:系统与外部的连接
- 主存:用于存放程序和程序处理的数据,由一组动态随机存取存储器(DRAM)芯片组成。
- 处理器:负责解释(或执行)存储在主存中的指令,其核心是大小为一个字的存储设备(或寄存器),即程序计数器(PC). 在任意时刻,PC都指向主存中的某条机器语言指令(即含有该指令的地址)。CPU的操作如下:
- 加载:从主存中复制内容到寄存器
- 存储:从寄存器复制内容到主存
- 操作:将两个寄存器的内容复制到ALU,ALU进行算术运算并将结果存放到一个寄存器中
- 跳转:复制内容到PC
- 存储器层次自上而下可以分为寄存器文件、L1高速缓存(SRAM)、L2高速缓存(SRAM)、L3高速缓存(SRAM)、主存(DRAM)、本地二级存储(本地磁盘)、远程二级存储(分布式文件系统,Web服务器). 其主要思想是上一层的存储器为下一层存储器的高速缓存。
- 操作系统的两个基本功能:
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
- 进程:操作系统对正在运行的程序的一种抽象,是程序已经执行到哪种程度的数据结构的汇集,从内核的观点看,进程的目的是担当分配系统资源的基本单位。(资源分配的最小单位)
线程:进程的单个执行流,是CPU调度和分派的基本单位,是比进程更小的能独立运行的基本单位。(程序执行的最小单位)线程与同属一个进程的其他线程共享进程所拥有的全部资源。进程有独立的地址空间,进程之间相互不影响;线程是进程中的不同执行路径,具有自己的堆栈和局部变量,但不存在单独的地址空间,单个线程崩溃会导致整个进程的崩溃。
- 文件:一个字节序列,所有的I/O甚至是网络都可以看作文件,系统的输出输入都是通过以小组称为Unix I/O的系统函数调用读写文件来实现的,文件为应用程序提供了一个统一的视图来看待各式各样的I/O设备。
- 并发与并行
- 并发:多进程系统中,进程之间快速切换从而实现并发,指在同一时间范围内运行多个进程。
- 并行:同一时刻执行多个任务