CSAPP学习系列之计算机系统漫游 - PengPengCheung/Blogs GitHub Wiki

计算机系统漫游

1.1 信息=位+上下文

系统中的信息,都是由一串比特表示的。

区分不同数据对象的唯一方法是读到这些数据的上下文。比如,一个同样的字节序列可能表示的是一个整数、浮点数字符串或机器指令。

1.2 程序被其他程序翻译成不同的格式

说的是一个编译系统的构成。

Hello.c -> 1. 预处理器 -> hello.i -> 2.编译器 -> hello.s -> 3. 汇编器 -> hello.o -> 4. 链接器 -> hello

  1. 读取系统头文件的内容,直接插入到程序文本中
  2. 将文本文件hello.i 翻译成汇编语言程序的文件hello.s
  3. 将hello.s 翻译成机器语言指令,将指令打包成可重定位目标的格式,保存到hello.o中
  4. 链接器负责处理标准预编译好的文件合并到hello.o中。(如在程序中调用C库中的printf函数)

1.3 了解编译系统如何工作的益处

  • 优化程序性能
  • 理解链接时出现的错误
  • 避免安全漏洞

1.4 处理器读并解析内存中的指令

一. 系统硬件组成

  1. 总线
    • 贯穿整个系统的一组电子管道。
    • 被设计成传送定长的字节块,字节块=字。
    • 字长通常是4个字节(32位),或者8个字节(64位)
  2. I/O设备
    • 键盘、鼠标、显示器、磁盘驱动等都是IO设备
    • 每个IO设备通过一个控制器或适配器和IO总线相连。控制器是IO设备本身或系统的主印刷电路板(即主板)上的芯片组。适配器是一块插在主板插槽上的卡。
  3. 主存
    • 物理上,主存由一组动态随机存取存储器(DRAM)芯片组成。逻辑上,是一个线性字节数组,每个字节都有唯一地址(数组索引),地址从0开始 。
    • 每条机器指令由不同数量的字节组成,如Linux x86-64机器上,short类型 2字节,int float 4字节,long double 8字节
  4. 处理器
    • 中央处理单元(CPU),解释或执行存储在主存中指令的引擎。
    • 程序计数器(PC),大小只有一个字,任何时刻都指向主存中的某条机器语言指令。(即含有该条指令的地址)
    • 寄存器文件(Register file),一个小的存储设备,由一些单个字长的寄存器组成。
    • 算术/逻辑单元(ALU),计算新的数据和地址值。
    • 指令集架构描述的是每条机器代码指令的效果,微体系架构描述的是处理器实际上如何实现。

二. 存储器层次结构

上一层的存储器作为第一层存储器的高速缓存。

三、操作系统管理硬件

  • 两个基本功能:
    • 防止硬件被失控的应用程序滥用。
    • 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
  • 通过几个抽象概念来实现上述两个功能:
    • 文件是对IO设备的抽象表示
    • 虚拟内存是对主存和磁盘IO设备的抽象表示
    • 进程是对处理器、主存和IO设备的抽象表示

1、进程

  • 进程是操作系统对一个正在运行的程序的一种抽象。
  • 并发执行,是指一个进程的指令和另一个进程的指令交错执行。实现这种交错执行的机制称为上下文切换。
  • 上下文是指操作系统保持跟踪进程运行所需的所有状态信息。
  • 内核管理着进程之间的转换,内核是操作系统代码常驻主存的部分,它不是一个独立进程,它是系统管理全部进程所用代码和数据结构的集合。

2、线程

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

3、虚拟内存

  • 为每个进程提供了一个假象,每个进程都在独占地使用主存,每个进程看到的内存都是一致的,称为虚拟地址空间。

  • 进程虚拟地址空间如图:

    • 地址空间最上面的区域是保留给操作系统中代码和数据的
    • 底部区域存放用户进程定义的代码和数据
    • 地址是从下往上增大的

    从低的区开始:

    • 程序代码和数据

      代码和数据区直接按照可执行目标文件的内容进行初始化。在进程一开始运行时就被指定了大小。

    • 可以在运行时动态地扩展和收缩(malloc 和free)

    • 共享库

      在地址空间中部存放C标准库和数学库这样的代码和数据区域

    • 位于虚拟空间顶部,在调用一个函数时,栈会增长,从一个函数返回时,栈会收缩

    • 内核虚拟内存

      位于地址空间顶部,不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数,程序要调用内核来执行这些操作。

  • 虚拟内存的基本思想是把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存。

4、文件

  • 文件是字节序列,每个IO设备都可以看成是文件
  • 所有输入输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的。

四、系统间的网络通信

  • 网络可视为一个IO设备。一个网络通信的例子如图:

五、重要主题

1、Amdahl定律

  • 主要思想:当对系统的某个部分加速时,对系统整体性能的影响取决于该部分的重要性和加速程度。

  • 当k趋于无穷时,可选取系统的某一部分将其加速到某个点,在这个点上,该部分花费的时间可忽略不计。则此时

    S = 1/(1-alpha)
    

    Amdahl定律描述了改善任何过程的一般原则

2、并发和并行

  • 并发指一个同时具有多个活动的系统,并行指用并发使一个系统运行得更快

  • 线程级并发

    • 一个处理器在多任务间切换,这种配置称为单处理器系统

    • 由单操作系统内核控制的多处理器组成的系统,称为多处理器系统。多核处理器将多个CPU(称为核)集成到一个集成电路芯片

      多核处理器的组织结构

    • 超线程,即 同时多线程,允许一个CPU执行多个控制流,涉及CPU某些硬件有多个备份,如程序计数器和寄存器文件,而其他硬件部分只有一份。超线程处理器可以在一个时钟周期的基础上决定执行哪个线程,使CPU能更好利用处理资源。

    • 多核处理器从两方面提高系统性能:减少了在执行多个任务时模拟并发的需要。可使程序运行得更快。

  • 指令级并行

    • 可同时执行多条指令的属性称为指令级并行
    • 处理器达到比一个周期一条指令更快的并行速率,称为超标量处理器。
  • 单指令、多数据并行

    • 允许一条指令产生多个可并行执行的操作,称为单指令、多数据,即SIMD并行
    • 提供SIMD指令多是为了提高处理影像、声音和视频数据应用的执行速度。

3、计算机中的抽象

各种抽象:

  • 处理器中,指令集架构提供了对实际处理器硬件的抽象。
  • 文件是对IO设备的抽象
  • 虚拟内存是对程序存储器的抽象
  • 进程是对一个正在运行程序的抽象
  • 虚拟机提供对整个计算机的抽象,包括操作系统、处理器和程序。