Bryant, R.E所著的这本Computer Systems: A Programmer's Perspective,在国内翻译为《深入理解计算机系统》,由中国电力出版社2004出版,应该算是一本重量级的书了。从同学推荐到今天看完,足足花了有5个月的时间,虽然看得不深,但总的感觉还是不错,在这里就对它作一个总结吧。
Computer Systems表明这本书讲解的是计算机系统知识,但A Programmer's Perspective却又告诉我们它与其它书籍的不同之处,便是从程序员的角度,即偏向软件的角度,而不过多地涉及硬件内容。计算机系统本身就是一门涉及面广,内容繁多的学科,这本书不可避免地从各个角度讲解了这些内容。下面以我个人的观点进行一些总结。
第1章:计算机系统漫游
主要是对全书内容作了一个简要的概括。
第2章:信息的表示和处理
这一章主要讲解了整数与浮点数。虽然对于整数我们已经很熟悉了,但是在实际中仍会犯下各种各样的错误,书中对不同整型数间的转换及运算作出了很详细的论述。浮点数似乎一直是计算机书籍里不愿涉及的话题,对于想了解浮点数表示及浮点数运算的人来说,这部分关于浮点的描述可以作为一个很好的起点。
第3章 程序的机器级表示
对于任何一个希望了解底层的人来说,这一章可说是相当精彩的。本章主要讲解了IA32的指令集,因此以汇编为主,在控制流指令部分还将C语言及对应的汇编形式进行了对照,在调用部分还详细讲解了本地栈。最后为对浮点感兴趣的人准备了IA32中用于处理浮点的指令集。
第4章 处理器体系结构
这一章是本书中最接近硬件的部分了,从设计一个简单的处理器Y86出发并逐步完善它,一步步地引导读者理解处理器体系结构。虽然我们可能永远也不会自己设计处理器,但了解它是何工作的能有助我们理解整个计算机系统是如何工作的,比如对程序优化就很有帮助。本章首先给出了Y86的指令集,并使用一种硬件描述语言HCL对硬件的逻辑结构进行了描述,然后将指令分成取指、译码、执行、访存、写回、更新PC六个阶段,给出了每条指令的每一部分的操作内容,并对每一部分的硬件实现分别进行了讨论。显然,这种顺序的实现过程是低效的,本章的后面部分便围统着流水线的实现以及遇到的问题展开了论述。
第5章 优化程序性能
本章介绍了一些代码优化的内容,如前面所说,只有理解了处理器系统才能充分地利用处理器资源,进行更好的优化,于是这部分除了讲解如何优化外,还说明了为什么要这么做。
第6章 存储器层次结构
本章主要讲述存储器的相应知识,这里的存储器不专指内存,如SRAM、DRAM、磁盘。从局部性原理原理展开,引出计算机系统一个重要的概念:层次结构。后面则主要针对高速缓存及如何利用高速缓存加快程序运行速度进行了讨论。
第7章 链接
链接是生成程序的最后一步,对这方面进行描述的书籍不多,大概也是因为很长一段时间内,链接过程并没有发生本质变化的缘故吧。具体内容可以参见我对这一章的总结。
第8章 异常控制流
这里所说的异常控制流不是专指C++中的异常处理。书中将异常定义为控制流的突变,用来响应处理器状态中的某些变化。这样,中断、系统调用、信号都属于本章讨论的范围了。个人觉得这一章写得比较杂,涉及的内容有:进程(多任务操作系统下的执行、用户/内核模式及二者切换、Linux下的一些关于进程的系统调用)、信号,最后对C中的非本地跳转进行了介绍(setjmp及longjmp)。
第9章 测量程序执行时间
在现代多任务的操作系统环境下,要想精确地测量程序执行的时间是很困难的,本章对此进行了讨论,不过对运行时间的影响因素太多了,本章的内容作为一个了解就可以了。
第10章 虚拟存储器
可以说这一章是继第4章后的重要一章了。本章主要讨论了虚拟存储器,并对物理地址与虚拟地址的转换进行了论述,同时也涵盖了高速缓存的内容。后半部分则讲述了内存分配/释放策略,这也是一个很重要的内容。
第11章 系统级I/O
主要介绍了在unix/linux系统下一些关于I/O方面的系统调用函数。
第12章 网络编程
主要介绍了socket的一些知识,并给出了一个简单的Web服务器的实现。
第13章 并发编程
主要从进程、I/O多路复用及线程三个方面介绍了并发编程的基本内容,并对信号量、生产者-消费者模型及其它并发性问题如死锁进行了讨论。
总的来说,这本书对重要的概念讲解得比较透彻,为了保证完整性,涉及的内容较多,有些章节的讲解则很简单,特别是后面三章的内容,要深入学习需要参考其它著作。
Computer Systems表明这本书讲解的是计算机系统知识,但A Programmer's Perspective却又告诉我们它与其它书籍的不同之处,便是从程序员的角度,即偏向软件的角度,而不过多地涉及硬件内容。计算机系统本身就是一门涉及面广,内容繁多的学科,这本书不可避免地从各个角度讲解了这些内容。下面以我个人的观点进行一些总结。
第1章:计算机系统漫游
主要是对全书内容作了一个简要的概括。
第2章:信息的表示和处理
这一章主要讲解了整数与浮点数。虽然对于整数我们已经很熟悉了,但是在实际中仍会犯下各种各样的错误,书中对不同整型数间的转换及运算作出了很详细的论述。浮点数似乎一直是计算机书籍里不愿涉及的话题,对于想了解浮点数表示及浮点数运算的人来说,这部分关于浮点的描述可以作为一个很好的起点。
第3章 程序的机器级表示
对于任何一个希望了解底层的人来说,这一章可说是相当精彩的。本章主要讲解了IA32的指令集,因此以汇编为主,在控制流指令部分还将C语言及对应的汇编形式进行了对照,在调用部分还详细讲解了本地栈。最后为对浮点感兴趣的人准备了IA32中用于处理浮点的指令集。
第4章 处理器体系结构
这一章是本书中最接近硬件的部分了,从设计一个简单的处理器Y86出发并逐步完善它,一步步地引导读者理解处理器体系结构。虽然我们可能永远也不会自己设计处理器,但了解它是何工作的能有助我们理解整个计算机系统是如何工作的,比如对程序优化就很有帮助。本章首先给出了Y86的指令集,并使用一种硬件描述语言HCL对硬件的逻辑结构进行了描述,然后将指令分成取指、译码、执行、访存、写回、更新PC六个阶段,给出了每条指令的每一部分的操作内容,并对每一部分的硬件实现分别进行了讨论。显然,这种顺序的实现过程是低效的,本章的后面部分便围统着流水线的实现以及遇到的问题展开了论述。
第5章 优化程序性能
本章介绍了一些代码优化的内容,如前面所说,只有理解了处理器系统才能充分地利用处理器资源,进行更好的优化,于是这部分除了讲解如何优化外,还说明了为什么要这么做。
第6章 存储器层次结构
本章主要讲述存储器的相应知识,这里的存储器不专指内存,如SRAM、DRAM、磁盘。从局部性原理原理展开,引出计算机系统一个重要的概念:层次结构。后面则主要针对高速缓存及如何利用高速缓存加快程序运行速度进行了讨论。
第7章 链接
链接是生成程序的最后一步,对这方面进行描述的书籍不多,大概也是因为很长一段时间内,链接过程并没有发生本质变化的缘故吧。具体内容可以参见我对这一章的总结。
第8章 异常控制流
这里所说的异常控制流不是专指C++中的异常处理。书中将异常定义为控制流的突变,用来响应处理器状态中的某些变化。这样,中断、系统调用、信号都属于本章讨论的范围了。个人觉得这一章写得比较杂,涉及的内容有:进程(多任务操作系统下的执行、用户/内核模式及二者切换、Linux下的一些关于进程的系统调用)、信号,最后对C中的非本地跳转进行了介绍(setjmp及longjmp)。
第9章 测量程序执行时间
在现代多任务的操作系统环境下,要想精确地测量程序执行的时间是很困难的,本章对此进行了讨论,不过对运行时间的影响因素太多了,本章的内容作为一个了解就可以了。
第10章 虚拟存储器
可以说这一章是继第4章后的重要一章了。本章主要讨论了虚拟存储器,并对物理地址与虚拟地址的转换进行了论述,同时也涵盖了高速缓存的内容。后半部分则讲述了内存分配/释放策略,这也是一个很重要的内容。
第11章 系统级I/O
主要介绍了在unix/linux系统下一些关于I/O方面的系统调用函数。
第12章 网络编程
主要介绍了socket的一些知识,并给出了一个简单的Web服务器的实现。
第13章 并发编程
主要从进程、I/O多路复用及线程三个方面介绍了并发编程的基本内容,并对信号量、生产者-消费者模型及其它并发性问题如死锁进行了讨论。
总的来说,这本书对重要的概念讲解得比较透彻,为了保证完整性,涉及的内容较多,有些章节的讲解则很简单,特别是后面三章的内容,要深入学习需要参考其它著作。
评论