来源:华章计算机

作者:木羊同学

导读:如果你也读CS专业,如果你也不知道怎么回答“学计算机不就是学修电脑”这个CS系的宿命之问,推荐一定读一读《深入理解计算机系统》。

《深入理解计算机系统》是一本什么样的书呢?两个字,经典。原因有二,第一,这书无数业界大牛推荐,第二,这书和你印象中的经典一样,给人的第一感觉就是厚实。不过,厚实也很容易再给人一种感觉,那就是望而却步——你没准会想,这么厚的书,又是经典,是不是很难读?

大可放心,一点也不会。

经典也是有细分领域的,有很多书之所以经典,是因为对一些问题进行了很深入的探讨,而《深入理解计算机系统》的经典,我认为是把计算机中被分割成很多块的知识,用一本书一口气完整地全部整理出来。

1《深入理解计算机系统》为什么经典

我们先回想一下,计算机专业都开设有哪些专业课。首先肯定有编程,这个专业很大一部分工作是要给码农培养接班人。编程的一个重要环节是编译,那设计编译器要开一门课,叫编译原理。编译完了要运行,运行需要依赖硬件环境和软件环境,于是就有了计算机组成原理和操作系统。如果早个二三十年,计算机的知识体系到这就差不多了,不过现在可是网络时代,所以还得再加一门课,叫计算机网络。这还是往大了分,细分就更多了,光编程语言就有好几种,而且别忘了背后还有一堆的各种数学,就不细说了。

计算机技术蓬勃发展,学科体系自然枝繁叶茂,但学计算机很容易就像在追冰与火之歌一样,世界观太宏大支线剧情太多,眼前很难呈现出一幅完整的图景。所以当时我们学各门学科的时候,大家问的最多的不是学科本身的某个知识点,而是“为什么要学这门课”。刚才我把各个主要科目串了一串,读完应该会对各科之间的关系有一个更宏观的了解。

可是,光有这么一句话肯定还有很多问题没法解决。有没有一本书专从这个角度讲计算机科学呢?计算机科学有很多经典的书,但大多数都是专注各个领域的内部知识,不过好在还真有一本经典的书,是从计算机的角度来看待计算机,这就是《深入理解计算机系统》。

我当初读《深入理解计算机系统》,读完就是一个感觉,淋漓畅快。感觉脑子里很多零星的碎片,读完以后都拼在了一起。《深入理解计算机系统》书很厚,讲的也深入,但深入的是知识点与知识点之间的关联,也许很多正好都是你深感困扰的问题,读完很容易让你有种“哦,原来是这样”的感叹,节省了很多去苦苦思索的时间。写本文的时候我特意看了一下大家对《深入理解计算机系统》的书评,果然很多人感受和我一样,相见恨晚。

2《深入理解计算机系统》都写了什么

《深入理解计算机系统》这本书起源于卡内基梅隆大学(CMU)的一门课,叫计算机系统导论(ICS)。这门课相信计算机系的学生都不会陌生,一般都是作为第一门专业课开设的,内容基本就是回答大家刚入坑时最想知道的那个问题:学计算机都学些什么。对于我来说,这是当时唯一一门从计算机整体视角来开展介绍的课程,在那以后,我们就被扔进各个子学科里面扑腾,再也难一窥全貌。

《深入理解计算机系统》的作者们很谦虚,说这本书起源于ICS,但经过3版的不断扩充内容,涵盖范围已经很广,现在也可以作为计算机组成原理(ORG)和系统编程(SP)的教材,但我觉得,这本书的用途远不止于“教材”。

相信每个学完计算机的学生都会认同,学计算机,编程也好其它什么也好,最佳的方法就是动手,亲自动手做一次,比看什么书都掌握得牢靠。但是,这就带来一个悖论:学计算机,最好的方法就是去做一台计算机,计算机专业教的内容一言蔽之,确实就是怎样去制造计算机运行的各个所需部件,但限制条件非常多,真正动手撸一台计算机不太现实。

