CS:APP 读后感

CS:APP 读后感

这本书,给了我 一个在Linux下运行的程序 的直观印象。下面是每一章让我产生 “惊讶” 的内容,这些内容是我在这本书中新接触到的内容。(以下内容是在阅读完第一遍之后,第二遍之前写的)

接下来会陆续更新各章的详细笔记 …

介绍

目录:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
第1章    计算机系统漫游
--- 程序结构和执行
第2章 信息的表示和处理
第3章 程序的机械级表示
第4章 处理器体系结构
第5章 优化程序性能
第6章 存储器的层次结构
--- 在系统上运行程序
第7章 链接
第8章 异常控制流
第9章 虚拟内存
--- 程序间的交互和通信
第10章 系统及I/O
第11章 网络编程
第12章 并发编程

本书一共分为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协议

第十二章 并发编程

和上一章差不多的感觉

本章也分为三部分

首先介绍了实现并发编程的三种方法

  1. 进程
  2. IO多路复用
  3. 线程

之后 介绍了用信号量同步线程的方法,同时实现了一个并发服务器。

最后介绍了并发编程容易出现的问题:死锁、访问共享变量 …