CSAPP笔记-第一章 计算机系统漫游

第一章 计算机系统漫游

这一章通过研究“hello world”这一简单程序的生命周期,介绍了计算机系统的主要概念和主题,先从概念或名词的上理解计算机系统。这一章先概括地介绍了一下计算机系统的硬件和软件,剩余章节会详细的介绍,让我们有一个大体了解与框架。

  • 运行一个简单的程序所做工作(Hello程序的生命周期)
  • 系统硬件
  • 存储设备
  • 操作系统(应用软件与系统硬件的桥梁)
  • 系统之间的通信
  • 重要概念

    Hello程序的生命周期

  1. 源程序
  • 即程序员通过编辑器创建并保存的文本文件,文件名是hello.c
  • 源程序实际上就是一个由值0和1组成的位(又称比特)序列,8位是1字节,每个字节表示程序中的某些文本字符
  • hello.c程序是以字节序列的方式存储在文件中的
  • 像hello.c这样只由ASCII字符构成的文件称为文本文件,其他所有文件都称为二进制文件
  • hello.c的表示方法说明了一个思想:系统中的所有信息——包括磁盘文件,内存中的程序,内存中存放的用户数据以及网络上传递的数据,都由一串比特表示。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
  1. 源程序——>可执行目标程序(源文件——>目标文件)
    程序被其他程序翻译成不同的格式
    由编译器驱动程序(编译系统):高级语言——>低级机器语言指令
    在Linux中编译指令是:gcc -o hello hello.c
    GCC编译器驱动程序读取源程序文件hello.c,并把它翻译成一个可执行目标文件hello。
    这个翻译过程可分为四个阶段完成。执行这四个阶段的程序(预处理器、编译器、汇编器和链接器)一起构成了编译系统。
  • 预处理阶段:hello.c——>hello.i
  • 编译阶段:hello.i——>hello.s 他包含一个汇编语言程序
  • 汇编阶段:hello.s——>hello.o(目标文件:二进制文件)
  • 链接阶段:得到hello文件:可执行目标文件,可以被加载到内存中,由系统执行

了解编译系统如何工作是大有益处的:

  • 优化程序性能
  • 理解链接时出现的错误
  • 避免安全漏洞
  1. 运行hello文件
    要想在Linux系统上运行该可执行文件,我们将他的文件名输入到称为shell的应用程序中:./hello
    shell是一个命令行解释器,它输出一个提示符,等待输入一个命令行,然后执行这个命令。
    运行hello文件,shell程序分两种情况:
    a. 经过处理器再到内存
    b. 不经过处理器,利用直接存储器(DMA)技术,直接从磁盘到达主存,一旦目标文件hello中的代码和数据被加载到主存,处理器就开始执行hello程序的main程序中的机器语言指令,这些指令将“hello world\n”字符串中的字节从主存复制到寄存器文件,再从寄存器文件中复制到显示设备,最终显示在屏幕上。

系统的硬件组成

  1. 总线:携带信息字节并负责在各个部门间传递
  2. I/O设备:系统与外界的联系通道,一般包括键盘、鼠标、显示器和磁盘
  3. 主存:一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据
  4. 处理器(CPU):解释(或执行)存储在主存中指令的引擎
    CPU在指令的要求下可能会执行的操作:
  • 加载:从主存复制一个字节或一个字到寄存器,以覆盖寄存器原来的内容
  • 存储:从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容
  • 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容
  • 跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器(PC)中,以覆盖PC中原来的值

存储设备形成层次结构

在处理器和一个较大较慢的设备(如主存)之间插入一个更小更快的存储设备(如高速缓存)的想法已经成为一个普遍的观念。
每个计算机系统中的存储设备都被组织成一个存储器层次结构。

L0 CPU寄存器:保存来自高速缓存存储器的字
L1-L3 高速缓存(SRAM):L1高速缓存保存取自L2高速缓存的高速缓存行,L2保存L3,L3保存来自主存的高速缓存行
L4 主存(DRAM):保存取自本地磁盘的磁盘块
L5 本地二级存储(本地磁盘):保存取自远程服务器上磁盘的文件
L6 远程二级存储(分布式文件系统,Web服务器)

从L0-L6,设备的访问速度越来越慢,容量越来越大,并且每字节的造价也越来越便宜。

操作系统管理硬件

运行程序时,程序没有直接访问键盘、显示器、磁盘或者主存,而是依靠操作系统提供的服务,也就是说,操作系统是应用程序和硬件之间的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。

操作系统的功能:
(1)防止硬件被失控的应用程序滥用;
(2)向应用程序提供简单一致机制来控制复杂而又通常不相同的低级硬件设备
操作系统通过几个基本的抽象概念(进程、虚拟内存和文件)来实现这两个功能。

  • 文件是对I/O设备的抽象
  • 虚拟内存是对主存和磁盘I/O设备的抽象
  • 进程则是对处理器、主存和I/O设备的抽象
  1. 进程
    在一个系统上可以同时运行多个进程,而每个进程都好像在独占的使用处理器、主存和I/O设备。
    并发运行:一个进程的指令和另一个进程的指令是交错执行的。
    上下文:操作系统保持跟踪进程运行所需的所有状态信息,比如PC和寄存器文件的当前值,以及主存内容。
    上下文切换:操作系统把控制权从当前进程转移到某个新进程,即保存当前进程的上下文,恢复新进程的上下文,将控制权传递到新进程。
    从一个进程到另一个进程的转换是由操作系统内核(kernel)管理的。内核是操作系统代码常驻主存的部分。
  2. 线程
    一个进程实际上可以由多个线程组成。线程易共享数据,运行速度快。
  3. 虚拟内存
    虚拟内存是一个抽象概念,即每个进程好像都在独占地使用主存。
  4. 文件
    文件就是字节序列。每个I/O设备,包括磁盘、键盘、显示器甚至网络都可以看成文件。

    系统之间通过网络通信

    系统可以通过网络和其他系统连接到一起。
    当系统从主存复制一串字节到网络适配器时,数据流经过网络到达另一台机器,相似的,系统可以读取从其他机器发送来的数据,并把数据复制到自己的主存。
    客户端和服务器之间交互的类型在所有的网络应用中是非常典型的。

    重要概念

  5. Amdahl定律
    该定律的主要思想是,当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
    【计算】
    若系统执行某应用程序需要时间为T1,假设系统某部分(该应用程序的某个部分)所需执行时间与该时间的比例是a,而该部分性能提升比例为k。
    该部分初始所需时间为:a*T1
    现在所需时间为:(a*T1)/k
    该应用程序的总的执行时间为:T2=(1-a)*T1+(a*T1)/k=T1[(1-a)+a/k]
    加速比:S=T1/T2=1/((1-a)+a/k)

要想显著加速整个系统,必须提升全系统中相当大的部分的速度。

  1. 并行和并发
    并行:指一个同时具有多个活动的系统。
    并行:用并发来使一个系统运行的更快。
    (1)线性级并发
    同时有多个程序执行的系统,就是并发。使用线程,能够在一个进程中执行多个控制流。
    (2)指令级并行
    处理器可以同时执行多条指令的属性称为指令级并行。
    (3)单指令、多数据
    许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行执行的操作,这种方式称为单指令、多数据。
    3.抽象
文章目录
  1. 1. 第一章 计算机系统漫游
    1. 1.1. Hello程序的生命周期
    2. 1.2. 系统的硬件组成
    3. 1.3. 存储设备形成层次结构
    4. 1.4. 操作系统管理硬件
    5. 1.5. 系统之间通过网络通信
    6. 1.6. 重要概念