那怎么办呢?我经常在B站围观大牛完成各种精巧的小玩意,看了一遍,感觉自己也像是做了一遍,虽然肯定没有自己动手来得实在,不过肯定比只看纯描写要好得多。那我们是不是能退而求其次,“看”别人一个部件一个部件地撸一台计算机呢?《深入理解计算机系统》就是从这个理念出发写成了本书。

3《深入理解计算机系统》第3版都改了什么

《深入理解计算机系统》是一本经典书,现在已经出到了第3版,正好我手里第2版和第3版都有,顺手先一个比较。

总的来说,第3版基本沿用了第2版的框架,但也有不少变化。首先第3版有两个直观变化,一个是更厚了一点,一个是印刷更好看了,第2版是最经典的黑白印刷,第3版加入了蓝色,正好这本书里面很多代码图表,看起来更醒目了。

在内容上第3版也做了大量修改。第2版和第3版大概相差10年,在第2版上市的时候,IA32架构,也就是我们俗称的32位指令集还是主流,但到了现在,已经是64位指令集,也就是x86-64的天下了。第3版也体现了技术的变化,指令集的表现形式均采用64位。指令集是非常底层的东西,所以这部分牵涉了很多内容,书里都做了全面调整。

另一个内容上的大改动是API的升级,譬如在第11章,第3版用新的getaddrinfo和getnameinfo函数取代了老版的gethostbyname和gethostbyaddr。

此外还有不少细节上的调整甚至重写,也对一些容易让人困扰的知识点进行了扩充说明,总的来说阅读体验比上一版更好。

4《深入理解计算机系统》漫游指南

《深入理解计算机系统》一共12章,分成程序结构和执行、在系统上运行程序和程序间的交互和通信三个部分,涉及了计算机技术的方方面面,横跨多个科目。下面我就毛遂自荐充当各位的导游,和大家一起逐章看看都讲了哪些内容。

第一章,章名就叫“计算机系统漫游”,可以认为是这本书的“计算机导论”课,以一个hello程序为主线,串起了从编代码到程序执行整个过程都经历了哪些环节。最后有一个知识点,叫“Amdahl定律”,研究各个部件的性能提升和整体性能提升的关系。

第二章,叫“信息的表示和处理”,介绍了一些数字逻辑的内容,也就是计算机的“计算”部分。计算可分为数值类型和运算类型两个组成部分,在数学体系里,数的类型有很多,譬如自然数、整数、有理数、无理数、代数数、超越数、实数等等,光数系都是数学里的重点研究对象,不过别担心,计算机里边就简单多了,目前只分为整数和浮点数两类。

第二章也是“程序结构和执行”部分的第一章,往下都是从机器角度看程序构造。

第三章,叫“程序的机器级表示”,名字挺拗口,其实说的就是指令集的事。计算机专业一般不会为CPU指令集专门开一课,很多知识点和汇编语言说的内容重合,前面说的全面调整为x86-64体系,在这个部分体现得很充分。

第四章,叫“处理器体系结构”,讲的是CPU的工作原理。不要和上一章搞混了,CPU的指令集,和CPU本身的结构原理有关系,但不完全是一回事,这一章更多的是逻辑电路相关的内容,介绍诸如时钟周期、流水线等偏硬件内容。

第五章,叫“优化程序性能”,章名就已经很明确,划分知识点的话大部分属于编译原理范畴。我们上编译原理主要讲的是各种文法和实现诸如词法器这类的部件,不过这都属于基本功,真正的重点和难点在于优化。当然程序性能优化不止编译优化,这是一套体系,还有内存、存储等多个地方都可以进行优化。要想看编译原理的基本功部分,推荐看龙书。

第六章,叫“存储器层次结构”,就是我们所说的内存外存了,涉及磁盘构造、缓存设计等等问题。

第七章,叫“链接”,这是源码编译的一个重要环节。回忆一下编译原理对编译过程的介绍,源码编译不是直接从源码编译成目标代码,也就是不是直接生成机器码,而生成一种叫“中间代码”的产物。以中间代码为界,前面叫“前端”,对应的还有一个“后端”,就是通过中间代码最终生成目标代码,链接就是这个过程的一个重要环节。第七章也是“在系统上运行程序”部分的第一章,往下主要是从操作系统的角度看程序运行性的各种情况。

