深入理解计算机系统


CSAPP 是 CMU 的一门课程 CMU CS15213 的缩写,同时也是这门课被誉为神书的教材的缩写,其全称为 Computer Systems: A Programmer’s Perspective。

教材 PDF:https://www.cs.sfu.ca/~ashriram/Courses/CS295/assets/books/CSAPP_2016.pdf

官方网站:http://csapp.cs.cmu.edu/

课程录像:https://scs.hosted.panopto.com/Panopto/Pages/Sessions/List.aspx#folderID=%22b96d90ae-9871-4fae-91e2-b1627b43e25e%22

前言

  1. 课程特点

课程讲授如何从程序员的角度全面理解计算机系统,帮助程序员在充分理解计算机系统底层运行原理的基础上,写出正确性、可用性、运行性能更优的程序。

  1. 课程内容

课程聚焦于 C 语言程序是如何在使用 x86-64 机器码的 Linux 机器上执行的。

x86: CPU 指令集架构,根据 Intel CPU 系列产品线得名;

Linux: 操作系统内核,常见版本有 Ubuntu、Debian、CentOS,负责网络、进程调度、内存管理、文件系统等;

gcc: GNU(GNU’s Not Unix) 项目开发的编译器。

  1. 为什么我们需要了解计算机系统
  • 因为有时候程序执行的结果会出乎我们的意料
(lldb) print 40000 * 40000
(int) 1600000000
(lldb) print 50000 * 50000
(int) -1794967296
(lldb) print 300*400*500
(int) 60000000
(lldb) print 300*400*500*600
(int) 1640261632
  • 因为有一些事情我们容易忽视

例如:系统的存储不是无限的、不同的存储层级之间存在很大的性能差距。

Chapter 1: A Tour of Computer Systems

1. 从 Hello World 开始

我们需要尝试理解,一个最简单的程序从编写、执行再到终止的整个生命周期过程中,我们的计算机系统发生了哪些事情。

  • Source Program

人类用高级语言编写的和可理解的 text file,通常用 ASCII 码表示。

  • 编译的整个过程

    • 包含 Preprocessing、Compilation、Assembly、Linking 四个步骤,把源代码转换成可执行程序。

    • Preprocessing

    插入系统头文件的内容,得到 hello.i;

    • Compilation

    将源代码转换成文本格式的汇编语言,得到 hello.s;

    • Assembly

    将文本格式的汇编语言转换成二进制文件,得到 hello.o;

    • Linking

    融合被引用的方法实现,得到可执行文件 hello。