陆陆续续花了一个月的时间,终于看完了CSAPP(Computer System:A programmer‘s perspective),头一次看那么厚(900页)的原版书,看完还是有一点点成就感的。
英文版:http://www.china-pub.com/197441
中文版:http://www.china-pub.com/197167
从同宿舍的鲁博士那里第一次听说这本书,了解到该书从一个程序员的视角详细剖析了整个计算机系统,涵盖了组成原理、汇编语言、体系结构、操作系统、网络等计算机基础知识,当时就决定找工作之前一定要看看这本书,现在终于搞定,也算是间接复习了一下前述几门课程。
这次阅读用的是鲁博士的书,再次印证了买来的书没有借来的书看得彻底的“真理”……
在阅读过程中,对该书的各个章节做了一些标注,以备将来重新翻阅的时候参考。这些标注主要从两个角度进行,一是对我找工作应试(包括笔试和面试)有
没有用,二是对我自身的技术提高有没有用,所以分为应试和修炼两个指标,参照流行的打分标准将其分为从★到★★★★★五个等级。现记录如下:
Chapter 1
A Tour of Computer System
一个对计算机系统总体的介绍,简单明了。
应试 ★★★:可能在笔试中会有一些整体上的概念题。
修炼 ★: 属于计算机最基本的概念。
chapter 2
Representing and Manipulating Information
信息在计算机中的表示形式。分别包括整数和浮点数的表示形式。
应试 ★: 应试中很少会考到。
修炼 ★★★★:有很多人可能写了多年的代码都不知道浮点数是如何用那4(8)个字节存储的。
chapter 3
Machine-Level Representation of Program
汇编语言的复习。
修炼 ★★★★★:理解汇编语言和寄存器结构是后面很多内容的基础。
应试:
3.7 Procedures ★★★★★:过程调用,尤其是过程调用(包括递归调用)中堆栈的使用情况是经常会考到的。
3.10 Alignment ★★★★★:数据在内存中的“对齐”方式,也是经常出现在考题中的。比如定义一个结构体数组,打印出其中一个元素的地址,问这个地址相对数组起始地址有多少个字节的距离。
others ★★★: 汇编在应试中考的还是比较少的(除专门的职位)。
chapter 4
Processor Architecture
计算机体系结构的内容。
处理器结构,各种逻辑门、功能单元,指令集,指令的执行,指令执行的流水线等。
应试 ★: 对于软件相关职位来说,很少会考到这么底层的东西的。
修炼 ★★★: 对于从事软件层面的技术人员来说,不用深入,但是也应该理解,知道是怎么回事。
chapter 5
Optimizing Program Performance
如何优化程序的执行效率,包括代码的优化,编译器的优化,及CPU级别的优化。
5.1-5.6
应试 ★★★★: 经常会有一些让你寻找程序瑕疵的问题,你能看出代码在哪些细节上可以优化吗?
修炼 ★★★★★: 你当然需要知道编译器能在什么层面上自动帮你优化代码,在编译器无法优化时你自己如何在小细节上优化代码。
5.7以后
CPU级别的优化,微指令的概念,功能单元上微指令的并行,程序分支的预测等。
应试 ★: 对于软件相关职位来说,不会考这些东西的。
修炼 ★★★: 不用深入,但是应该知道并能够理解。
chapter6
The Memory Hierarchy
详细介绍了计算机系统中的存储结构。
6.1 介绍了不同种类的存储设备以及对应的存取数据的方式。
应试 ★: 很少会考到这么底层的东西
修炼 ★★: 知道就好了。
6.2-6.5 介绍了存储设备的组织形式,着重介绍了Cache及其工作方式。
应试 ★★★★: 在面试中,经常会考到跟cache相关的题目。
修炼 ★★★★: 存储结构和cache是计算机中很基础也很重要的概念。
6.6-6.7 介绍了程序如何和cache打交道,不同的循环嵌套顺序、遍历方向等对cache命中的影响。
应试 ★★: 很少会考到这些东西。
修炼 ★★★★: 你当然希望在写多重循环的时候知道什么样的嵌套顺序效率最高。
chapter 7
Linking
顾名思义,详细讲解了程序的链接过程,主要分为静态链接和动态链接,以及链接过程中使用到的技术。
应试 ★★★:需要知道链接的基本概念,尤其是动态链接可能会考到。
修炼 ★★★★★:有的时候,你很可能会被一个链接错误折磨好几天。另外,动态链接库的应用现在也是很普遍的。
chapter 8
Exceptional Control Flow
顾名思义,本章主要讲解异常控制,不过这里的“异常”并不是Java或者C++里的狭义的异常,而是一个广义的“Exceptions”的概念,包括中断
(Interrupt,硬件层面,主要是I/O中断),陷阱(Trap,主动产生的异常,主要用于用户程序和系统内核间的交互,如系统调用),错误
(Falut,如除0错误;页错误:在虚拟内存中,所请求页面并不在内存中,需要从硬盘读取等。错误可能恢复),中止(Abort,致命错误,无法恢复,
如硬件问题等)。
在介绍异常处理的同时,引入了进程的概念,对进程控制也进行了详细介绍,以及进程级别的Exception:信号(signal),这个级别的异常处理由操作系统完成,通常叫做上下文切换(context switch)。
应试 ★★: 主要掌握进程的概念即可。
修炼 ★★★: 知道异常控制流是怎么回事,用户程序和系统交互(如系统调用)的原理和方式即可,不用太深入。
chapter 9
Measuring Program Execution Time
本章介绍了如何尽可能准确的测量程序执行的时间。在实际编程中,我们极少会需要进行如此精确的测量,所以我跳过本章不读。
chapter 10
Virtual Memory
非常重要的一章,虚拟存储机制是计算机实现多任务的一项重要技术。计算机正是通过时间片技术使得每个进程在执行时仿佛独占CPU,进而又通过虚拟存储机制使得每一个进程在执行时,仿佛独占内存。
10.1介绍了虚拟地址和物理地址,CPU进行寻址操作产生的是虚拟地址,通过存储管理单元(memory management unit)转换为实际的物理内存地址。
10.3~10.5讲述了虚拟存储机制的优点:使得内存可以作为硬盘的cache;能够更方便的管理内存;能更好的提供内存保护机制。
10.6 介绍了虚拟地址如何转换为物理地址。
10.7 很精彩的一节,通过Intel Pentium和Linux的实例讲述了整个存储管理机制。记得以前上操作系统课的时候,各种理论、机制学了一大堆,但是就是不知道实际的操作系统到底用的哪套方法。而本节内容正是通过实例让你对刚学的理论机制有一个直观的了解。
10.8~10.10 讲述了存储映射(Memory Mapping)、动态内存分配和垃圾回收机制。
10.11 很实用的一节,列举了一些C编程中容易犯的内存引用错误。
应试 ★★★★: 本章内容是操作系统课程的重点内容,如果考操作系统,极有可能考到。10.11节的知识也能帮你应对一些程序挑错题。
修炼 ★★★★★: 操作系统中重要的基础内容,即使你只使用Java这样的高级编程语言,至少也应该弄懂垃圾回收机制吧。
chapter 11
System-Level I/O
介绍类Unix系统下的I/O读写,主要介绍系统层面的I/O接口。由于我们日常编程所用的I/O接口都是各种高级语言提供的经过封装的标准接口,故而如果不进行嵌入式编程的话这部分知识不是必须的,我跳过没读。
chapter 12
Network Progranmming
简单介绍了网络模型,TCP/IP协议,类Unix系统的socket接口等。
应试和修炼 ★★: 因为篇幅限制,本章只做了简单讲解,要掌握网络编程知识还需要参考专门的网络技术书籍。
chapter 13
Concurrent Programming
本章简单介绍了并发程序设计的内容,主要包括:
进程级别的并发,各子进程拥有不同的虚拟地址空间,需要IPC(InterProcess Communication)机制共享数据,进程之间切换开销大。
I/O复用,事件驱动,单进程运行,共享虚拟地址空间,并发效果不理想。
线程,介于上述两种中间,各子线程共享进程的虚拟地址空间,线程间切换开销较小。
另外介绍了并发编程中访问共享变量的信号量机制。给出了4类容易引起线程不安全的函数。
应试 ★★: 除应聘相关职位外,并发编程考的比较少,不过需要清楚锁机制和信号量机制等。
修炼 ★★★: 多线程程序在现今的开发中还是很常见的,但是本章介绍的比较简单,需要参考另外专门的书籍。