CSAPP笔记-第一章

快速链接:

编译系统

hello程序的运行过程

高速缓存器

操作系统

计算机系统的抽象

Amdahl加速比定律公式

并发与并行

  • 这一章术语(请ctrl+F正文内查找):

位,字节,字符,文本,ASCII, 文本文件,二级制文件,机器指令,可执行目标程序,编译器GCC(缺省),编译系统,预处理器,编译器,汇编器,链接,总线,I/O,主板,适配器,控制器,主存,DRAM,逻辑,处理器,程序计数器,寄存器,ALU,加载,存储,操作,跳转,指令集,高速缓存,操作系统,抽象,进程,多核,并发,上下文切换,内核,系统调用,控制权,线程,虚拟内存,虚拟地址空间,堆(缺省),共享库(缺省),用户栈(缺省),内核虚拟内存(缺省),加速比,Amdahl定律,并行,并发,线程级并发,多核,超线程,指令集并发,SIMD并行,虚拟机


一个hello world程序的生命周期

#include <stdio.h>

int main(){
    printf("hello, world
");
    return 0;
}

编译系统:

  • 编译hello程序的过程

    (1) 预处理阶段:插入头文件
    (2) 编译阶段:编译器翻译,包含main函数定义的汇编语言程序

main:
    subq    $8, %rsp #一条低级机器语言指令
    movl    $.LCO, %edi
    call    puts
    movl    $0, %eax
    addq    $8, %rsp
    ret
(3) 汇编阶段:汇编器翻译成机器语言指令,打包成可重定位目标程序(relocatable object program), 保存为二进制文件

(4) 链接阶段:链接器合并调用的printf函数,得到可执行目标文件
  • shell: 命令行解释器;运行hello程序,(> ./hello)

  • 系统硬件组成

  1. 总线:总线传送定长的字节块(字,word),字长是基本的系统参数:32位系统是4个字节,64位系统是8个字节

  2. I/O设备:每个I/O设备都通过一个控制器(设备/系统主板上的芯片组)/适配器(插在设备/系统主板插槽上的卡)与I/0总线相连

  3. 主存:由一组动态随机存取存储器(DRAM)芯片组成。逻辑上,是一个线性字节数组。

  4. 处理器 (CPU):
    模型 - 指令集架构。
    下一条指令不一定和内存中刚执行的指令相邻。

    4.1 核心 - 大小为一个字的寄存器,成为程序计数器(PC),PC指向主存中某条机器语言指令(的地址)。

    4.2 寄存器文件(register file): 一个小的存储设备,每个寄存器单个字长

    4.3 算数/逻辑单元 (ALU): 计算新的数据和地址值

    4.4 CPU在PC中指令要求下执行的操作:

    加载 - 主存 -> 寄存器;
    存储 - 寄存器到主存;
    操作 - 两个寄存器 -> ALU运算 -> 一个寄存器;
    跳转 - 指令复制到PC

hello程序的运行过程 (省略细节)

高速缓存存储器 (cache memory)

加快从主存中复制到寄存器的速度。

多级高速缓存:L1, L2, (L3), ...

可以利用高速缓存将程序的性能提高一个数量级

  • 存储设备的层次:使用上一层存储器作为低一层存储器的高速缓存

操作系统:应用程序 <--> 硬件

操作系统两个基本功能:

(1)防止硬件被失控的应用程序滥用
(2)向应用程序提供简单一致的机制来控制复杂的低级硬件设备

因此,操作系统有以下抽象:

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

    • 并发运行 - 一个进程的指令和另一个进程的指令交错执行。进程数多于CPU个数。CPU通过处理器在进程间的切换来实现并发。
    • 这种交错执行的机制称为上下文切换 - 保持跟踪运行的状态信息,即上下文(PC,寄存器当前值,主存内容等)。
    • 内核(kernel, 操作系统代码常驻主存的部分,系统关系全部进程所用代码和数据结构的集合)管理进程到进程的转换。
      应用程序执行一条system call指令,将控制权传递给内核/操作系统。
      操作系统保留当前进程的上下文,创建应用程序的新进程以及上下文。
      操作系统将控制权传给新进程(执行请求,返回应用程序)。
  • 线程
    一个进程由多个线程执行单元组成。线程运行在进程的上下文中(?),共享代码和全局数据。

  • 虚拟内存
    一个抽象概念。进程的虚拟地址空间如下(每个进程看到的内存都是一致的):

地址由下往上增大。

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

系统之间的网络通信

简而言之,网络可以视为一个I/O设备。

Amdahl law

实际加速比的计算:(S = T_{old} / T_{new}, T_{new} = (1-alpha)T_{old} + alphaT_{old}/k)

并发(concurrency)和并行(parallelism)

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

系统层次结构中由高到低的三个并行层次:

  1. 线程级(进程级?):多核处理器, 超线程/同时多线程

  2. 指令集并行:处理器同时执行多条指令 - 超标量(super-scalar)处理器

  3. 单指令、多数据(SIMD并行):多是为了提高处理影像、声音和视频数据应用的执行速度。;编译器支持用特殊的向量数据类型来写程序。

计算机系统中抽象的重要性

如,为一组函数规定一个简单的应用程序接口(API)

计算机系统提供的一些抽象(在上述介绍的基础上增加"虚拟机"抽象):

Other glossary

  • 8个位(比特) -> 1个字节 -> 程序中某个字符

  • ASCII标准:用唯一的单字节大小的整数值来表示每个字符

  • 文本文件:只由ASCII字符构成的文件。

  • 二进制文件:不是文本文件的所有其他文件

Unsolved

  • 线程运行在进程的上下文中
  • 线程级并发 - 进程级并发?

练习题答案

(略)

原文地址:https://www.cnblogs.com/manqing/p/8867035.html