第八章,叫“异常控制流”,“异常”这个概念大家肯定都听过,不过这里主要指的是操作系统中的异常及中断的工作流程,不过也简要讨论了高级编程语言中的异常。

第九章,叫“虚拟内存”,虚拟内存在现代操作系统中非常重要,这一章主要讨论虚拟内存的各种管理机制,以及现在很热门的垃圾收集(GC),还延伸了一点安全人员很感兴趣的内存泄露方面的讨论。

第十章,叫“系统级IO”,主要介绍文件系统的读写等操作接口。要是能对文件系统本身多展开一点内容就更好了。这一章也是“程序间的交互和通信”部分的第一章,往下说的就都是各种IO了。

第十一章和第十二章分别介绍了“网络编程”和“并发编程”,至此主流的各种IO就全部介绍了一遍。

5推荐阅读

被誉为“价值超过等重量黄金的无价资源宝库”,理解计算机系统首选书目,十余万程序员的共同选择。

卡内基-梅隆大学、北京大学、清华大学、上海交通大学等国内外众多知名高校选用指定教材。

从程序员视角全面剖析的实现细节,使读者深刻理解程序的行为,将所有计算机系统的相关知识融会贯通。

本书是一本将计算机软件和硬件理论结合讲述的经典教程,内容覆盖计算机导论、体系结构和处理器设计等多门课程。本书的最大优点是从程序员的角度描述计算机系统的实现细节,通过描述程序是如何映射到系统上,以及程序是如何执行的,使读者更好地理解程序的行为,以及程序效率低下的原因。

如何使用本书从程序员的角度来学习计算机系统是如何工作的会非常有趣。最理想的学习方法是在真正的系统上解决具体的问题,或是编写和运行程序。这个主题观念贯穿本书始终。因此我们建议你用如下方式学习这本书:

  • 学习一个新概念时,你应该立刻做一做紧随其后的一个或多个练习题来检验你的理解。这些练习题的解答在每章的末尾。要先尝试自己来解答每个问题,然后再查阅答案。

  • 每一章后都有一组难度不同的作业题,这些题目需要的时间从十几分钟到十几个小时,但建议你尝试完成这些作业题,完成之后你会发现对系统的理解更加深入。

  • 本书中有丰富的代码示例,鼓励你在系统上运行这些示例的源代码。

  • 向老师或他人请教和交流是很好的学习方式。

6如何送书

在这篇文章下方留言 + 这篇文章的再看,我会选取留言点赞量最高的 3 位同学,送出这本书,截止时间至 8月 10 日晚 12 点。

当然,各位读者朋友们你也可以在当当或京东上购买到这本书。

