深入理解计算机系统(CSAPP)
  • 本电子书信息
  • 出版信息
    • 出版者的话
    • 中文版序一
    • 中文版序二
    • 译者序
    • 前言
    • 关于作者
  • 第 1 章:计算机系统漫游
    • 1.1 信息就是位 + 上下文
    • 1.2 程序被其他程序翻译成不同的格式
    • 1.3 了解编译系统如何工作是大有益处的
    • 1.4 处理器读并解释储存在内存中的指令
    • 1.5 高速缓存至关重要
    • 1.6 存储设备形成层次结构
    • 1.7 操作系统管理硬件
    • 1.8 系统之间利用网络通信
    • 1.9 重要主题
    • 1.10 小结
  • 第一部分:程序结构和执行
    • 第 2 章:信息的表示和处理
      • 2.1 信息存储
      • 2.2 整数表示
      • 2.3 整数运算
      • 2.4 浮点数
      • 2.5 小结
      • 家庭作业
    • 第 3 章:程序的机器级表示
      • 3.1 历史观点
      • 3.2 程序编码
      • 3.3 数据格式
      • 3.4 访问信息
    • 第 4 章:处理器体系结构
    • 第 5 章:优化程序性能
    • 第 6 章:存储器层次结构
  • 第二部分:在系统上运行程序
    • 第 7 章:链接
      • 7.1 编译器驱动程序
      • 7.2 静态链接
      • 7.3 目标文件
      • 7.4 可重定位目标文件
      • 7.5 符号和符号表
      • 7.6 符号解析
      • 7.7 重定位
      • 7.8 可执行目标文件
      • 7.9 加载可执行目标文件
      • 7.10 动态链接共享库
      • 7.11 从应用程序中加载和链接共享库
      • 7.12 位置无关代码
      • 7.13 库打桩机制
      • 7.14 处理目标文件的工具
      • 7.15 小结
      • 家庭作业
    • 第 8 章:异常控制流
      • 8.1 异常
      • 8.2 进程
      • 8.3 系统调用错误处理
      • 8.4 进程控制
      • 8.5 信号
      • 8.6 非本地跳转
      • 8.7 操作进程的工具
      • 8.8 小结
      • 家庭作业
    • 第 9 章:虚拟内存
      • 9.1 物理和虚拟寻址
      • 9.2 地址空间
      • 9.3 虚拟内存作为缓存的工具
      • 9.4 虚拟内存作为内存管理的工具
      • 9.5 虚拟内存作为内存保护的工具
      • 9.6 地址翻译
      • 9.7 案例研究:Intel Core i7 / Linux 内存系统
      • 9.8 内存映射
      • 9.9 动态内存分配
      • 9.10 垃圾收集
      • 9.11 C 程序中常见的与内存有关的错误
      • 9.12 小结
      • 家庭作业
  • 第三部分:程序间的交互和通信
    • 第 10 章:系统级 I/O
      • 10.1 Unix I/O
      • 10.2 文件
      • 10.3 打开和关闭文件
      • 10.4 读和写文件
      • 10.5 用 RIO 包健壮地读写
      • 10.6 读取文件元数据
      • 10.7 读取目录内容
      • 10.8 共享文件
      • 10.9 I/O 重定向
      • 10.10 标准 I/O
      • 10.11 综合:我该使用哪些 I/O 函数?
      • 10.12 小结
      • 家庭作业
    • 第 11 章:网络编程
      • 11.1 客户端—服务器编程模型
      • 11.2 网络
      • 11.3 全球 IP 因特网
      • 11.4 套接字接口
      • 11.5 Web 服务器
      • 11.6 综合:TINY Web 服务器
      • 11.7 小结
      • 家庭作业
    • 第 12 章:并发编程
      • 12.1 基于进程的并发编程
      • 12.2 基于 I/O 多路复用的并发编程
      • 12.3 基于线程的并发编程
      • 12.4 多线程程序中的共享变量
      • 12.5 用信号量同步线程
      • 12.6 使用线程提高并行性
      • 12.7 其他并发问题
      • 12.8 小结
      • 家庭作业
  • 附录 A:错误处理
  • 参考文献
  • 实验
    • 实验总览
      • 常见问题
    • 实验 1:Data Lab
      • README(讲师版)
      • README(学生版)
      • Writeup
    • 实验 2:Bomb Lab
      • README(讲师版)
      • Writeup
    • 实验 3:Attack Lab
    • 实验 4:Architechture Lab
    • 实验 5:Cache Lab
    • 实验 6:Performance Lab
    • 实验 7:Shell Lab
    • 实验 8:Malloc Lab
    • 实验 9:Proxy Lab
由 GitBook 提供支持
在本页
  1. 出版信息

中文版序一

上一页出版者的话下一页中文版序二

最后更新于4年前

梅宏,中国科学院院士、发展中国家科学院院士

华章公司温莉芳女士邀我为即将出版的《Computer Systems∶A Programmer's Perspective》第 3 版的中文译本《深入理解计算机系统》写个序,出于两方面的考虑,欣然允之。

