当当网官方旗舰店
  • 扫码下单

  • 深入理解计算机系统(原书第3版)
  • 程序员必读经典著作!理解计算机系统*书目,10万程序员共同选择。第二版销售突破1...
    • 作者: (美)兰德尔?E.布莱恩特(Randal E.Bryant)等著
    • 出版社: 机械工业出版社
    • 出版时间:2016-11-14 00:00:00
    送至
  • 由""直接销售和发货,并提供售后服务
  • 加入购物车 购买电子书
    服务

    看了又看

    商品预定流程:

    查看大图
    /
    ×

    店铺装修中

    商家:
    当当网官方旗舰店
    联系:
    • 商品

    • 服务

    • 物流

    搜索店内商品

    当当网官方旗舰店

  • 商品参数
    • 作者: (美)兰德尔?E.布莱恩特(Randal E.Bryant)等著
    • 出版社:机械工业出版社
    • 出版时间:2016-11-14 00:00:00
    • 版次:1
    • 印次:1
    • 印刷时间:2016-11-01
    • 开本:16开
    • 装帧:平装
    • 国别/地区:未知
    • 版权提供:机械工业出版社

    1.第二版销售突破100000册,第三版重磅上市!

    2.理解计算机系统*书目, 10余万程序员的共同选择
    3.卡内基-梅隆、北京大学、清华大学、上海交通大学等国内外众多知名高校选用指定教材
    4.从程序员视角全面剖析的实现细节,使读者深刻理解程序的行为,将所有计算机系统的相关知识融会贯通。
    5.新版本全面基于X86-64位处理器
    6.全新的阅读和学习体验:由国内名师录制章前导读,使读者可以了解各章的重点内容和知识关联,形成关于计算机系统的知识架构。并开设了本书的网络社区,读者可加入社区,获得本书相关学习资源,了解活动信息。

    和第2版相比,本版内容上*的变化是,从以IA32和x86-64为基础转变为完全以x86-64为基础。主要更新如下:
    • 基于x86-64,大量地重写代码,首次介绍对处理浮点数据的程序的机器级支持。
    • 处理器体系结构修改为支持64位字和操作的设计。
    • 引入更多的功能单元和更复杂的控制逻辑,使基于程序数据流表示的程序性能模型预测更加可靠。
    • 扩充关于用GOT和PLT创建与位置无关代码的讨论,描述了更加强大的链接技术(比如库打桩)。
    • 增加了对信号处理程序更细致的描述,包括异步信号安全的函数等。
    • 采用*函数,更新了与协议无关和线程安全的网络编程。

    Randal E. Bryant   1981年于麻省理工学院获得计算机博士学位,1984年至今一直任教于卡内基-梅隆大学。现任卡内基-梅隆大学计算机科学学院院长、教授,同时还受邀任教于电子和计算机工程系。他从事本科生和研究生计算机系统方面课程的教学近40年。他和O’Hallaron教授一起在卡内基梅隆大学开设了15-213课程“计算机系统导论”,那便是本书的基础。他还是ACM院士、IEEE院士、美国国家工程院院士和美国人文与科学研究院院士。其研究成果被Intel、IBM、Fujitsu和Microsoft等主要计算机制造商使用,他还因研究获得过Semiconductor Research Corporation、ACM、IEEE颁发的多项大奖。

    David R. O’Hallaron卡内基梅隆大学电子和计算机工程系教授。在弗吉尼亚大学(University of Virginia)获得计算机科学的博士学位,2007年-2010年为Intel匹兹堡实验室主任。他教授本科生和研究生的计算机系统方面的课程已有20余年,并和Bryant教授一起开设了“计算机系统导论”课程。曾获得CMU计算机学院颁发的Herbert Simon杰出教学奖。他主要从事计算机系统领域的研究,与Quake项目成员一起获得过高性能计算领域中的最高国际奖项——Gordon Bell奖。他目前的工作重点是研究自动分级(autograding)概念,即评价其他程序质量的程序。

     

    基于该教材的北大“计算机系统导论”课程实施已有五年,得到了学生的广泛赞誉,学生们通过这门课程的学习建立了完整的计算机系统的知识体系和整体知识框架,养成了良好的编程习惯并获得了编写高性能、可移植和健壮的程序的能力,奠定了后续学习操作系统、编译、计算机体系结构等专业课程的基础。北大的教学实践表明,这是一本值得推荐采用的好教材。本书第3版采用*x86-64架构来贯穿各部分知识。我相信,该书的出版将有助于国内计算机系统教学的进一步改进,为培养从事系统级创新的计算机人才奠定很好的基础。
    —— 梅 宏 中国科学院院士/发展中国家科学院院士

    以低年级开设“深入理解计算机系统”课程为基础,我先后在复旦大学和上海交通大学软件学院主导了激进的教学改革……现在我课题组的青年教师全部是首批经历此教学改革的学生。本科的扎实基础为他们从事系统软件的研究打下了良好的基础……师资力量的补充又为推进更加激进的教学改革创造了条件。
    —— 臧斌宇 上海交通大学软件学院院长

    出版者的话
    中文版序一
    中文版序二
    译者序
    前言
    关于作者
    第1章 计算机系统漫游1
     1.1 信息就是位 上下文1
     1.2 程序被其他程序翻译成不同的格式3
     1.3 了解编译系统如何工作是大有益处的4
     1.4 处理器读并解释储存在内存中的指令5
      1.4.1 系统的硬件组成5
      1.4.2 运行hello程序7
     1.5 高速缓存至关重要9
     1.6 存储设备形成层次结构9
     1.7 操作系统管理硬件10
      1.7.1 进程11
      1.7.2 线程12
      1.7.3 虚拟内存12
      1.7.4 文件14
     1.8 系统之间利用网络通信14
     1.9 重要主题16
      1.9.1 Amdahl定律16
      1.9.2 并发和并行17
      1.9.3 计算机系统中抽象的重要性19
     1.10 小结20
     参考文献说明20
     练习题答案20
    第一部分
    程序结构和执行
     第2章 信息的表示和处理22
     2.1 信息存储24
      2.1.1 十六进制表示法25
      2.1.2 字数据大小27
      2.1.3 寻址和字节顺序29
      2.1.4 表示字符串34
      2.1.5 表示代码34
      2.1.6 布尔代数简介35
      2.1.7 C语言中的位级运算37
      2.1.8 C语言中的逻辑运算39
      2.1.9 C语言中的移位运算40
     2.2 整数表示41
      2.2.1 整型数据类型42
      2.2.2 无符号数的编码43
      2.2.3 补码编码44
      2.2.4 有符号数和无符号数之间的转换49
      2.2.5 C语言中的有符号数与无符号数52
      2.2.6 扩展一个数字的位表示54
      2.2.7 截断数字56
      2.2.8 关于有符号数与无符号数的建议58
     2.3 整数运算60
      2.3.1 无符号加法60
      2.3.2 补码加法62
      2.3.3 补码的非66
      2.3.4 无符号乘法67
      2.3.5 补码乘法67
      2.3.6 乘以常数70
      2.3.7 除以2的幂71
      2.3.8 关于整数运算的最后思考74
     2.4 浮点数75
      2.4.1 二进制小数76
      2.4.2 IEEE浮点表示78
      2.4.3 数字示例79
      2.4.4 舍入83
      2.4.5 浮点运算85
      2.4.6 C语言中的浮点数86
     2.5 小结87
     参考文献说明88
     家庭作业88
     练习题答案97
    第3章 程序的机器级表示109
     3.1 历史观点110
     3.2 程序编码113
      3.2.1 机器级代码113
      3.2.2 代码示例114
      3.2.3 关于格式的注解117
     3.3 数据格式119
     3.4 访问信息119
      3.4.1 操作数指示符121
      3.4.2 数据传送指令122
      3.4.3 数据传送示例125
      3.4.4 压入和弹出栈数据127
     3.5 算术和逻辑操作128
      3.5.1 加载有效地址129
      3.5.2 一元和二元操作130
      3.5.3 移位操作131
      3.5.4 讨论131
      3.5.5 特殊的算术操作133
     3.6 控制135
      3.6.1 条件码135
      3.6.2 访问条件码136
      3.6.3 跳转指令138
      3.6.4 跳转指令的编码139
      3.6.5 用条件控制来实现条件分支…141
      3.6.6 用条件传送来实现条件分支…145
      3.6.7 循环149
      3.6.8 switch语句159
     3.7 过程164
      3.7.1 运行时栈164
      3.7.2 转移控制165
      3.7.3 数据传送168
      3.7.4 栈上的局部存储170
      3.7.5 寄存器中的局部存储空间172
      3.7.6 递归过程174
     3.8 数组分配和访问176
      3.8.1 基本原则176
      3.8.2 指针运算177
      3.8.3 嵌套的数组178
      3.8.4 定长数组179
      3.8.5 变长数组181
     3.9 异质的数据结构183
      3.9.1 结构183
      3.9.2 联合186
      3.9.3 数据对齐189
     3.10 在机器级程序中将控制与数据结合起来192
      3.10.1 理解指针192
      3.10.2 应用:使用GDB调试器193
      3.10.3 内存越界引用和缓冲区溢出194
      3.10.4 对抗缓冲区溢出攻击198
      3.10.5 支持变长栈帧201
     3.11 浮点代码204
      3.11.1 浮点传送和转换操作205
      3.11.2 过程中的浮点代码209
      3.11.3 浮点运算操作210
      3.11.4 定义和使用浮点常数212
      3.11.5 在浮点代码中使用位级操作212
      3.11.6 浮点比较操作213
      3.11.7 对浮点代码的观察结论215
     3.12 小结216
     参考文献说明216
     家庭作业216
     练习题答案226
    第4章 处理器体系结构243
     4.1 Y86-64指令集体系结构245
      4.1.1 程序员可见的状态245
      4.1.2 Y86-64指令245
      4.1.3 指令编码246
      4.1.4 Y86-64异常250
      4.1.5 Y86-64程序251
      4.1.6 一些Y86-64指令的详情255
     4.2 逻辑设计和硬件控制语言HCL256
      4.2.1 逻辑门257
      4.2.2 组合电路和HCL布尔表达式257
      4.2.3 字级的组合电路和HCL整数表达式258
      4.2.4 集合关系261
      4.2.5 存储器和时钟262
     4.3 Y86-64的顺序实现264
      4.3.1 将处理组织成阶段264
      4.3.2 SEQ硬件结构272
      4.3.3 SEQ的时序274
      4.3.4 SEQ阶段的实现277
     4.4 流水线的通用原理282
      4.4.1 计算流水线282
      4.4.2 流水线操作的详细说明284
      4.4.3 流水线的局限性284
      4.4.4 带反馈的流水线系统287
     4.5 Y86-64的流水线实现288
      4.5.1 SEQ :重新安排计算阶段288
      4.5.2 插入流水线寄存器289
      4.5.3 对信号进行重新排列和标号292
      4.5.4 预测下一个PC293
      4.5.5 流水线冒险295
      4.5.6 异常处理306
      4.5.7 PIPE各阶段的实现308
      4.5.8 流水线控制逻辑314
      4.5.9 性能分析322
      4.5.10 未完成的工作323
     4.6 小结325
     参考文献说明326
     家庭作业327
     练习题答案331
    第5章 优化程序性能341
     5.1 优化编译器的能力和局限性342
     5.2 表示程序性能345
     5.3 程序示例347
     5.4 消除循环的低效率350
     5.5 减少过程调用353
     5.6 消除不必要的内存引用354
     5.7 理解现代处理器357
      5.7.1 整体操作357
      5.7.2 功能单元的性能361
      5.7.3 处理器操作的抽象模型362
     5.8 循环展开366
     5.9 提高并行性369
      5.9.1 多个累积变量370
      5.9.2 重新结合变换373
     5.10 优化合并代码的结果小结377
     5.11 一些限制因素378
      5.11.1 寄存器溢出378
      5.11.2 分支预测和预测错误处罚379
     5.12 理解内存性能382
      5.12.1 加载的性能382
      5.12.2 存储的性能383
     5.13 应用:性能提高技术387
     5.14 确认和消除性能瓶颈388
      5.14.1 程序剖析388
      5.14.2 使用剖析程序来指导优化390
     5.15 小结392
     参考文献说明393
     家庭作业393
     练习题答案395
    第6章 存储器层次结构399
     6.1 存储技术399
      6.1.1 随机访问存储器400
      6.1.2 磁盘存储406
      6.1.3 固态硬盘414
      6.1.4 存储技术趋势415
     6.2 局部性418
      6.2.1 对程序数据引用的局部性418
      6.2.2 取指令的局部性419
      6.2.3 局部性小结420
     6.3 存储器层次结构421
      6.3.1 存储器层次结构中的缓存422
      6.3.2 存储器层次结构概念小结424
     6.4 高速缓存存储器425
      6.4.1 通用的高速缓存存储器组织结构425
      6.4.2 直接映射高速缓存427
      6.4.3 组相联高速缓存433
      6.4.4 全相联高速缓存434
      6.4.5 有关写的问题437
      6.4.6 一个真实的高速缓存层次结构的解剖438
      6.4.7 高速缓存参数的性能影响439
     6.5 编写高速缓存友好的代码440
     6.6 综合:高速缓存对程序性能的影响444
      6.6.1 存储器山444
      6.6.2 重新排列循环以提高空间局部性447
      6.6.3 在程序中利用局部性450
     6.7 小结450
     参考文献说明451
     家庭作业451
     练习题答案459
    第二部分
    在系统上运行程序
     第7章 链接464
     7.1 编译器驱动程序465
     7.2 静态链接466
     7.3 目标文件466
     7.4 可重定位目标文件467
     7.5 符号和符号表468
     7.6 符号解析470
      7.6.1 链接器如何解析多重定义的全局符号471
      7.6.2 与静态库链接475
      7.6.3 链接器如何使用静态库来解析引用477
     7.7 重定位478
      7.7.1 重定位条目479
      7.7.2 重定位符号引用479
     7.8 可执行目标文件483
     7.9 加载可执行目标文件484
     7.10 动态链接共享库485
     7.11 从应用程序中加载和链接共享库487
     7.12 位置无关代码489
     7.13 库打桩机制492
      7.13.1 编译时打桩492
      7.13.2 链接时打桩492
      7.13.3 运行时打桩494
     7.14 处理目标文件的工具496
     7.15 小结496
     参考文献说明497
     家庭作业497
     练习题答案499
    第8章 异常控制流501
     8.1 异常502
      8.1.1 异常处理503
      8.1.2 异常的类别504
      8.1.3 Linux/x86-64系统中的异常505
     8.2 进程508
      8.2.1 逻辑控制流508
      8.2.2 并发流509
      8.2.3 私有地址空间509
      8.2.4 用户模式和内核模式510
      8.2.5 上下文切换511
     8.3 系统调用错误处理512
     8.4 进程控制513
      8.4.1 获取进程ID513
      8.4.2 创建和终止进程513
      8.4.3 回收子进程516
      8.4.4 让进程休眠521
      8.4.5 加载并运行程序521
      8.4.6 利用fork和execve运行程序524
     8.5 信号526
      8.5.1 信号术语527
      8.5.2 发送信号528
      8.5.3 接收信号531
      8.5.4 阻塞和解除阻塞信号532
      8.5.5 编写信号处理程序533
      8.5.6 同步流以避免讨厌的并发错误540
      8.5.7 显式地等待信号543
     8.6 非本地跳转546
     8.7 操作进程的工具550
     8.8 小结550
     参考文献说明550
     家庭作业550
     练习题答案556
    第9章 虚拟内存559
     9.1 物理和虚拟寻址560
     9.2 地址空间560
     9.3 虚拟内存作为缓存的工具561
      9.3.1 DRAM缓存的组织结构562
      9.3.2 页表562
      9.3.3 页命中563
      9.3.4 缺页564
      9.3.5 分配页面565
      9.3.6 又是局部性救了我们565
     9.4 虚拟内存作为内存管理的工具565
     9.5 虚拟内存作为内存保护的工具567
     9.6 地址翻译567
      9.6.1 结合高速缓存和虚拟内存570
      9.6.2 利用TLB加速地址翻译570
      9.6.3 多级页表571
      9.6.4 综合:端到端的地址翻译573
     9.7 案例研究:Intel Core i7/Linux内存系统576
      9.7.1 Core i7地址翻译576
      9.7.2 Linux虚拟内存系统580
     9.8 内存映射582
      9.8.1 再看共享对象583
      9.8.2 再看fork函数584
      9.8.3 再看execve函数584
      9.8.4 使用mmap函数的用户级内存映射585
     9.9 动态内存分配587
      9.9.1 malloc和free函数587
      9.9.2 为什么要使用动态内存分配589
      9.9.3 分配器的要求和目标590
      9.9.4 碎片591
      9.9.5 实现问题592
      9.9.6 隐式空闲链表592
      9.9.7 放置已分配的块593
      9.9.8 分割空闲块594
      9.9.9 获取额外的堆内存594
      9.9.10 合并空闲块594
      9.9.11 带边界标记的合并595
      9.9.12 综合:实现一个简单的分配器597
      9.9.13 显式空闲链表603
      9.9.14 分离的空闲链表604
     9.10 垃圾收集605
      9.10.1 垃圾收集器的基本知识606
      9.10.2 Mark&Sweep垃圾收集器607
      9.10.3 C程序的保守Mark&Sweep608
     9.11 C程序中常见的与内存有关的错误609
      9.11.1 间接引用坏指针609
      9.11.2 读未初始化的内存609
      9.11.3 允许栈缓冲区溢出610
      9.11.4 假设指针和它们指向的对象是相同大小的610
      9.11.5 造成错位错误611
      9.11.6 引用指针,而不是它所指向的对象611
      9.11.7 误解指针运算611
      9.11.8 引用不存在的变量612
      9.11.9 引用空闲堆块中的数据612
      9.11.10 引起内存泄漏613
     9.12 小结613
     参考文献说明613
     家庭作业614
     练习题答案617
    第三部分
    程序间的交互和通信
     第10章 系统级I/O622 10.1 Unix I/O622
     10.2 文件623
     10.3 打开和关闭文件624
     10.4 读和写文件625
     10.5 用RIO包健壮地读写626
      10.5.1 RIO的无缓冲的输入输出函数627
      10.5.2 RIO的带缓冲的输入函数627
     10.6 读取文件元数据632
     10.7 读取目录内容633
     10.8 共享文件634
     10.9 I/O重定向637
     10.10 标准I/O638
     10.11 综合:我该使用哪些I/O函数?638
     10.12 小结640
     参考文献说明640
     家庭作业640
     练习题答案641
    第11章 网络编程642
     11.1 客户端服务器编程模型642
     11.2 网络643
     11.3 全球IP因特网646
      11.3.1 IP地址647
      11.3.2 因特网域名649
      11.3.3 因特网连接651
     11.4 套接字接口652
      11.4.1 套接字地址结构653
      11.4.2 socket函数654
      11.4.3 connect函数654
      11.4.4 bind函数654
      11.4.5 listen函数655
      11.4.6 accept函数655
      11.4.7 主机和服务的转换656
      11.4.8 套接字接口的辅助函数660
      11.4.9 echo客户端和服务器的示例662
     11.5 Web服务器665
      11.5.1 Web基础665
      11.5.2 Web内容666
      11.5.3 HTTP事务667
      11.5.4 服务动态内容669
     11.6 综合:TINY Web服务器671
     11.7 小结678
     参考文献说明678
     家庭作业678
     练习题答案679
    第12章 并发编程681
     12.1 基于进程的并发编程682
      12.1.1 基于进程的并发服务器683
      12.1.2 进程的优劣684
     12.2 基于I/O多路复用的并发编程684
      12.2.1 基于I/O多路复用的并发事件驱动服务器686
      12.2.2 I/O多路复用技术的优劣690
     12.3 基于线程的并发编程691
      12.3.1 线程执行模型691
      12.3.2 Posix线程691
      12.3.3 创建线程692
      12.3.4 终止线程693
      12.3.5 回收已终止线程的资源693
      12.3.6 分离线程694
      12.3.7 初始化线程694
      12.3.8 基于线程的并发服务器694
     12.4 多线程程序中的共享变量696
      12.4.1 线程内存模型696
      12.4.2 将变量映射到内存697
      12.4.3 共享变量698
     12.5 用信号量同步线程698
      12.5.1 进度图701
      12.5.2 信号量702
      12.5.3 使用信号量来实现互斥703
      12.5.4 利用信号量来调度共享资源704
      12.5.5 综合:基于预线程化的并发服务器708
     12.6 使用线程提高并行性710
     12.7 其他并发问题716
      12.7.1 线程安全716
      12.7.2 可重入性717
      12.7.3 在线程化的程序中使用已存在的库函数718
      12.7.4 竞争719
      12.7.5 死锁721
     12.8 小结722
     参考文献说明723
     家庭作业723
     练习题答案726
    附录A 错误处理729
    参考文献733

    中文版序一
    中国科学院院士
    发展中国家科学院院士/梅宏
    华章公司温莉芳女士邀我为即将出版的《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等高级语言的工作原理息息相关,也是常用的攻击手段Buffer 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日


    中文版序二
    上海交通大学软件学院院长
    2002年8月本书第1版首次印刷。一个月之后,我在复旦大学软件学院开设了“计算机系统基础”课程,成为国内第一个采用这本教材授课的老师。这本教材有四个特点。第一,涉及面广,覆盖了二进制、汇编、组成、体系结构、操作系统、网络与并发程序设计等计算机系统最重要的方面。第二,具有相当的深度,本书从程序出发逐步深入到系统领域的重要问题,而非点到为止,学完本书后读者可以很好地理解计算机系统的工作原理。第三,它是面向低年级学生的教材,在过去的教学体系中这本书所涉及的很多内容只能在高年级讲授,而本书通过合理的安排将计算机系统领域最核心的内容巧妙地展现给学生(例如,不需要掌握逻辑设计与硬件描述语言的完整知识,就可以体验处理器设计)。第四,本书配备了非常实用、有趣的实验。例如,模仿硬件仅用位操作完成复杂的运算,模仿tracker和hacker去破解密码以及攻击自身的程序,设计处理器,实现简单但功能强大的Shell和Proxy等。这些实验既强化了学生对书本知识的理解,也进一步激发了学生探究计算机系统的热情。
    以低年级开设“深入理解计算机系统”课程为基础,我先后在复旦大学和上海交通大学软件学院主导了激进的教学改革。必修课时被大量压缩,现在软件工程专业必修课由问题求解、计算机系统基础、应用开发基础、软件工程四个模块9门课构成。其他传统的必修课如操作系统、编译原理、数字逻辑等都成为方向课。课程体系的变化,减少了学生修读课程的总数和总课时,因而为大幅度增加实验总量、提高实验难度和强度、增强实验的综合性和创新性提供了有力保障。现在我的课题组的青年教师全部是首批经历此项教学改革的学生。本科的扎实基础为他们从事系统软件研究打下了良好基础,他们实现了亚洲学术界在操作系统旗舰会议SOSP上论文发表零的突破,目前研究成果在国际上具有较大的影响力。师资力量的补充,又为全面推进更加激进的教学改革创造了条件。
    本书的出版标志着国际上计算机教学进入了第三阶段。从历史来看,国际上计算机教学先后经历了三个主要阶段。第一阶段是上世纪70年代中期至80年代中期,那时理论、技术还不成熟,系统不稳定,因此教材主要围绕若干重要问题讲授不同流派的观点,学生解决实际问题的能力不强。第二阶段是上世纪80年代中期至本世纪初,当时计算机单机系统的理论和技术已逐步趋于成熟,主流系统稳定,因此教材主要围绕主流系统讲解理论和技术,学生的理论基础扎实,动手能力强。第三阶段从本世纪初开始,主要背景是随着互联网的兴起,信息技术开始渗透到人类工作和生活的方方面面。技术爆炸迫使教学者必须重构传统的以计算机单机系统为主导的课程体系。新的体系大面积调整了核心课程的内容。核心课程承担了帮助学生构建专业知识框架的任务,为学生在毕业后相当长时间内的专业发展奠定坚实基础。现在一般认为问题抽象、系统抽象和数据抽象是计算机类专业毕业生的核心能力。而本书担负起了系统抽象的重任,因此美国的很多高校都采用了该书作为计算机系统核心课程的教材。第三阶段的教材与第二阶段的教材是互补关系。第三阶段的教材主要强调坚实而宽广的基础,第二阶段的教材主要强调深入系统的专门知识,因此依然在本科高年级方向课和研究生专业课中占据重要地位。
    上世纪80年代初,我国借鉴美国经验建立了自己的计算机教学体系并引进了大量教材。从21世纪初开始,一些学校开始借鉴美国第二阶段的教学方法,采用了部分第二阶段的著名教材,这些改革正在走向成熟并得以推广。2012年北京大学计算机专业采用本书作为教材后,采用本教材开设“计算机系统基础”课程的高校快速增加。以此为契机,国内的计算机教学也有望全面进入第三阶段。
    本书的第3版完全按照x86-64系统进行改写。此外,第2版中删除了以x87呈现的浮点指令,在第3版中浮点指令又以标量AVX2的形式得以恢复。第3版更加强调并发,增加了较大篇幅用于讨论信号处理程序与主程序间并发时的正确性保障。总体而言,本书的三个版本在结构上没有太大变化,不同版本的出现主要是为了在细节上能够更好地反映技术的最新变化。
    当然本书的某些部分对于初学者而言还是有些难以阅读。本书涉及大量重要概念,但一些概念首次亮相时并没有编排好顺序。例如寄存器的概念、汇编指令的顺序执行模式、PC的概念等对于初学者而言非常陌生,但这些介绍仅仅出现在第1章的总览中,而当第3章介绍汇编时完全没有进一步的展开就假设读者已经非常清楚这些概念。事实上这些概念原本就介绍得过于简单,短暂亮相之后又立即退场,相隔较长时间后,当这些概念再次登场时,初学者早已忘却了它们是什么。同样,第8章对进程、并发等概念的介绍也存在类似问题。因此,中文翻译版将配备导读部分,希望这些导读能够帮助初学者顺利阅读。

    2016年10月15日、


    译者序:
    本书第1版出版于2003年,第2版出版于2011年,去年发行的已经是原书第3版了。第3版还是采用以下组合方式:在经典的x86架构机器上运行Linux操作系统,采用C语言编程。这样的组合经受住了时间的考验。这一版的一个明显变化就是从讲解IA32和x86-64转变为完全以x86-64为基础,相应地修改了第3、4、5、6和7章。同时,还改写了第2章,使之更易读、好懂;用近期的新技术更新了第6、11和12章。这些变化使得本书既和新技术保持了同步,又保留了描述系统本质的内容以及从程序员角度出发的特色。
    除了翻译本书,我们也开始以本书为教材讲授“计算机系统基础”课程,对这本书的理解也随之越来越深入,意识到除了阅读之外,动手实践更是学习计算机系统的必经之路。本书的官网提供了很多实验作业(Lab Assignment),其中不乏有趣且有一定难度的实验,比如Bomb Lab。有兴趣的读者除了阅读本书的内容之外,还应该试着去完成这些实验,让纸面上的内容在实际动手中得到巩固和加强。本书的官方博客也不断更新着有关这本书和配套课程的最新变化,这也是对本书的有益补充。
    第3版从翻译的角度来说,我们尽量做到更流畅,更符合中文表达的习惯。对于一些术语,比如memory,以前怕出错就统一翻译成存储器,现在则尽可能地按照语境去区分,翻译成内存或者存储器。
    在此,要感谢本书的编辑朱劼、姚蕾以及和静,有她们的支持、鼓励和耐心细致的工作,才能让本书如期与读者见面。
    由于本书内容多,翻译时间紧迫,尽管我们尽量做到认真仔细,但还是难以避免出现错误和不尽如人意的地方。在此欢迎广大读者批评指正。我们也会一如既往地维护勘误表,及时在网上更新,方便大家阅读。(另外,本版第1次印刷时,我们已经根据官网2016年3月1日前发布的勘误进行了修正,就不在中文勘误中再翻译了。)

    龚奕利 贺莲
    2016年5月于珞珈山




    当当网官方旗舰店
    • 编辑推荐
    • 内容简介
    • 作者简介
    • 目录
    • 前言
    • 产品特色

    售后保障

    最近浏览

    猜你喜欢

    该商品在当前城市正在进行 促销

    注:参加抢购将不再享受其他优惠活动

    x
    您已成功将商品加入收藏夹

    查看我的收藏夹

    确定

    非常抱歉,您前期未参加预订活动,
    无法支付尾款哦!

    关闭

    抱歉,您暂无任性付资格

    此时为正式期SUPER会员专享抢购期,普通会员暂不可抢购