前言
标题有点夸张了,但是这是我个人强烈推荐的一本书。最开始是在图书馆借的,后来粗略看了第一遍之后,果断入手了,中文版原价是139元,这本书就是大名鼎鼎的CSAPP(Computer Systems: A Programmer’s Perspective ),中文版被翻译成了《深入理解计算机系统》。
为什么推荐
目前其中文版的评分为9.8分,可见其优秀程度。那么这本书有哪些特点呢?在我个人看来,主要有以下几个方面:
- 有深度,但又点到为止。
- 实践性强
- 易读,注意这里易读不是简单,而是读起来非常顺畅
- 第三版印刷质量良心
- 硬件、系统、软件系统结合,构成一整个框架,让你对计算机有一个整体的认识
讲了什么
那么这本书到底讲了什么呢?
作为一个程序员,你平常所接触到的东西在计算机中处于什么样的位置?你对整个计算机系统有整体的认识吗?本书阐述了一些计算机系统的核心概念。以下问题你能回答吗:
- 一个hello world从本文内容到运行打印出来hello world经历了哪些过程?
- 在计算机中,信息是如何表示的?
- 程序的机器级表示又是怎么样的?
- 处理器又是如何处理这些指令的?
- 程序性能应该从哪些角度来优化?
- 存储器的存储结构是怎样的?
- 链接是什么?为什么它那么重要?
- 异常,中断又是怎么回事?
- 虚拟内存是如何工作的?
- 文件是如何访问的
- 网络编程需要注意什么?
- 并发程序的编写有什么技巧?
没错,本书从计算机的底层,循循善诱,一步步往上介绍,虽然不会面面俱到,但让你对整个计算机体系有一个整体的概念。
如果你不能回答以上问题,那么看完本书,至少让你知道:
- 一个程序需要经历预处理,编译,汇编,链接这样的过程,了解进程,线程,虚拟内存,堆,栈,文件,并行和并发等概念。
- 二进制又是如何构建出现代计算体系,各种数据类型又是如何存储,为什么会有大小端等问题?prinf为什么总遇到一些奇怪的数值问题?
- 计算机执行指令的过程是怎样的,它们又是如何操纵数据的,那些算术或逻辑操作,条件控制又是如何处理的
- 处理器执行指令有什么特点,根据执行特点我们可以如何写出性能良好的程序
- 局部性原理是什么?为什么利用它能够写出性能优异的程序?实际中又该如何写才能极大提高性能?
- 高速缓存有什么用,命中缓存和不命中缓存有什么差别?
- 你的多个.c编译后是如何组织在一起的?静态库和动态库有什么区别?elf文件又是什么?
- 进程是如何创建出来的?什么是上下文切换?信号又是什么?
- 程序的地址空间是怎样的?内存映射,动态内存分配,垃圾回收都是怎么回事?C程序要注意哪些内存问题?
- 如何读写文件,重定向是怎么回事?
- 如何编写网络程序?
- 并发编程又有哪些实现方式,都有什么特点?
除了知道上面这些内容,你还可以通过每个章节后面的习题进行提高,最后也提供习题的答案。而书中也还有很多地方会给你一些提示,同时里面也会告诉你一些小技巧,如命令行输入man ascii可以得到一张ascii表。
适合哪些人
本书并不适合初学者,而在阅读本书时,最好有一定的Linux/C/C++基础,书中的很多例子也都是C语言实现的。同时,如果你完全没有听过前面提到的各种概念,那么你阅读起来可能也会比较困难,尤其是机器级表示和处理器体系结构章节,对于没有学习过汇编的人来说会相当困难。不过私以为可先关注其他章节。
而看这些有什么用呢?说实话,我也说不出来,不过相信你在遇到一些奇奇怪怪的问题的时候会想起它里面的内容,例如
- 挂死
- 无大文件,磁盘占满
- 内存耗尽
- 链接出错
- ……
但是可以肯定的是,你在不同的阶段去读它,都会有收获。
如何阅读
看前言。看书,做题,编写并运行程序。
总结
如果你想成为一个更加优秀的程序员,那么这本书你不应该错过。不过如果想要完全搞懂每个章节的内容,那么你还需要阅读其他相关书籍进行补充,它并不能面面俱到。不过对于了解整个计算机体系来说,它非常优秀了。
不说了,吹吹灰,感觉还没有吹够。