一是源于我个人的背景和兴趣。我长期从事软件工程和系统软件领域的研究,对计算机学科的认识可概括为两大方面:计算系统的构建和基于计算系统的计算技术应用。出于信息时代国家掌握关键核心技术的重大需求以及我个人专业的本位视角,我一直对系统级技术的研发给予更多关注,由于这种 “偏爱”和研究习惯的养成,以至于自己在面对非本专业领域问题时,也常常喜欢从“系统观”来看待问题和解决问题。我自己也和《深入理解计算机系统》有过“亲密接触”。2012 年,我还在北京大学信息科学技术学院院长任上,学院从更好地培养适应新技术、发展具有系统设计和系统应用能力的计算机专门人才出发,在调查若干国外高校计算机学科本科生教学体系基础上,决定加强计算机系统能力培养,在本科生二年级增设了一门系统级课程,即 "计算机系统导论"。其时,学校正在倡导小班课教学模式,这门课也被选为学院的第一个小班课教学试点。为了体现学院的重视,我亲自担任了这门课的主持人,带领一个 18 人组成的 "豪华" 教学团队负责该课程的教学工作,将学生分成 14 个小班,每个小班不超过 15 人。同时,该课程涉及教师集体备课组合授课、大班授课基础上的小班课教学和讨论、定期教学会议、学生自主习题课和实验课等新教学模式的探索,其中一项非常重要的举措就是选用了卡内基 - 梅隆大学 Randal E. Bryant 教授和 David R. O'Hallaron 教授编写的《Computer Systems∶A Programmer's Perspective》(第 2 版)作为教材,虽然这门课程我只主持了一次,但对这本教材的印象颇深颇佳。

二是源于我和华章公司已有的良好合作和相互了解。2000 年前后,我先后翻译了华章公司引进(机械工业出版社出版)的 Roger Pressman 编写的《Software Engineering:A Practitioner's Approach》一书的第 4 版和第 5 版。其后,在计算机学会软件工程专业委员会和系统软件专业委员会的诸多学术活动中也和华章公司及温莉芳女士本人有不少合作。近二十年来,华章公司的编辑们引进出版了大量计算机学科的优秀教材和学术著作,对国内高校计算机学科的教学改革起到了积极的促进作用,本书的翻译出版仍是这项工作的延续。这是一项值得褒扬的工作,我也想借此机会代表计算机界同仁表达对华章公司的感谢!

计算机系统类别的课程一直是计算机科学与技术专业的主要教学内容之一。由于历史原因,我国的计算机专业的课程体系曾广泛参考 ACM 和 IEEE 制订的计算机科学与技术专业教学计划(Computing Curricula)设计,计算机系统类课程也参照该计划分为汇编语言、操作系统、组成原理、体系结构、计算机网络等多门课程。应该说,该课程体系在历史上对我国的计算机专业教育起了很好的引导作用。

进入新世纪以来,计算技术发生了重要的发展和变化,我国的信息技术和产业也得到了迅猛发展,对计算机专业的毕业生提出了更高要求。重新审视原来我们参照 ACM/IEEE 计算机专业计划的课程体系,会发现存在以下几个方面的主要问题。

1)课程体系中缺乏一门独立的能够贯穿整个计算机系统的基础课程。计算机系统方面的基础知识被分成了很多门独立的课程,课程内容彼此之间缺乏关联和系统性。学生学习之后,虽然在计算机系统的各个部分理解了很多概念和方法,但往往会忽视各个部分之间的关联,难以系统性地理解整个计算机系统的工作原理和方法。

2)现有课程往往偏重理论,和实践关联较少。如现有的系统课程中通常会介绍函数调用过程中的压栈和退栈方式,但较少和实践关联来理解压栈和退栈过程的主要作用。实际上,压栈和退栈与理解 C 等高级语言的工作原理息息相关,也是常用的攻击手段 Bufer Overflow 的主要技术基础。

3)教学内容比较传统和陈旧,基本上是早期 PC 时代的内容。比如,现在的主流台式机 CPU 都已经是 x86-64 指令集,但较多课程还在教授 80386 甚至更早的指令集。对于近年来出现的多核/众核处理器、SSD 硬盘等实际应用中遇到的内容更是涉及较少。

4)课程大多数从设计者的角度出发,而不是从使用者的角度出发。对于大多数学生来说,毕业之后并不会成为专业的 CPU 设计人员、操作系统开发人员等,而是会成为软件开发工程师。对他们而言,最重要的是理解主流计算机系统的整体设计以及这些设计因素对于应用软件开发和运行的影响。

这本教材很好地克服了上述传统课程的不足,这也是当初北大计算机学科本科生教学改革时选择该教材的主要考量。其一,该教材系统地介绍了整个计算机系统的工作原理,可帮助学生系统性地理解计算机如何执行程序、存储信息和通信;其二,该教材非常强调实践,全书包括 9 个配套的实验,在这些实验中,学生需要攻破计算机系统、设计 CPU、实现命令行解释器、根据缓存优化程序等,在新鲜有趣的实验中理解系统原理,培养动手能力;其三,该教材紧跟时代的发展,加入了 x86-64 指令集、Intel Core i7 的虚拟地址结构、SSD 磁盘、IPv6 等新技术内容;其四,该教材从程序员的角度看待计算机系统,重点讨论系统的不同结构对于上层应用软件编写、执行和数据存储的影响,以培养程序员在更广阔空间应用计算机系统知识的能力。

基于该教材的北大“计算机系统导论”课程实施已有五年,得到了学生的广泛赞誉,学生们通过这门课程的学习建立了完整的计算机系统的知识体系和整体知识框架,养成了良好的编程习惯并获得了编写高性能、可移植和健壮的程序的能力,莫定了后续学习操作系统、编译、计算机体系结构等专业课程的基础。北大的教学实践表明,这是一本值得推荐采用的好教材。

该书的第 3 版相对于第 2 版进行了较大程度的修改和扩充。第 3 版从一开始就采用最新 x86-64 架构来贯穿各部分知识,在内存技术、网络技术上也有一系列更新,并且重组了之前的一些比较难懂的内容。我相信,该书的出版,将有助于国内计算机系统教学的进一步改进,为培养从事系统级创新的计算机人才奠定很好的基础。

2016 年 10 月 8 日