CSAPP
陆陆续续花了2个月的时间终于把这个久负盛名的CSAPP看完了,不愧为一本名副其实的经典书籍。有种相见恨晚的感觉,以至于从不会写书评的我也情不自禁的想说点什么。
这本书的书名叫”Computer Systems: A Programmer's Perspective",从程序员的角度去理解计算机系统,也暗示了书中讲的任何内容都会和程序员所做的事情联系起来。就这点看来,书的中文名取的不好。
第一章是引子,通过任何编程书里都作为第一个程序的”hello world“来分析了整个软件硬件系统。不错,本书要讲的都在第一章里涵盖了。高级语言通过编译链接后在计算机系统里是如何表示和执行的?这是个引子,同时也是summary。看完这章马上提起了我的兴趣,以前学过的课程和看过的书,要么是从讲某一种高级语言,要么是完全不涉及软件的计算机组成原理。至于怎么将两者联系起来,恐怕大部分程序员都没有这样的概念。
第二章回顾了整数浮点数的二进制表示,以前学过,但是恐怕很多也忘得差不多了。这章感觉最深的是无符号和有符号数,在代码中尤其要注意两种数据计算时上溢下溢的问题。
第三章主要是讲汇编语言,以前也学过这个课程,记得当年的老师是某某博士,十句话中至少有九句”那么也就是说“,以至于大家都不听课,唉,这样的老师真是误人子弟啊!但是当今大学里这样的只会搞科研而不会教书的老师太多了。这章的独特之处是把高级语言写的程序和对应的汇编代码联系起来了,对照着理解,方明白机器是如何实现语言级别的设计。
第四章属于体系结构的知识,讲了CPU的指令集,流水线等等。甚至还重点描述了HCL做硬件设计,算是很深入的一个主题了。
第五章的名字特别吸引人---“优化程序性能”,在程序员的日常开发中,设计和优化部分可能占的比例最大。一个模块一旦设计好了之后,写代码是很快的。功能实现之后恐怕就一头栽进了性能优化方面的工作了。这章针对一个简单例子竟然从五六个方面进行了优化,尤其这里把指令流水线也考虑进去了。恐怕对我等普通程序员来说也是从来没有想到过的。
第六章讲存储器的层次结构,这部分是程序员直接能感受到的。整天沉溺于分配内存释放内存之中的我们了解最多的是内存和硬盘,而这章中着重讲的是两级高速缓存的原理以及告诉缓存级别的代码优化。如果配以valgrind的machgrind来分析程序的话能加深对这部分的理解。
第七章讲链接,这个主题也是编程类书籍少有涉及的,如果内容再多点就好了。《Linkers and Loaders》和《程序员的自我修养》这两本书应该很值得参考。
接下来第八章讲异常控制流,不过这里的控制流不仅仅是程序中的exception。从底层硬件到高层语言,每一级别都有异常,如何处理这些异常,也是程序员需要时时注意的问题。
第九章分析了测量程序执行时间,这个分析程序瓶颈时经常需要做的事情。不过这章更深层的分析了如何能够得到准确的执行时间,尽管操作系统提供了获取时间的借口,但是我们并没有考虑过其准确度和精确度。
第十章恐怕是喜欢的人最多,虚拟存储器,与程序运行直接相关的一个概念。这部分的学习对于每个程序员来说是必须的,否则的话总会迷茫于sizeof数组如何得到数组长度的疑问中。
后面三章讲了系统级I/O,网络编程和并发编程。这部分的内容与硬件关系少一些了,主要是进程和线程级的。内容不多,但是每一部分都值得深入学习。
本书的一个目的是要把阅读者带入权威程序员行列,巧合的是我也是在阅读这本书期间升职到senior(看来真是要感谢作者)。当然和权威还差的远,但是看完这本书能让你理解整个计算机系统。以后的编程中你的思路更广,考虑的问题也会更全面。
除了书中介绍的这些内容,我想还能将计算机系统中的一些设计思想放到面向对象的设计思想中。像存储器的层次结构和虚存何尝不代表了封装的思想呢?是啊,面向对象的思想本身就是无处不在的。
中文版翻译的整体还行吧,但是还是少不了很多僵硬的英语化的句子。另外,发现了19个不知是印刷错误还是翻译错误,却不知道如何向译者反应。
CSAPP的更多相关文章
- 在Ubuntu下使用 csapp.h 和 csapp.c
它山之石可以攻玉. 对于<深入理解计算机系统>这本神人写就的神书, 我等凡人就不评论什么啦. 这本书的 第二,三 部分, 真的真的对我理解操作系统有很大的帮助. (当然, 如果你不看第一部 ...
- CSAPP读书随笔之一:为什么汇编器会将call指令中的引用的初始值设置为-4
CSAPP,即<深入理解计算机系统:程序员视角>第三版,是一本好书,但读起来确需要具备相当的基本功.而且,有的表述(中译文)还不太直白. 比如,第463页提到,(对于32位系统)为什么汇编 ...
- 深入理解计算机中的 csapp.h和csapp.c
csapp.h其实就是一堆头文件的打包,在http://csapp.cs.cmu.edu/public/code.html 这里可以下载.这是<深入理解计算机系统>配套网站. 在头文件的# ...
- CSAPP(前言)
很久之前就听过有过CSAPP这本书的传闻了,今天终于决定上手这本神作:既然是神作,就要仔细拜读一下,今天看了一下前言部分还真的令人耳目一新,单单是前言部分就让我学习到几个新的知识点: 1.c和Java ...
- CSAPP缓冲区溢出攻击实验(上)
CSAPP缓冲区溢出攻击实验(上) 下载实验工具.最新的讲义在这. 网上能找到的实验材料有些旧了,有的地方跟最新的handout对不上.只是没有关系,大体上仅仅是程序名(sendstring)或者參数 ...
- 读完了csapp(中文名:深入理解计算机系统)
上个星期最终把csapp看完了. 我买的是中文版的,由于除了貌似评价不错以外,由于涉及到些自己不了解的底层东西,怕是看英文会云里雾里.如今看来,大概不能算是个长处,可是的确可以加快我的看书速度,否则一 ...
- CSAPP Lab2: Binary Bomb
著名的CSAPP实验:二进制炸弹 就是通过gdb和反汇编猜测程序意图,共有6关和一个隐藏关卡 只有输入正确的字符串才能过关,否则会程序会bomb终止运行 隐藏关卡需要输入特定字符串方会开启 实验材料下 ...
- CSAPP LAB: Buffer Overflow
这是CSAPP官网上的著名实验,通过注入汇编代码实现堆栈溢出攻击.实验材料可到我的github仓库 https://github.com/Cheukyin/CSAPP-LAB/ 选择buffer-ov ...
- 链接器(linker)的作用——CSAPP第7章读书笔记
首先说说我为什么要去读这一章.这个学期开OS的课,在Morden Operating System上读到和Process有关的内容时看到这样一句话:“Process is fundamentally ...
- CSAPP:cachelab(1)
本项目大体上就是要求用C\C++来模拟cpu对cache的访问,然后统计hits.misses和eviction的次数.其实并没有想象中的那么难,感觉完全可以当成一道acm里面的大模拟题..下面就对这 ...
随机推荐
- .net 异步编程总结
异步的方式,就是,先发起IO.CPU密集工作等,然后函数返回,在IO.CPU密集工作等完成了以后——某个不确定的时刻,再执行后续的代码. 所以,如果使用异步代码,必须注意代码的执行顺序. 所以,异 ...
- 「Luogu P3931」SAC E#1 - 一道难题 Tree 解题报告
圆原题面 我环顾四周,发现大佬们的写法都好高端! 比较差劲的我,只能交上一份DFS的题解 思路: DFS(当然了,其他算法也行) 要想切断叶子节点到根节点的连接 就是在叶子节点和根节点之间砍掉一条边 ...
- 【原创】(十五)Linux内存管理之RMAP
背景 Read the fucking source code! --By 鲁迅 A picture is worth a thousand words. --By 高尔基 说明: Kernel版本: ...
- Session是怎么实现的?存储在哪里?
为什么有session? 首先大家知道,http协议是无状态的,即你连续访问某个网页100次和访问1次对服务器来说是没有区别对待的,因为它记不住你. 那么,在一些场合,确实需要服务器记住当前用户怎么办 ...
- C++ | C++ 基础知识 | 结构、联合与枚举
1. 结构 1.0 结构 数组是相同类型元素的集合,相反,struct 是任意类型元素的集合. 代码例子: struct Address { const char* name; int number; ...
- .Net Core - AgileHttp
2020年新年将至,先预祝.Net Core越来越好. 做了这么多年一线开发,经常跟Http打交道.比如调用三方的Webservice,比如集成微信支付的时候服务端发起Prepay支付.特别是现在分布 ...
- FNScanner二维码接口openView自定义扫码Demo
本文出自APICloud官方论坛 FNScanner 模块是一个二维码/条形码扫描器,是 scanner 模块的优化升级版.在 iOS 平台上本模块底层集成了 Zbar 和系统自带的条形码/二维码分析 ...
- java.sql.SQLException: connection holder is null 问题处理
问题描述 上上个周测试的时候突然报系统异常,于是我立即查看日志,发现是一个数据库异常:java.sql.SQLException: connection holder is null我第一想到的就是可 ...
- redis简单操作
一.redis 基础操作 1.1.string 类型及操作 string 是最简单的类型,一个key对应一个value,string类型是二进制安全的.redis的string可以包含任何数据. 1. ...
- jav设计模之的动态代理
在学习Spring的时候,我们知道Spring主要有两大思想,一个是IoC,另一个就是AOP,对于IoC,依赖注入就不用多说了,而对于Spring的核心AOP来说,我们不但要知道怎么通过AOP来满足的 ...