1.编译过程

编译系统包括:

  • 预处理器——处理字符#开头的命令,即:
  1. 将头文件的内容插入程序文本中
  2. 宏定义替换
  3. 条件编译(#if #ifdef),不被编译的部分变为空行
  4. 删除注释
  • 编译器——将源程序翻译成汇编程序(.s)

  • 汇编器——将汇编程序翻译成机器语言指令,打包成可重定位目标程序(.0)

  • 链接器——将各个.o文件合并成可执行文件,只有修改后的模块需要编译,重新链接

Compilation

2.系统硬件组成

  • 总线——通常总线被设计成传送定长的字节块,大多数机器为4个字节(32位)或8个字节(64位)

  • I/O设备——每个I/O设备都通过一个控制器或者适配器与I/O总线相连接,控制器和适配器的区别主要在于其封装方式:

  1. 控制器是置于I/O设备本身的或主板上的芯片组

  2. 适配器则是一块插在主板插槽上的卡

  • 主存——主存即内存,是一个CPU能直接寻址的临时存储设备,在处理器执行程序时用来存放程序和程序处理的数据。
  1. 物理上,主存由一组DRAM组成。

  2. 逻辑上,存储器是一个线性的字节数组,每一个字节都有其唯一的地址,这些地址均从零开始。

  • 处理器——CPU的核心是一个字长的寄存器,称为程序计数器。在任何时刻,PC都指向内存中的某条机器语言指令。

Hardware

3.高速缓存

  • 缘由:hello程序最初存放在磁盘上,当程序加载时,被复制到内存中,当CPU运行时,指令又被复制到CPU中。这些复制的过程即为开销,减缓了程序“真正”的工作时间。

  • 解决方案:采用更小更快的存储设备(高速缓存caches),作为暂时的集结区域,用来存放处理器近期可能会需要的信息,采用层次存储结构,用上一层的存储器作为低一层存储器的高速缓存。

4.操作系统

  • 操作系统的基本功能:
  1. 防止硬件被失控的应用程序滥用。
  2. 向应用程序提供简单一致的机制来控制复杂且大相径庭的底层硬件设备
  • 操作系统分层

System

  1. 进程

进程是OS对一个正在运行的程序的抽象,在一个OS上可以同时运行多个进程(运行的进程数多于CPU个数)。

(1)并发运行:一个进程的指令和另一个进程的指令是交错执行的,利用上下文切换实现

(2)并行运行:指在同一时刻,有多条指令在多个处理器上同时执行。所以无论从微观还是从宏观来看,二者都是一起执行的。

  1. 线程

一个进程实际上可以由多个线程组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。

  1. 虚拟存储器

虚拟存储器是一个抽象概念,每个进程都在独占主存,每个进程看到的是一致的存储器,称为虚拟地址空间。对于所有进程来说,代码都是从同一固定地址开始,紧接着是全局变量相对应的数据位置。代码和数据区在进程一开始运行时就被规划了大小。

堆:当调用malloc和free时,堆可以在运行时动态的扩展和收缩

共享库:存放像C标准库和数学库这样共享库的代码和数据的区域

栈:编译器用它来实现函数调用。当调用一个函数时,栈增长;从一个函数返回时,栈收缩

内存虚拟存储器:内核总是驻留在内存当中,是操作系统的一部分。该区域不允许应用程序读写或者直接调用其中的函数。

Stack

  1. 文件

字节序列,每个I/O设备都可以视为文件

5.抽象

文件是对I/O的抽象;虚拟存储器是对程序存储器的抽象;进程是对一个正在运行的程序的抽象;虚拟机提供对整个计算机的抽象