《深入理解计算机系统》-必读好书

前言

标题有点夸张了,但是这是我个人强烈推荐的一本书。最开始是在图书馆借的,后来粗略看了第一遍之后,果断入手了,中文版原价是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语言实现的。同时,如果你完全没有听过前面提到的各种概念,那么你阅读起来可能也会比较困难,尤其是机器级表示和处理器体系结构章节,对于没有学习过汇编的人来说会相当困难。不过私以为可先关注其他章节。

而看这些有什么用呢?说实话,我也说不出来,不过相信你在遇到一些奇奇怪怪的问题的时候会想起它里面的内容,例如

  • 挂死
  • 无大文件,磁盘占满
  • 内存耗尽
  • 链接出错
  • ……

但是可以肯定的是,你在不同的阶段去读它,都会有收获。

如何阅读

看前言。看书,做题,编写并运行程序。

总结

如果你想成为一个更加优秀的程序员,那么这本书你不应该错过。不过如果想要完全搞懂每个章节的内容,那么你还需要阅读其他相关书籍进行补充,它并不能面面俱到。不过对于了解整个计算机体系来说,它非常优秀了。

不说了,吹吹灰,感觉还没有吹够。

守望 wechat
关注公众号[编程珠玑]获取更多原创技术文章
出入相友,守望相助!