CSAPP lecture 01-overview

CSAPP lecture 01-Overview

视频地址:https://www.bilibili.com/video/BV1iW411d7hd?p=1
课件地址:https://www.jianguoyun.com/p/DQu1GsUQjqmrChiqhrEE

课程主题:这本书在干什么?

从程序员的角度来看计算机科学

大多数的课程是从抽象的角度去看计算机的,比如数据类型,渐进分析等,

但是在处理bug,以及分析底层问题时,会遇到无法处理的问题。

本课程的输出是:

  1. 成为一个更有效率的程序员(写的程序运行效率更高?)
  2. 更好地理解程序的运行表现(为啥跑出来是这个结果)
  3. 为更高阶的课程打下基础

本书中的几个关键问题

  1. ints不是数学意义上的整数,floats也不是真正意义上的实数

    比如计算50000*50000时,出现错误的答案

    比如计算(1e20+-1e20)+3.14和1e20+(-1e20+3.14)时,产生不同的答案

    原因是什么? 是因为计算机对于数据表示的有限性

    ints和floats在计算机中的存储形式,我们会在之后学习

  2. 在课程中需要学习到汇编

    1. 程序员不用学习写汇编
    2. 程序员要学会看汇编,理解程序在做什么,当高级语言编译出的程序出错的时候,要学会分析问题原因,理解程序运行状态
  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;
      return s.d;
    }
    

​ 对于结构体struct,在定义之后,在系统内存中的排布是这样的:

image-20220306174017520

可以看到,数组a在结构体中只分配了两个位置,用来存放ints类型的数据,

但使用者如果在调用中错误地访问了a[2]、a[3]、a[4]等位置,就会对原本存储d的数据造成破坏。再往上,就会破坏别的程序,造成严重的问题。

image-20220306174017520

!C语言和C++语言不提供任何内存保护机制

​ 可能产生各类内存错误,比如

  1. 数组越界访问
  2. 非法指针
  3. malloc和free的滥用

这类问题在实际运行时,是否会发生错误,取决于操作系统和编译器

这类问题的表现会非常奇怪,问题的表象和造成问题的原因甚至毫不相关,并可能在很长一段时候以后才被发现。

如何避免内存问题呢?

  • 使用Java、Ruby、Python、ML等带有内存保护机制的语言编程
  • 理解为什么这种问题可能会发生
  • 开发和使用一些工具去检测这类问题并避免(如Valgrind内存检查器)
  1. 提升程序的性能而不是简单的复杂度分析

    • 理解程序如何被编译,如何运行

    • 了解如何测量程序性能,识别瓶颈

    • 在不破坏代码通用性和模块化的前提下提升性能

  2. 系统除了执行程序之外还有别的功能

    • I/O系统控制输入输出
    • 计算机之间通过网络的数据交互
posted @ 2022-03-06 19:39  逍遥一叹s  阅读(64)  评论(0)    收藏  举报