编译系统

gcc 编译器驱动程序读取源文件 hello.c,并把它翻译成一个可执行目标文件 hello 的过程如下

  1. 预处理阶段:预处理器(preprocessor)根据字符 # 的命令,修改原始的 C 程序

  2. 编译阶段:编译器(compiler)将文本文件 hello.i 翻译成文本 hello.s,它包含一个汇编语言程序

  3. 汇编阶段:汇编器(assembler)将 hello.s 翻译成机器语言指令,并把这些指令打包成一种叫作可重定位目标程序(relocatable object program)的格式

  4. 链接阶段hello.c 中包含 printf 函数,这个函数存在于一个名为 printf.o 的单独的目标文件中,链接器(link editor)将这个文件合并到 hello.o 中,最后得到 hello 可执行文件

系统的硬件组成

  • 总线:负责携带信息在各个部件之间传递

    • 字(word):总线一般被设定为传送定长的字节块,这个字节块被称为字
    • 字长:字中的字节数
  • I/O 设备:键盘鼠标、显示器、磁盘

    • 每个 I/O 设备通过一个控制器适配器I/O总线相连
  • 主存:在处理器执行程序时,用来存放程序和程序处理的数据

    • 由一组**动态随机存取存储器(DRAM dynamic random access memory)**芯片组成
  • 处理器:中央处理单元(CPU),是解释存储在主存中指令的引擎

存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存

操作系统管理硬件

操作系统的两个基本功能

  • 防止硬件被失控的应用程序滥用

  • 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备

抽象概念

  • 进程:是对处理器、主存和 I/O 设备的抽象

  • 虚拟内存:是对主存和磁盘 I/O 设备的抽象

  • 文件:对 I/O 设备的抽象

进程

进程是操作系统对一个正在运行的程序的一种抽象

并发(concurrency)运行是说一个进程的指令和另一个进程的指令是交错执行的

一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件(一个 CPU 看上去像是在并发地执行多个进程),这时通过处理器在进程间切换来实现的,操作系统实现这种交错执行的机制称为上下文切换(在任何时刻,单处理器只能处理一个进程的代码)

操作系统会保持跟踪进程运行所需的所有状态信息,也就是上下文

线程

一个进程可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文,并共享全部的代码和全局数据

虚拟内存

操作系统会为每一个进程开辟一块虚拟地址空间(在磁盘上,用主存作为高速缓存),以保证每个进程互不干扰,同时使得每个进程都认为自己独占了主存

每个进程的虚拟地址空间由大量的准确定义的区构成,每个区由有专门的功能,从地址最低的区开始依次为

  1. 程序代码和数据

  2. 运行时堆:代码和数据区在进程一开始时就被指定了大小,与此不同,堆可以在运行时动态地扩展内存

  3. 共享库:C 标准库等共享代码和数据

  4. :位于用户虚拟地址空间顶部,编译器用它实现函数的调用

  5. 内核虚拟内存:地址空间顶部

文件

每个 I/O 设备都可以看成文件