课程主页:http://www.cs.cmu.edu/afs/cs/academic/class/15213-f15/www/schedule.html

课程资料:https://github.com/EugeneLiu/translationCSAPP

课程视频:https://www.bilibili.com/video/av31289365/

这一讲主要介绍了课程概述。

课程主旨

课程的主旨是:抽象是好的,但不要忘记现实。

  • 大多数CS和CE课程都强调抽象
    • 抽象数据类型
    • 渐近分析
  • 这些抽象有局限性
    • 特别是在修改bug的时候需要了解底层实现的详细信息
  • 学习了该课程的有如下效果
    • 成为更有效率的程序员
      • 能够有效地发现和消除错误
      • 能够理解和调优程序性能
    • 为CS&ECE的“系统”课程做准备

老师还提到计算机中5个重要的事实。

五个重要的事实

1.整型数不是整数,浮点数不是实数
  • 例1:$x^2\ge 0$不一定成立

    • 对浮点数上述事实成立

    • 对整型上述事实不一定成立

  • 例2:$(x+y)+z=x+(y+z) ?$

    • 无符号整型和整型上述等式成立

    • 浮点数上述事实不成立

2.需要了解汇编语言
  • 很有可能永远不会用汇编语言写程序
    • 因为编译器比人更耐心
  • 但是,了解汇编语言是了解机器级执行模型的关键
  • 存在错误的程序行为
    • 高级语言模型崩溃
  • 调整程序性能
    • 了解编译器已完成/未完成的优化
      • 理解程序效率低下的原因
  • 实施系统软件
    • 编译器将机器语言作为目标
      • 操作系统必须管理流程状态
  • 创建/打击恶意软件
    • x86汇编语言是首选!
3.内存很重要,随机存取存储器是非物理的抽象
  • 内存不是无限的
    • 必须分配和管理
    • 许多应用程序以内存为主
  • 引用错误的内存特别有害
    • 在时间和空间上影响都是长远的
  • 内存性能不统一
    • 缓存和虚拟内存的影响会大大影响程序性能
    • 使程序适应存储系统的特性可以大大提高速度

来看一个具体例子:

typedef struct {
    int a[2];
    double d;
} struct_t;

double fun(int i) {
    volatile struct_t s;
    s.d = 3.14;
    s.a[i] = 1073741824; /* Possibly out of bounds */
    return s.d;
}

解释如下:

4.性能不只是渐近复杂性
  • 常数项也很重要!
  • 甚至精确的操作数量也无法预测性能
    • 代码的不同编写方式也会产生$10:1$的效果
    • 必须在多个级别进行优化:算法,数据表示,过程和循环
  • 必须了解系统才能优化性能
    • 程序如何编译和执行
    • 如何衡量程序性能并确定瓶颈
    • 如何在不破坏代码模块化和通用性的情况下提高性能

一个具体例子如下:

产生上述现象的原因是和计算机存储数据的方式有关:

5.计算机不仅执行程序
  • 计算机处理数据输入输出
    • I/O系统对于编程的可靠性和性能至关重要
  • 他们通过网络相互通信
  • 存在网络时会出现许多系统级问题
    • 通过自主流程进行并行操作
    • 处理不可靠的媒体
    • 跨平台兼容性
    • 复杂的性能问题

课程观点

  • 大多数系统课程都是以建造者为中心的
    • 计算机架构
      • 在Verilog中设计处理器流水线
    • 操作系统
      • 实现操作系统的部分功能
    • 编译器
      • 为简单语言编写编译器
    • 网络
      • 实现和模拟网络协议
  • 这门课主要是从程序员的角度介绍上述内容,核心内容为7个项目,后续完成的时候也会更新相应的笔记。