CSAPP阅读笔记

CSAPP阅读笔记(1):课程综述


相关链接

链接: CMU 15-213课程
链接: 课程主页链接
链接: 补充资料(包括实验)链接

前言

CMU 15-213以CSAPP第三版作为教材,并且其中的实验都是来自于书中所讨论的内容,因此在开始实验前一定要好好阅读这本书并且尽可能完成书中习题。读者可以在课程主页上查看完整的课程和作业安排,在补充资料中可以获取本课程以及实验一些参考书籍和一些工具的使用方法。


一、课程意义

  1. 15-213课程名叫ICS(Introduction to Compute System),顾名思义是对计算机系统的一个初步介绍,这门课程会学习一些计算机系统方面的知识如:操作系统,计算机网络,嵌入式系统。学完这门课程后会对计算机系统有个整体的认识,为后续系统课程的学习打下基础。
  2. 这门课程与其他计算机系统课程有一个很大的区别,那就是老师是以程序员视角来看待整个系统,通过输入代码来理解整个计算机系统的运行,学会利用各种工具来分析系统,而不是一开始就讲各种概念和结构。学完这门课程,你可以知道程序是如何运行的,机器如何支持程序运行,明白为什么有时程序可以运行,有时却不能。在我看来这是与其他课程相比最大的优势,可以让初学者更好地入门理解计算机系统。

二、课程主题

1.Great Reality 1:Ints are not Integers, Floats are not Reals

在这里插入图片描述举几个例子理解一下这段话:1.我们知道在实数域中 x 2 ≥ 0 x^{2} \geq 0 x20是一定成立的,但是在计算机中是否同样一定成立呢?答案是否定的,对于int型数据,当值超过能表示的最大范围是就会溢出导致数据出错,比如50000*50000,得到的是负数,如下图所示:
在这里插入图片描述
2.对于加法交换律和结合律,在我们印象中是一定成立的。但是对于计算机来说,是否也一定成立呢?答案是不一定,对于int型数据是满足这条规律的,但是对于float型数据却不一定,我们可以通过下面例子来验证这一点
在这里插入图片描述

我们可以看到第一个结果还是3.14,但是第二个结果却变为了0,当两float型数据的值相差悬殊时,大的值会忽略小的值从而导致结果错误。

我们可以看到不管是int数据还是float数据都会有一些不符合常理的特点,而造成这些的原因是因为计算机要用有限的位来表示无限的数域,这就意味着计算机在处理数字的时候必须要作出一些取舍。

但是我们也要明白计算机在大部分时候都是严格遵守数学运算规律,不会产生随机值的,只有在数字在计算机表示的临界范围时,才有可能会出错,所以我们需要尤其注意这些临界值。这就要求我们知道在什么时候用什么类型的数据,这门课程也会讨论数字,数字的表示以及属性。


2.Great Reality 2:You’ve to got to know assembly

在这里插入图片描述

本课程将用大量时间来学习机器级编程,理解它的意义。这些机器级指令可以用两种方法来描述:1.第一种就是汇编语言,它可以看成这些指令的文本版本。2.第二种方法是使用目标代码来描述,将指令表示为位级别的2进制代码。通常会用第一种方法,然后由计算机执行汇编指令。

本课程还会给学生演示C程序是如何变成机器码,以及如何在机器上执行的。但是不会花费大量时间编写汇编程序,而是关注如何从C编译器获取汇编代码,并尝试阅读并且理解其含义。

本课程着重关注Intel x86-64处理器的汇编语言。


3.Great Reality 3:Memory Matters

在这里插入图片描述
现代计算机的存储系统由一个非常复杂的分层存储系统组成,并且尝试同时提供大容量和高性能的存储器。但是存储空间是有限的,存储单元需要分配和管理,学完该课程将会了解一些内存分配和管理的知识。

C程序通常会报内存引用错误,这是程序最常报的错误,因此本课程会带领大家认识这些错误是什么,它是怎么引起的,以及如何防止它们出现。

比如以下就有一个由于存储引发的错误:我们创建一个结构体,并对其赋值
在这里插入图片描述
当我们运行fun(0)和fun(1)时值都是3.14,但是当运行fun(2)时就返回3.1399998664856,运行fun(3)时为2.00000061035156,运行fun(4)又返回3.14,运行fun(6)会出现Segmentation fault, 这其实是访问了错误的内存导致的,让我们来看看这个结构体在内存中是如何分布的。
在这里插入图片描述当我们执行fun(0)和fun(1)时修改的数组a中内容,得到的时正确结果没有问题,但是执行fun(2)和fun(3)时修改的是浮点数d中内容就会得到错误结果,如果执行fun(6),就修改了某些用来维持程序状态的值会导致程序崩溃。
造成这些错误的原因其实是因为C/C++没有提供边界检查。

C/C++并不提供任何内存保护,所以没有比较好的基础很容易引发数组越界,非法指针,以及malloc/free的滥用,而这就会给程序带来bug,而且这种bug通常很难排查,很可能需要运行很多次才会出现。要解决它,可能需要根据内存的排列方式对某个数据结构进行排查。

4.Great Reality 3:There’s more to performance than asymptotic complexity

在这里插入图片描述
课程第四部分主要是围绕优化程序性能展开的,在以往学习CS课程的是更多的是强调优化算法或选择更合适的数据结构来提升程序性能,但是其实程序性能优化是从多方面展开的:数据结构,算法,过程,循环。这就需要了解程序在机器中是如何运行的,什么因素影响了它的性能。

举个简单但是非常经典的例子:
在这里插入图片描述
这两个循环似乎看上去没什么大的区别,只是第一个循环先遍历矩阵的行,第二个先遍历矩阵的列,但是它们的执行时间却相差几十倍,这其实与存储结构中的缓存(Cache)相关。课程之后详细介绍。

5.Great Reality 5:Computers do more than execute programs

在这里插入图片描述

课程最后一部分讨论计算机网络方面的一些知识,当今时代计算机很少作为一个孤立的机器存在,它经常需要通过网络与其他计算机或服务器通讯,比如数据传输,文件传输等。并且计算机也不仅仅只有执行程序,他还需要输入输出数据,这就涉及到I/O操作,这些在课程后面也会学习到。

总结

今天刚刚开始学习CSAPP和对应课程,之后会陆续上传读书笔记和实验笔记。写这个笔记也算是监督自己学习这个课程吧~~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值