CS:APP 读后感
这本书,给了我 一个在Linux下运行的程序 的直观印象。下面是每一章让我产生 “惊讶” 的内容,这些内容是我在这本书中新接触到的内容。(以下内容是在阅读完第一遍之后,第二遍之前写的)
接下来会陆续更新各章的详细笔记 …
介绍
目录:
1 | 第1章 计算机系统漫游 |
本书一共分为12章,第一章可以说是对全书的介绍,简单介绍了本书的所有内容。
剩下的十一章是本书的正式部分,我认为本书的核心在第 7~9 章,2~6章的内容可以说是为读者补充了前置知识,例如,第六章的内容就和第九章密切相关。而 10 ~ 12 章则主要以实践为主,第十章IO和第十一章网络编程,在介绍他们本来内容的同时,也是为在第十二章建立一个并发网络服务器构建基础。
分章介绍
第二章 信息的表示和处理
这一章读起来很抽象,特别是2.2 2.3 介绍原码和补码以及他们之间的互相转换,看的人头疼,第一次读的时候放弃了一次,第二次才一口气读完的。2.4 介绍浮点数表示,虽然也很抽象,但相比整数的部分,浮点数有趣很多,IEEE的表示方法真的很奇妙,它看起来很丝滑,随着表示位数的增加,能表示的最小数增加的很自然,有种“天选”,“本来就应该是这样子” 的感觉。
2.1.3 寻址和字节顺序: 介绍了在计算机硬件上存储字节的两种不同顺序:大端法和小段法。明白了这个,才能知道网络协议做了什么,他们将不同硬件上的字节顺序转换成了网络字节顺序,便于传输。
2.16 布尔代数介绍 : 可以使用位向量来表示有限集合。
2.2 整数表示 : 介绍了整数原码和补码的表示,以及他们之间的转换。
2.3 整数运算 : 介绍了整数运算可能出现的错误,以及来源。
2.4 :介绍了浮点数的IEEE表示方法,具体规则。以及使用IEEE浮点数运算可能导致的错误。
第三章 程序的机器级表示
相比于上一章的枯燥,这一章可以说让我开眼了,介绍汇编语言的可能有点难懂,但绝不枯燥,更加深刻的理解了c语言。
这一章之前的内容是上个学期考试周之前看的,具体内容不如这一章记得清楚。
从这一张开始到最后,才是一口气看完的。
3.2 :介绍了程序从c语言到汇编语言的过程,介绍了objdump
的使用
3.4 3.5 3.6 3.7:介绍了x86-64的寄存器,以及汇编语言的指令,通过阅读这部分,你可以看懂汇编语言。从hello world 到函数递归的汇编语言都介绍的很详细。
3.9 :介绍了异质的数据结构 结构体 联合 的存储方式,介绍了数据对齐的概念。
3.10.4 :介绍了几种对抗缓冲区溢出攻击的方法
第四章 处理器体系结构
这一章我看懂的部分不必我在计算机导论大作业里懂得更多,这一章确实抽象,我只看了一般就看不下去了,等我学完数字逻辑再来看吧。
第五章 优化程序性能
呃呃 感觉含金量不是很高,没啥看了之后让我感觉很厉害的东西。
客观一点就是 普通人日常写代码小技巧
第六章 存储器层次结构
没留下很深刻的印象,只记得和虚拟内存那一章有关,等我再看一遍吧。
第七章 链接
含金量高的来了
这一章基本全都是“惊讶” ,学习c语言时都了解过,但不知道细节。读这一章就像揭开了一层面纱一样。
这一章基本全都是之前没学过的内容,以至于我只要把本章的目录简单偷过来,就是本章的重点
7.1 编译器驱动程序: 详细介绍了编译的过程: c预处理器cpp -> 编译器ccl -> 汇编器as -> 链接器 ld
7.2 静态链接 : 介绍了静态链接的流程:符号解析 重定位
7.3 7.4 7.5:介绍了讲静态链接的前置知识:目标文件、符号和符号表
7.6.2 : 介绍了如何打包生成静态库以及与静态库链接
7.6.3 :很重要!介绍了静态链接的细节,以及容易出错的地方
动态链接:与加载的时候链接的类型
库打桩机制
第八章 异常控制流
最重要的一章之一,介绍了并发编程的基础——异常控制流
介绍了进程,简单带领读者入门了并发编程
讲了信号,有助于以后学习事件驱动的GUI编程
这一章基本全都是之前没学过的内容,以至于我只要把本章的目录简单偷过来,就是本章的重点
8.2 异常
8.3 进程
8.4 用C语言操作进程:fork execve
8.5 信号 SIGINT …
第九章 虚拟内存
最重要的一章之一
这一章基本全都是之前没学过的内容,以至于我只要把本章的目录简单偷过来,就是本章的重点
本章可以分为三部分
第一部分介绍了虚拟内存的工作机制,在9.6 详细介绍了虚拟地址是如何被翻译成物理地址的
第二部分介绍了Linux上的虚拟内存,并在这个角度观察了上一章讲的 fork 和execve
第三部分介绍了一个内存分配器的实现( malloc() )
第十章 系统级 I/O
这一章读起来很简单,没有什么要理解的东西
首先介绍了Linux的文件,即每个IO设备都被抽象成了文件,每个文件都有一个文件描述符,通过这个描述符 加上 操作文件的函数,可以对IO设备进行访。
然后着介绍了RIO包,即包装后的IO函数。
本章完
第十一章 网络编程
这一章需要理解的地方不多,只有介绍网络编程的部分
第二和第三部分,如果不好好实践一番,光靠眼睛看,是很难理解的。
首先介绍了网络编程
接着介绍了Linux的套接字函数
最后实现了一个小web服务器
11.5.3 HTTP事务 介绍了在命令行的HTTP协议使用,有助于更深刻地理解HTTP协议
第十二章 并发编程
和上一章差不多的感觉
本章也分为三部分
首先介绍了实现并发编程的三种方法
- 进程
- IO多路复用
- 线程
之后 介绍了用信号量同步线程的方法,同时实现了一个并发服务器。
最后介绍了并发编程容易出现的问题:死锁、访问共享变量 …