如何阅读《深入理解计算机系统》?(文末送书)相关推荐

  1. 性能无敌的HikariCP数据库连接池实战(文末送书)

    导读:数据库连接池在Java数据库相关中间件产品群中,应该算是底层最基础的一类产品,作为企业应用开发必不可少的组件,无数天才们为我们贡献了一个又一个的优秀产品,它们有的随时代发展,功成身退,有的则还在 ...

  2. 张益唐被曝已证明黎曼猜想相关问题,震动数学界(文末送书)

    金磊 Alex 发自 凹非寺 量子位 | 公众号 QbitAI 文末送书活动,记得看完啊 ! 先加群后抽奖,这次仅限群友参与 Breaking News! 网传数学家张益唐,已经攻克了朗道-西格尔零点 ...

  3. 程序员常用工具集合(建议收藏)--文末送书

    点击上方[全栈开发者社区]→右上角[...]→[设为星标⭐] 面试题一:跳槽涨薪季面试题之java基础(一) 面试题二:跳槽涨薪季面试题之java8特性(二)--文末送书 面试题三:跳槽涨薪季面试题之 ...

  4. 文末送书 | WAF 那些事

    Hi!,我是小小,这是小小本周的最后一篇,本篇将会介绍WAF的事情,本篇将会文末送书.在此小小举出小手,相当欢迎各位快点快点快点参加. 什么是WAF WAF是一种产品,一种web应用防火墙,通过执行一 ...

  5. 文末送书 | 数据分析简单入门

    这是小小本周的最后一篇,本周重点!文末送书, 我是小小,下面是本期文章,为您奉上! 前言 本实例将会以一个完整的例子用来阐述一个较为简单的Python数据分析.其中Python基础部分不再讲解 构建数 ...

  6. 统计学5大基本概念,建议收藏!(文末送书)

    转自:爱数据LoveD 大家好,我是小z,也可以叫我阿粥~ 今天给大家分享一波统计学重要概念,顺便前排提示文末送书~ 从高的角度来看,统计学是一种利用数学理论来进行数据分析的技术.象柱状图这种基本的可 ...

  7. 文末送书|用Pandas分析了75w多条数据,揭秘美国选民的总统喜好!

    点击"一行数据",选择"置顶公众号" 文末送书,不可错过! 来源:天池大数据科研平台 原文:https://tianchi.aliyun.com/noteboo ...

  8. 【文末送书】豆瓣9.3,这部神作终于出新版了!

    不久前,自称"业余up主"的AI大神李沐开源了一个剪辑神器 ,再圈一波技术粉! 图1:该项目在github上的页面展示 事实上,这位up主可并不业余,反而是妥妥的AI界卓越先驱.对 ...

  9. 【iToday】涵盖100+技术网站的一站式资讯平台 | 文末送书

    里面包含了上百个IT网站,欢迎大家访问:http://itoday.top/#/ iToday,打开信息的新时代.作为一家创新的IT数字媒体平台,iToday致力于为用户提供最新.最全面的IT资讯和内 ...

  10. 媳妇居然在家偷偷背着我偷看我的面试笔记,一个月后拿下大厂offer!(文末送书)...

    知乎热议: 到底要掌握哪些技术才能顺利的找一份20K的工作? 根据这些年的工作经验,加上网络搜集,我特意整理了一套针对职场进阶的干货! 有很多朋友靠着这些内容进行复习拿到了BATJ等大厂的offer, ...

最新文章

  1. BigData之Storm:Apache Storm的简介、深入理解、下载、案例应用之详细攻略
  2. 数据结构--队列(数组)的一种实现
  3. cxgrid动态创建列
  4. python2/python3安装pip/pip3及使用国内镜像源(python2/3同时安装)
  5. 【SQL】表A多个字段,关联表B一个字段说明
  6. 亲儿子 | Azure SignalR 服务现在支持 ASP.NET
  7. 腾讯视频下载安装_如何上传视频到腾讯视频平台
  8. vue+webpack 安装常见插件
  9. pq 中m函数判断嵌套_你还在用IF函数进行逻辑判断吗?试试PQ,简单又实用
  10. selenium弹窗无法定位_Selenium异常集锦
  11. etl全量增量抽取方式
  12. C语言:计算班级平均数
  13. 计算机usb接口标志什么意思,笔记本上USB接口的标识
  14. Error 遇到错误:请求通道在等待 00:01:00 以后答复时超时。增加传递给请求调用的超时值,或者增加绑定上的 SendTimeout 值。分配给此操作的时间可能已经是更长超时的一部分
  15. IIR滤波器设计之冲激响应不变法与双线性变换法
  16. c语言数组编程题及解答,C语言数组编程题及解答
  17. python自动发邮件报554错误_python-自动化测试结果发送邮件报错(smtplib.SMTPDataError: (554, b'DT:SPM 163……)解决方法...
  18. 公共钥匙盒(C++结构体)
  19. 野火的DSP28335开发板吧代码烧写到Flash中
  20. c语言 用计数控制的循环实现正数累加求和,C语言循环结构程序设计实验五

热门文章

  1. 计算机有残留office,电脑中无法安装Office2013删除残留文件的方法
  2. mysql 字符大对象_第02期:MySQL 数据类型的艺术 - 大对象字段
  3. redis命令-key操作
  4. TB6600原理图(最完整并量产过的版本!!)
  5. 微软为无服务器架构引入新API管理消费层
  6. MED-V服务器的部署与配置
  7. 【UI自动化测试】Mac下进行Monkey测试
  8. 七牛云存储Python SDK使用教程 - 上传策略详解
  9. Webserver推送技术
  10. 微观经济学现代观点(Hal R. Varian) 复习题 1.1