第一图书网

深入理解计算机系统

(美)Randal E.Bryant, David R.O'Hallaron 电子工业出版社
出版时间:

2006年07月  

出版社:

电子工业出版社  

作者:

(美)Randal E.Bryant, David R.O'Hallaron  

页数:

978  

Tag标签:

无  

前言

This book; Computer Systems: A Programmer's Perspective (CS:APP), is for programmers who want to improve their skills by learning what is going on "under the hood" of a computer system. . Our aim is to explain the enduring concepts underlying all computer systems, and to show you the concrete ways that these ideas affect the correctness, performance, and utility of your application programs. Unlike other systems books, which are written primarily for system builders, this book is written for programmers, from a programmer's perspective. If..

内容概要

本书主要介绍了计算机系统的基本概念,包括最底层的内存中的数据表示、流水线指令的构成、虚拟存储器、编译系统、动态加载库,以及用户应用等。书中提供了大量实际操作,可以帮助读者更好地理解程序执行的方式,改进程序的执行效率。此书以程序员的视角全面讲解了计算机系统,深入浅出地介绍了处理器、编译器、操作系统和网络环境,是这一领域的权威之作。 本书适合作为计算机及相关专业的本科生教材,同时也适用于编程人员参考阅读。

作者简介

Randal E.Brant:1981年在麻省理工学院获计算机科学博士学位,现任美国卡内基·梅隆大学计算机学院院长,是ACM和IEEE的双会士,多次获得这两个协会颁发的大奖。Bryant教授从事计算机系统方面的教学工作已超过20年,结合计算机体系结构课程多年的教学经验,他开始把关注点

书籍目录

1 A Tour of Computer Systems 1.1 Information is Bits + Context 1.2 Programs Are Translated by Other Programs into Different Forms 1.3 It Pays to Understand How Compilation Systems Work 1.4 Processors Read and Interpret Instructions Stored in Memory 1.5 Caches Matter 1.6 Storage Devices Form a Hierarchy 1.7 The Operating System Manages the Hardware 1.8 Systems CommunicateWith Other Systems Using Networks 1.9 The Next Step 1.10 Summary Bibliographics Notes Part I Program Structure and Execution 2 Representing and Manipulating Information 2.1 Information Storage 2.2 Integer Representations 2.3 Integer Arithmetic 2.4 Floating Point 2.5 Summary Bibliographic Notes Homework Problems Solution to Practice Problems 3 Machine-Level Representation of Programs 3.1 A Historical Perspective 3.2 Program Encodings 3.3 Data Formats 3.4 Accessing Information 3.5 Arithmetic and Logical Operations 3.6 Control 3.7 Procedures 3.8 Array Allocation and Access 3.9 Heterogeneous Data Structures 3.10 Alignment 3.11 Putting it Together: Understanding Pointers 3.12 Life in the RealWorld: Using the GDB Debugger 3.13 Out-of-Bounds Memory References and Buffer Over 3.14 *Floating-Point Code 3.15 *Embedding Assembly Code in C Programs 3.16 Summary Bibliographic Notes Homework Problems Solutions to Practice Problems 4 Processor Architecture 5 Optimizing Program Performance 6 The Memory HierarchyPart Ⅱ Running Programs on a System 7 Linking 8 Exceptional Control Flow 9 Measuring Program Execution Time 10 Virtual MemoryPart Ⅲ Interaction and Communication Between Programs 11 System-Level I/O 12 Network Programming 13 Concurrent ProgrammingA HCL Descriptions of Processor Control LogicB Error HandlingBibliographyIndex


编辑推荐

《深入理解计算机系统》(英文版)适合作为计算机及相关专业的本科生教材,同时也适用于编程人员参考阅读。

图书封面

图书标签Tags

广告

下载页面


深入理解计算机系统 PDF格式下载



如果说计算机类的书里有什么适合一个非相关专业的入门,我一般都会在推荐书目中加上这本书。原因就是这本书的内容,从计算机的数字基础讲起,随后是CPU,内存,IO,网络。然后是程序的编译,连接,到程序的执行。最后还可以让读者有一个性能评价及调优的概念。如果读者对这些内容都有了一个比较深的认识,那么可以说计算机相关的知识都掌握。无论是将来做开发,还是做其它的IT相关工作。都是相当有帮助的。可以说是将计算机的分散概念全部提练后,给了读者一个整体的认识。


这本书将以前在学校里学过的计算机原理,计算机体系结构,编译原理,操作系统,网络等课程串在了一起。里面关于performancemeasurementandoptimization介绍也很不错。强烈推荐!!!


英文版更好,免得理解错误。这书果然不错,适合给程序员看,可以让她们加深理解。学操作系统和计算机架构的人也应该看看,受益匪浅。


该书详细的介绍了计算机系统的知识,对于想系统学习的人有很大的帮助啊!


很好的一本书,适合学计算机的人读,书是全英文的,我的英文不是太好,读起来有点费力。但可以从里面学到很多东西。


讲的通俗易懂我建议每个学计算机大学生都来看看


看英文版的感觉真实点,看这本书感觉离机算机更近一点儿


买了本英文版的,中文版的翻译得还是不错的.电子专业的想搞底层开发的话,值得一看


程序员练内功的宝典


好书一本,英文版的,对于有一定基础的c学习者,好书,全世界强力推荐


还是英文版看起来爽


就是英文确实有点难度,不过书写的真的很好,自学都很适合!


非常好!非常好!非常好!非常好!书很新!


这本书非常好,拿到后很喜欢。


经典教材,值得一买,慢慢看,收获不好


由于机工的第二版没货,只好买这第一版。其实相对于每一版之间的那些少数变化而言,认真把书看完看透的意义更大。


电子版看了几章,决定买来看.这样的书不是读一遍就可以的.留在手边有时间就翻翻.


买到书了


很经典的书,帮同事买的,自己没有时间读哦


传说中的经典 拜读


经典书籍,底层的知识,挺厚,先收着,有时间再看。


读过电子书,才买的,确实是经典!


由浅入深,由于本人英语水平有限,建议购买中文版。


怎么回事,我都10多天了,还不到货.


英文不好,看着难啊难,当学英语了


不错的书,作为入门书,对于非计算机专业出身的可能更加有用。计算机专业的也可以做为参考书。不过原版的看起来比较慢,没有效率。呵呵,英文太臭了


书的质量一般,不过想对计算机有深入了解的同学不要错过


好书我收藏,看完中文版的再看英文版的。呵呵


纸比较薄,不过也就没那么重啊.看了前几章了,视角独特呀..书里有些错误,不过官网都有校正.


想买原装正版的,去书店没找到.就在当当上买了.下单到收货,用了四天吧.还行.书是好书,就是纸张质量不怎么样.汗,跟地摊上买的武侠小说似的,透过这一页能看到下一页...有收藏价值的书,总是希望质量好一点的,十几块钱都是小事.希望当当的同志们了解这一点.


送货速度还行,纸张比较薄。
本来这本书电子版的看了一半,但总没有实体书的感觉。
有条件的有毅力的还是买实体书把,虽然不知道自己能坚持多久。。
好好学习咯


书纸张很不好,很薄, 有的地方甚至 印透了,大概是 页数太多的原因, 总体上还满意吧。


书的印刷啊质量什么的倒是都还不错,内容就还没看了...


不过比较满意


英文好多不懂


纸的质量真的很差


都说这是经典很厚,又是英文,啥时候看完阿


althoughmanyenglishwordsidon'tregconize,iamsurethisbookissuitableforprogrammernomatterwhichlanguageyou'reusing


英文版第2版已于2010年2月份出版,机械工业出版社华章公司已引进翻译版权,仍旧邀请龚奕利、雷迎春两位老师翻译。      名著名译,预计出版时间:2010 年9月份。      我们会定期公布此书进展,敬请关注。


怎么会空洞无物呢?这书应该是计算机界的经典之作了


也太薄了吧...


1、本书为英文原版教材《Computer Systems - A Programmer's Perspective》的影印本,作者Randal E. Bryant为卡耐基梅隆大学计算机学院院长、IEEE和ACM双院士,原书堪称计算机科学领域的经典教材之一,是计算机领域的入门之作、程序设计人员的必读之作。2、本书体系结构优秀,覆盖广泛全面,讲解细致,习题充实,同时提供了在线教学网站([...])以供学习参考,是计算机领域程序研发人员的入门之作。3、本书体现了外文教材的一大特色,即善于举例引导学生深入思考,同时援引富有应用性的典型范例,促使学生进行实践性的考量。4、本书采用小16开本,封面为绿色调,装帧设计出色,字体排版适中。全书十分厚重,页码数甚至高达978,但是作为单页纸张的质量不佳,十分单薄且极易污损。购买价格:66.70(2009-02-23)


这本深入理解计算机系统确实经典,很喜欢


很值得学计算机的人看,而且看懂了很有收获


很早同学就推荐这本书了这次终于买了一定好好看,对得起这66元钱正版的书,印刷也很不错


这本书非常好,我个人非常推荐,学习计算机的必修课


讲解深刻,通俗易懂,好书.


印刷质量太差,远不如中文版的纸质。书绝对是好书。


从硬件体系结构,操作系统,编译,程序运行的角度深入剖析了计算机系统,真是好书。建议学了一点汇编和C之后,再看这个


书不错就是有点旧,还有的破损


书写的是好,可是有3页烂的厉害,外面看不出来,肯定是发货时就那样了.第一次收到烂书,有点不爽.换又太痲烦.


名师写出来的,绝对经典!对于理解底层的程序的操作具有不可替代的作用!


即便是初学者都可以很大程度地从这本书中获益。翻译版有很多地方会造成误解,还是原版好


  读完这本书后,敲代码时就能想象出代码变成bit流在机器的各个组件里流动。写代码也更有把握了。
  作为一个系统程序员,这本书应该是一本入门的书籍,然我们对计算机系统整体有一个全面的认识。
  ====分割线
  读完这本书后,敲代码时就能想象出代码变成bit流在机器的各个组件里流动。写代码也更有把握了。
  作为一个系统程序员,这本书应该是一本入门的书籍,然我们对计算机系统整体有一个全面的认识。


  上学的时候硬着头皮读的这本书,每天抱着这个厚厚的书本,一天几页,十几页。最终读完了这部长篇巨著。也许是上学期间做的最有成就的一件事情,在书中得到的知识为我后来的道路打下了坚实的基础。也将我关于编程的知识从头到尾串了起来。最主要的是,从此以后再也不惧怕读大部头的书了。
  
  学计算机基础很重要。这本书不但适合新手,也适合老手,深入浅出,涵盖了计算机的三大课程。国内的教材,只重片面,学完以后只见树木,不见森林。这本书从程序的视角帮读者去理解问题,推荐想走程序员这条道路的人从头到尾读完。读完后将受益匪浅。
  


  这本书很有吸引力,深入浅出,适合初学者,也适合老手。我不是枪手。
  这本书很有吸引力,深入浅出,适合初学者,也适合老手。我不是枪手。
  这本书很有吸引力,深入浅出,适合初学者,也适合老手。我不是枪手。
  这本书很有吸引力,深入浅出,适合初学者,也适合老手。我不是枪手。
  这本书很有吸引力,深入浅出,适合初学者,也适合老手。我不是枪手。
  这本书很有吸引力,深入浅出,适合初学者,也适合老手。我不是枪手。


  找工作之前认真把《深入理解计算机系统》看了一遍,看完最大的收获是理解了一个程序如何从源代码,经过编译链接,变成正在运行的程序。每次面试的时候把程序地址空间一讲,佯装自己专业基础扎实,硬是把面试官骗过去了,哈哈~~
  书的后半部门讲到了套接字,之前看《UNIX网络编程》一直对套接字理解不深刻,看完《深入理解计算机系统》后半部分,顿时有种摸到门道的感觉。
  对于我这种平时几乎不写代码的人,看来这本书,总算把上课学的编译原理、操作系统等等基础课程的知识串联起来了。我想对于经常写代码的人,看这本书理解更快了。这书真是的程序员必看的书。
  唯一觉得不足的地方时,本书对内存管理和虚拟内存介绍的不多,当然也有可能是书上写了,但是我没理解透彻。


  好几个同事都给我推荐了这本,也有那些同事都在学习这本,我觉得我基础不错,感觉看其它牛B的书也一样
  
  一周前,准备再把编译链接与加载再看一遍,《即程序员的修养》那本,之前关于动态链接,重定位部分,看了几遍都没理解透。于是翻出了这本,第七章专门讲编译链接的,果然讲的清楚明白,实现与原理讲的都很清楚,很好理解。这本的第七章,虽然只有几十页,讲的清晰明了^_^
  
  于是又把第二章与第三章看完。
  
  第2章的数据的存储、数据的表示、及数据运算,看完后,才真正的理解程序数据是怎么玩的。对于同一数据(比如int b),C语言、汇编语言及机器语言的view,是各不相同的。由于对机器的数据表示及运算理解不透,因此对于汇编里关于进位及溢出,也没理解透。看完这章,再debug了,才觉得理解了程序数据的,才理解了数据是怎么存储、表示、运算的,CF与OF是怎么回事。
  
  
  第三章,汇编部分,讲的蛮深入浅出的,且对于C代码的基本程序结构(for/while/if/switch等),及函数调用栈,作者从汇编语言及机器语言机级进行了详细讲解。看完后,对于理解C与汇编代码的相互转换,为看C汇编后后成的汇编代码,或反汇编代码,很有帮助。
  
  
  再如,以前困绕我很久的“存储器的字节对齐”,此书只用了两页,及两个习题,就讲清楚了。不仅讲了怎么对齐,还讲解了为什么要对齐。
  
  汗,书买了好久,搞活动的时候凑单买的,一直放在那,一直没翻过。CSAPP确实很好,好多知识点都讲的非常清楚,而且很简洁。
  
  神书!


  如果你觉得这本书过于厚重担心看不下来的话,不妨跟着coursera的Hardware/Software Interface这门课程去听一听。这本书虽然是这门课的超集,但是其中的关键与精华都在课程中有讲到。其实更关键的是,coursera的课将原书中最为精彩的lab移植了过来,在做这些作业时很难感到枯燥。下面把这门课的lab列出来,以及一些提示:
  
  Lab1:位运算,我觉得这是最无聊也是最有趣的一个Lab,看你怎么看它。说其无聊主要是指没有成就感(相对于其他的Lab来说),说其有趣是指也许这是你第一次用这么少的代码实现这么多的功能。甚至可以只用与或非来实现三目运算符
  
  Lab2:BinaryBomb,拆炸弹,非常经典的Lab。一共有6个Phase,每个Phase都需要你打开GDB(懒人可以用DDD),打各种断点,查看各种寄存器内存状态,分析汇编语句,整理出结构。6个Phase从易到难,分别是简单的比较(助教已经演示)、循环(这个可以算是最耗时间的,一旦你通过了这个Phase,剩下的就好说了)、switch语句(注意计算offset)、递归(嗯,fib什么的)、指针数组(注意跟踪过程,一定要有纸笔)、链表(排序算法什么的)。这个Lab是整门课最精彩的Lab,因为时刻伴随着你在一步步地逼近真相的神秘感与快感。当这个Lab做完后,你会发现GDB调试功力大涨,对于操作系统的调用过程也很熟悉了。
  
  Lab3:内存攻击,最邪恶的Lab没有之一,这个Lab是要你去利用内存溢出的漏洞去攻击给你提供的可执行程序。这个Lab也有好几个Phase,最后一个Phase是直接注入自己的汇编代码。sendmail真是被黑出翔
  
  Lab4:不透明的Cache,又是类似于Lab2的黑箱Lab,通过给几个虚拟的Cache提供输入,以及Cache给你返回的Hit/Miss信息判断Cache的规格。对了解Cache的结构很有帮助
  
  Lab5:手写一个malloc,嗯,你没看错。不过其中最痛苦的块合并功能已经给你写好了,你只要知道malloc、free的流程就可以了,侯捷老师课上学的东西终于能派上用场了
  
  这就是全部的5个lab,设计的精巧程度自然不用多说,关键是,之前有可能只是抽象的学过这些概念,比如Cache、比如内存溢出攻击,这次就可以实际观察、演练。
  
  这门课的最后一章还讲了一些JVM与Intel架构的不同之处,对Java有些了解的同学可以听一听。
  
  最后还要说,尽管这本书和这门课很精彩,但毕竟是体系结构入门的教材,在大多数方面还是和操作系统、组成原理的深度是比不了的。所以我觉得这本书大三之前还值得看(最好在操作系统前看),到大三之后,除非是为了面试临时复习抱佛脚,否则这本书还是讲的有些浅了。不过如果是作为汇编的入门,倒是很好的教材。


   有那么一阵子,别人要是说一本书翻译的不好,就好像是在为自己看不懂而开脱一样、或是仅仅为了显摆一下自己的英文水准,可惜我不在此之列。
   我也不想把那些翻译很烂的句子逐一挑出来,像是摆地摊儿似的在下面摆一溜,没那个必要。而不好之处在于,有些句子让人完全摸不到头脑,稀里糊涂的。原本结构非常紧凑的一本书让译者翻译得支离破碎,又似如风中残烛,读起来味同嚼蜡而且读速极慢。我英文也不是非常好,但是读翻译版的速度和理解程度都要远远小于读英文版的,所以我是非常反感译者的翻译。
   这本书好不好?我认为原版是非常棒的。整体上更注重软件一点(当然,这从书名也能看出来),有多地方是没有具体深入讲解的,大体上算是导论性质,但又比一般的导论来的更具角度和深刻些。
   总的来说,这本书勉强算在我的阅读之列,因为遇到这本书时,内容对我而言早已明白的差不多了,不过极力推荐给大学一年级上学期的本科专业同学阅读,但如果你到了大二还没读完,也就别读了,大三了还提这本书,也就更丢人啊,不是吗?。。~~


    两个月来断断续续地把CSAPP中ICS课程的章节看完。讲系统的书多少有些枯燥,但看下来的收获与成就感是不可替代的。
  
    国内的CS专业讲计算机系统通常有两门必修课程——机组和操作系统,前者很偏硬,很多内容对于程序员不实用,也就失去了学习的兴趣。CSAPP则从程序员的视角窥视计算机系统,并无讨厌的数字电路内容,深入浅出,让人有看下来的兴致。全书以C语言和Unix系统为例子。
  
    第1章,计算机系统漫游:导论的章节。
  
    第2章,信息的表示和处理:C变量的机器级表示,最基础的内容,讲得很详细。熟悉的可以略过这一章。
  
    第3章,程序的机器级表示:也就是介绍汇编语言。国内一些汇编语言教材会从mov开始逐个介绍指令,教你手工编写汇编代码,让人无所适从。CSAPP则是把一段C代码与GCC编译成的汇编代码对照着讲,意在让你理解汇编代码——毕竟这年头很少会用到汇编语言开发什么东西,更多的是通过观察汇编代码,调试或调优C,C++代码。
  
    第4章,处理器体系结构:太偏硬,直接跳过。知道现代处理器的流水线技术就够了。
  
    第5章,优化程序性能:讲指令级的优化。实际编程中,通常做到算法级的优化就够了,让编译器去干优化指令的苦差。这一章告诉我们,编译器的优化并不完美——尤其是涉及指针的操作,编译器为了确保正确的运行结果,会采取更保守的优化策略。
  
    第6章,存储器层次结构:比较枯燥的一章,局部性更好的程序跑得更快。
  
    第7章,链接:只看了静态链接的部分。“重定位”一节似乎有些晦涩,在那卡了很久才自以为看懂。
  
    第8章,异常控制流:通过异常控制流引出进程的概念,并介绍了一些Unix的库函数。很枯燥的一章……
  
    第9章,虚拟存储器:这一章很精彩。虚拟地址的概念让进程觉得自己的内存空间是连续线性的。而操作系统又能够根据映射机制作出优化——例如通过“写时拷贝”技术, fork函数比想像的廉价。“动态存储器分配”一节介绍了各种分配器的实现,以及malloc函数的实现——此前一直以为malloc只是简单地向系统申请堆空间……“垃圾收集”一节并不深入,只是简单地介绍了Mark&Sweep算法,以及为什么C语言难以有效地垃圾回收。
  
    以后再看最后3章吧……


  这本书看完了,,,
  虽然看的是英文版的,但是作者用了图去解释,所以,很容易理解,,,
  恩,前面bit级的效率,操作,,,以及内存,cpu多处也是很受启发,,,
  cpu很惭愧啦,,没看过去,,
  我还是打算有时间1周也行,把这本书整理一下,做一个读书笔记,,,和同道交流一下,,,
  


  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类容易引起线程不安全的函数。
  应试 ★★: 除应聘相关职位外,并发编程考的比较少,不过需要清楚锁机制和信号量机制等。
  修炼 ★★★: 多线程程序在现今的开发中还是很常见的,但是本章介绍的比较简单,需要参考另外专门的书籍。


  这本书的中译名为“深入理解计算机系统”,有一定的问题。如果直译原书名,应该是类似于“以程序员的视角理解计算机系统”。可能在国内看来,这是讲系统的,用C和汇编语言的,因此很“深入”。事实上,这是一本入门级别的书,这本书其实并不“深入”,它谈论的内容还是相对比较浅的。但“浅”不代表“浅薄”,写一本面向初学者的好书往往是非常困难的,它的作者都是顶尖学府的教授,结合多年教学经验而写出来的。
  
  CMU把这本书作为“Introduction to Computer System”课程的教材,是面向计算机专业低年级学生的“计算机系统介绍(导论)”。这些学生只是刚刚了解如何使用一门高级语言,对于计算机系统的工作方式等话题可谓一点都没有接触过,而CSAPP对读者的背景也只要求是“一些编程经验”而已。这本书的话题覆盖面很广,从计算机的基本组成,二进制数据表示方式,到机器级别的指令,CPU工作方式,存储结构和优化,操作系统的虚拟内存管理,程序运行方式,I/O,网络、到(较底层)程序性能优化和并行程序开发等等。所以,它其实覆盖了“计算机组成原理”,“操作系统”等许多课程的内容,其中的许多话题都能再次展开,继续深入,都能再变成一本,甚至N本经典。在高年级的计算机专业课程设置中,都会有更加纵向的内容出现。另外,《计算机科学前沿技术》一书对CMU中的课程体系进行了介绍,有兴趣的读者可以去看看,该书还推荐了很多其他好书,当然也包括这本书,准备按照这本书的介绍全部拿来看看。
  
  “覆盖面广”,其实就是这本书的最大优点。它告诉我们计算机是如何设计和工作的,操作系统有哪些重点,它们的作用又是什么。CSAPP的目标其实便是要讲清楚原理,但并不会把某个话题挖掘地过于深入,过于细节。看看这本书后,我们就可以对计算机系统各组件的工作方式有了理性的认识。在一定程度上,其实它是在锻炼思维方式 -- 计算思维。


   这本书是我见过的最好的计算机系统书籍。首先要明白一点,这里所说的系统不是指计算机操作系统,而是计算机整体,包括软件和硬件。其实真正学计算机,是无所谓软硬兼之分的。不懂硬件造不出好的软件;不懂软件硬件也不会出色。该书处处都很精彩,能将软件与硬件及所有计算机的内容融汇在一本书里,用极浅显的语言讲出来,非常棒。
   书里有些内容我只有在这本书里见到过,比如程序代码优化,是和计算机硬件相结合讲的,读完之后非常受用。
   该书简洁而不简单,我是去年1月份买的,到今年4月份才勉强看的有了一点收获,我现在读大学本科计算机专业二年级,这本书给我的感觉是非常专业,非常出色。


  在刚上大学一年级的时候,学校的哥哥姐姐们都力荐了这本书,一直奉行“好书就该收藏”,所以二话不说就买下了这本所谓的“神作”,刚买来读了百来页,但是略觉枯燥,因为与硬件相比,我更喜欢的是软件,其实我是没有认识到,读这本书要一定的“计算机组成原理”的基础。
  于是束之高阁......
  待二年级下半年,我重新拿起了这本书,刚读了一章,才知道我已经冷落了这本书整整一年的时间,惭愧啊。
  这本书绝对是本好书,古人所谓茅塞顿开,醍醐灌顶,只要你拿起这本书,并且用心读下去,绝对是这种感觉,我这才体会到“爱不释手”的爱书的感觉,总想一下子把它读完,但又不舍得,所以还是一字一句的啃。
  无论是软件还是硬件,这本书都涉及了。
  虽为好书,但也并非零基础,大家最好在学习计算机组成原理的时候一起看,一个字爽。
  我特别喜欢虚拟存储器,Cache这些部分,特别赏心悦目。


   寒假花了3个多星期,把这本书的第一、第二部分读完。这本书讲述的计算机如何工作的,较偏向底层,稳重思路非常清晰的,特别是前面的部分很详细,到后面可能由于篇幅的关系后面显得有些简略。
   书中配套是实验还是非常值得一做的,并且非常有趣,我做了前3个lab,从中学到的还是很多的。
   平时写程序都是在高级的层面上,我们都不需要知道计算机内部是如何工作的,正如书中提到计算机中的分层和抽象思想一样,分层和抽象的思想是伟大的,我们可以专注于自己领域而不用关注其它方面,但是导致我们编程那么久,对于计算机还是一无所知。
   而这本书恰恰就是讲述计算机是如何工作的,虽然不懂得底层不妨害写程序,但我始终认为不知道计算机内部是如何工作的很难称得上是好的程序员。
   推荐!


  适合计算机专业的本科生入门,以及希望了解计算机的人士阅读。全书大只讲解了关于编程的基础知识,设计体系结构,操作系统。虽然从题目的意思来说,本意是通过本书让程序员编出性能良好的程序。但实际上正如前面提到的,讲了很多计算机专业的入门知识。让人对计算机软硬件各个方面有了大体了解。很不幸,我到大三才读了这本书。


  对于想修炼计算机内功的程序员来说是一个很好的选择,我觉得计算机程序员先读读这样的书再去学习那些语言之类的,语言只是外功,内功不行外功练得再多也无法融汇贯通,虽然我只读了一部分,但是我已经深深喜欢上这本书了,有些习题也不是很明白,有希望一起交流学习的欢迎加入群:177094968


  英文名:Computer Systems : A Programmer's Perspective 作者:【美】Randal E.Bryant、David O'Hallaron
  
  序言
  
  第1章 计算机系统漫游
    计算机系统是由硬件和系统软件组成的,它们共同协作以运行应用程序。计算机内部的信息被表示为一组组的位,它们依据不同的上下文又有不同的解释方式。程序被其他程序翻译成不同的形式,开始时是ASCII文本,然后被编译器和连接器翻译成二进制可执行文件。
    处理器读取并解释存放在主存里的二进制指令。因为计算机花费了大量的时间自啊存储器、I/O设备和CPU寄存器之间拷贝数据,所以系统的存储设备就按层次排列,CPU寄存器在顶部,接着是多层的硬件高速缓存设备、DRAM主存储器和磁盘存储器。在层次模型中位于更高层的存储设备比低层的存储设备要快,单位比特造价也高。程序员通过理解和运用这种存储层次结构的知识,可以优化C程序的性能。
    操作系统内核是应用程序和硬件之间的媒介。它提供3个基本的抽象概念:文件是对I/O设备的抽象概念;虚拟存储器是对主存和磁盘的抽象概念;进程是处理器、主存和I/O设备的抽象概念。网络提供了计算机系统之间通信的手段。从某个系统的角度来看,网络就是一种I/O设备。
  
    程序编译过程:预处理->编译->汇编->链接
  
    理解编译系统如何工作的好处:
    1)优化程序性能
    2)理解链接时出现的错误
    3)避免安全漏洞
  
    系统的硬件组成:总线、I/O设备、主存、处理器
    存储设备的层次结构:寄存器、芯片上的L1,芯片外的L2、主存储器、本地二级存储、远程二级存储
    操作系统的两个用途:防止硬件被失控的应用程序滥用;在控制复杂而又通常广泛不同的低级硬件设备方面,为程序提供简单一致的方法
    文件只不过就是字节序列。每个I/O设备,包括磁盘、键盘、显示器、甚至于网络,都可以被看成是文件。系统中所有的输入输出都是通过使用称为Unix I/O的一小组系统函数调用读写文件来实现的。
  
    系统不仅仅只是硬件。系统是互相交织的硬件和系统软件的集合体,它们必须共同协作以达到运行应用程序的最终目的。
  
  
  第1部分 程序结构和执行
  
  第2章 信息的表示和处理
    通过研究实际数字的表示,我们能够了解可以表示的值和范围和不同算术运算的属性。对于编写在全部数值范围内都能工作,而且可以跨越不同机器、操作系统和编译器组合的可移植程序来说,这种了解是非常重要的。
  
    大多数计算机使用8位的块,或叫做字节(byte),来作为最小的可寻址的存储器单位,而不是访问存储器中单独的位。机器级程序将存储器视为一个非常大的字节数组,称为虚拟存储器(virtual memory)。存储器的每个字节都由一个唯一的数字来表示,称为它的地址(address),所有可能地址的集合就称为虚拟地址空间(virtual address space)。虚拟地址空间只是一个展现给机器级程序的概念性映像(image)。实际的实现使用的是随机访问存储器RAM、磁盘存储、特殊硬件和操作系统软件的结合,来给程序提供一个看上去统一的字节数组。
    编译器和运行时系统的一个任务就是将这个存储器空间划分成更可管理的单元,来存放不同的程序对象(program object),也就是,程序数据、指令和控制信息。有各种机制可以用来分配和管理程序不同部分的存储。这种管理完全是在虚拟空间里完成的。
  
    由于编码的长度有限,计算机运算与传统整数和实数运算相比,具有非常不同的属性。当超出表示范围时,有限长度能够引起数值溢出。当浮点数非常接近于0.0,从而转换成0时,浮点数也会下溢。
    必须非常小心地使用浮点运算,因为浮点运算的范围和精度有限,而且浮点运算并不遵守普遍的算术属性,比如结合性。
  
  第3章 程序的机器级表示
    通过让编译器产生机器级程序的汇编表示,我们了解编译器和它的优化能力,以及机器代码、它的数据类型和它的指令集。当编写能有效映射到机器上的程序时,了解编译器的特性会有所帮助,一些高级语言会抽象隐藏有关程序的重要细节。理解程序是如何映射到机器上的,会让理解这些存储之间的区别容易一些。
    汇编语言与C代码差别很大,在汇编语言程序中,各种数据类型之间的差别很小。程序是以指令序列来表示的,每条指令都完成一个单独的操作。部分程序状态,如寄存器和运行时栈,对程序员来说是直接可见的。仅提供了低级操作来支持数据处理和程序控制。编译器必须用多条指令来产生和操作各种数据结构,来实现像条件、循环和过程这样的控制结构。
  
  第4章 处理器体系结构
    通常,处理一条指令包括很多操作。但是一般情况下我们将它们组织成某个特殊的阶段序列,使得即使指令的动作差异很大,但所有的指令都遵循统一的序列。每一步的具体处理取决于正在执行的指令。每一条指令都可以分解为6个步骤:取指(fetch)、译码(decode)、执行(execute)、访存(memory)、写回(write back)、更新PC(程序计数器,PC update)
    将流水线技术引入一个带反馈的系统会导致相邻指令间在发生相关时出现问题,这些相关可能会导致流水线产生计算错误,成为冒险。冒险可分为数据冒险(data hazard)和控制冒险(control hazard)。常用的用来避免冒险的技术为暂停(stalling)和前递(forwarding)
    流水线控制逻辑必须满足下面3种控制情况:
    1)处理RET:流水线必须暂停直到RET指令到达写回阶段
    2)加载/使用冒险:在一条从存储器中读出一个值的指令和一条使用该值的指令之间,流水线必须暂停一个周期
    3)预测错误的转移:在转移逻辑发现不应该选择转移之前,转移目标处的几条指令已经进入流水线了。必须从流水线中去掉这些指令。
  
    我们已经看到,指令集体体系结构(即ISA)在处理器行为(就指令集合及其 编码而言)和如何实现处理器之间提供了一层抽象。ISA提供了程序执行的一种顺序说明,也就是一条指令执行完了,下一条指令才会开始。
    流水线化处理让不同的阶段并行操作,改进了系统的吞吐量性能。在任意一个给定的时刻,多条指令被处理。在引入这个并行性的过程中,我们必须非常小心,以提供与程序的顺序执行相同的用户可见的、程序级行为。
    有关处理器设计的几个重要经验:
    1)管理复杂性是首要问题
    2)我们不需要直接实现ISA
    3)硬件设计人员必须非常谨慎小心
  
  第5章 优化程序性能
    优化程序性能,主要通过:消除循环的低效率、减少过程调用、消除不必要的存储器引用、针对现代处理器进行代码调整(使用浮点、变换平台)、降低循环开销、转换到指针代码(可能会降低程序的可读性)、提高并行性(比如循环分割,但是可能会导致寄存器溢出,所以要同时对并行做限制)
    存储器的性能包括:加载的执行时间和存储的执行时间
  
    优化程序性能的基本策略:
    1)高级设计:为手边的问题选择适当的算法和数据结构。要特别警觉避免使用会渐进地产生糟糕性能的算法或编码技术。
    2)基本编码规则:避免限制优化的因素,这样编译器就能产生高效的代码。
     消除连续的函数调用。在可能时,将计算移到循环外。考虑有选择的妥协程序的模块性以获得更大的效率。
     消除不必要的存储器引用。引入临时变量来保存中间结果。只有在最后的值计算出来时,才将结果存放到数组或全局变量中。
    3)低级优化
     尝试各种与数组代码相对的指针形式
     通过展开循环降低循环开销
     通过诸如迭代分割之类的技术,找到使用流水线化的功能单元的方法
    注意在优化代码时要使用检查代码(checking code)来测试代码的每个版本,以确保在这一过程中没有引入错误。
  
    虽然关于代码优化大多数论述都描述了编译器是如何能生成高效代码的,但是应用程序员有很多方法来协助编译器完成这项任务。没有任何编译器能用一个好的算法或数据结构代替低效率的算法或数据结构,因此程序设计的这些方面依然是程序员主要关心的。我们还看到妨碍优化的因素,比如存储器别名和过程调用,严重限制了编译器执行大量优化的能力。同样,程序员必须对消除这些妨碍优化的因素负主要的责任。
    随着我们对优化的深入,研究汇编代码以及试着理解机器是如何执行计算的变得重要起来。对于现代、乱序处理器上的执行,分析程序是如何在无限处理资源但是功能单元的执行时间和发射时间与目标处理器相符的机器上执行的,收获良多。为了精炼这个分析,我们还应考虑诸如功能单元数量和类型这样的资源约束。
    包含条件转移或与存储器系统复杂交互的程序,比我们首先考虑的简单循环程序,更加难以分析和优化。基本策略是使循环更容易预测,并试着减少存储和加载操作之间的相互影响。
    当处理大型程序时,将我们的注意力集中在最耗时的部分变得很重要。代码剖析程序和相关的工具能帮助我们系统地评价和改进程序性能。
    Amdahl定律:其主要思想是当我们加快系统一个部分的速度时,对系统整体性能的影响依赖于这个部分有多重要和速度提高了多少。因此要想大幅度提高整个系统的速度,我们必须提高整个系统很大一部分的速度。Amdahl定律提供了对通过只改进系统一部分所获得的性能收益的一个简单但是很有力的看法。收益既依赖于我们对这个部分的提高程度,也依赖于这个部分原来在整个事件中所占的比例。
  
  第6章 存储器层次结构
    存储器系统是一个具有不同容量、成本和访问时间的存储设备的层次结构。靠近CPU的小的、快速的高速缓存存储器作为存储在相对慢速的主存储器中数据和指令子集的缓冲区域。主存暂时存放在较大的慢速磁盘上的数据,而这些磁盘又常常作为存储在通过网络连接的其他机器和磁盘或磁带上的数据和缓冲区域。
    计算机系统中的一个基本而持久的思想:如果你理解了系统是如何将数据在存储器层次结构中上上下下移动的,那么你可以编写你的应用程序,使得它们的数据项存储在层次结构中较高的地方,在那里CPU能更快地访问到它们。这个思想围绕着计算机程序的一个成为局部性(locality)的基本属性。具有良好局部性的程序倾向于一次又一次地访问相同的数据项集合,或是倾向于访问临近的数据项集合。具有良好局部性的程序比局部性差的程序更多地倾向于从存储器层次结构中较高层次处访问数据项。因此运行得更快。
    局部性通常有两种形式:时间局部性(temporal locality)和空间局部性(spatial locality)。在一个具有良好时间局部性的程序中,被引用过一次的存储器位置很可能在不远的将来再被多次引用。在一个具有良好空间局部性的程序中,如果一个存储器位置被引用了一次,那么程序很可能在不远的将来引用附近的一个存储器位置。
    
    理解存储器层次结构的本质的程序员能够利用这些知识,编写出更有效的程序,无论具体的存储系统结构是怎样的,应使用以下技术:
    1)将你的注意力一种在内部循环上,大部分计算机和存储器访问都发生在这里
    2)通过按照数据对象存储在存储器中的顺序来读数据,从而使得你程序中的空间局部性最大
    3)一旦从存储器中读入了一个数据对象,就尽可能多地使用它,从而使得你程序中的时间局部性最大
    4)记住,不命中率只是确定你代码性能的一个因素(虽然是重要的)。存储器访问数量也扮演着重要角色,有时需要在两者之间做一下折中。
  
  
  第2部分 在系统上运行程序
  
  第7章 链接
    链接(linking)就是将不同部分的代码和数据收集和组合成为一个单一文件的过程,链接可以在编译时由编译器来完成,也可以在加载时和运行时由动态链接器来完成。链接器处理成为目标文件的哦二进制文件 ,它有3种不同的形式:可重定位的、可执行的和共享的。可重定位的目标文件由静态链接器组合成一个可执行的目标文件,它可以加载到存储器中并执行。共享目标文件(共享库)是运行时由动态链接器链接和家在的,或者隐含地在调用程序被家在和开始执行时,或者根据需要在程序调用dlopen库函数时。
    理解链接器对我们的作用:
    1)理解链接器将帮助你构造大型程序
    2)理解链接器将帮助你避免一些危险的错误
    3)理解链接将帮助你理解语言的作用域规则是如何实现的
    4)理解链接将帮助你理解其他重要的系统概念
    5)理解链接将使你能够开发共享库
  
    链接器的两个主要任务是符号解析和重定位。符号解析将目标文件中的每个全局符号都绑定到一个唯一的定义,而重定位确定每个符号的最终存储器地址,并修改对那个目标的引用。
    静态链接器是由像GCC这样的编译器调用的。它们将多个可重定位目标文件组合成一个单独的可执行目标文件。多个目标文件可以定义相同的哦符号,而链接器用来悄悄地解析这些多处定义的规则可能在用户程序中的微妙错误。
    多个目标文件可以被链接到一个单独的静态库中。链接器用库来解析其他目标模块中的符号引用。许多链接器通过从左到右的顺序扫描来解析符号引用,这是另一个引起迷惑的链接时错误的来源。
    加载器将可执行文件的内容映射到存储器,并运行这个程序。链接器还可能生成部分链接的可执行目标文件,这样的文件中有未解析的到定义在共享库中的程序和数据引用。在加载时,加载器将部分链接的可执行文件映射到存储器,然后调用动态链接器,它通过加载共享库和重定位程序中的引用来完成链接任务。
    被编译为位置无关代码的共享库可以加载到任何地方,也可能在运行时被多个进程共享。为了加载、链接和访问共享库的函数和数据,应用程序还可以在运行时使用动态链接器。
  
  第8章 异常控制流
    现代系统通过使控制流发生突变来对系统状态的变化做出反应(这些系统状态不是被内部程序变量捕获的,而且也不一定要和程序执行相关),这些突变称之为ECF(Exceptional Control Flow,异常控制流)。ECF发生在计算机系统的各个层次:硬件层、操作系统层、应用层。理解ECF很重要,主要有以下4个原因:
    1)理解ECF将帮助你理解重要的系统概念
    2)理解ECF将帮助你理解应用程序是如何与操作系统交互的
    3)理解ECF将帮助你编写有趣的新应用程序
    4)理解ECF将帮助你理解软件异常如何工作
  
    在硬件层,异常是一种形式的异常控制流,他就是控制流中的突变,用来响应处理器状态中的某些变化,一部分是由硬件实现的,一部分是由操作系统实现的。在任何情况中,当处理器检测到有事件发生时,它就会通过一张叫做异常表的跳转表,进行一个简洁过程调用(异常0,到一个专门设计用来处理这类事件的操作系统子程序——异常处理程序。当已成处理程序完成处理后,根据异常事件的类型,会发生以下3种情况中的1种:
    1)处理程序将控制返回给当前指令Icurr(当事件发生时正在执行的指令,fault)
    2)处理程序将返回给Inext(如果没有发生异常将会执行的下一条指令,interrupt、trap)
    3)处理程序终止被中断的程序(abort)
  
    有四种不同类型的异常:中断、故障、终止和陷阱。当一个外部的I/O设备(定时器芯片或磁盘控制器),设置了处理器芯片上的中断管脚时,(对于任意指令)中断会异步发生。控制返回到中断指令的下一条指令。执行一条指令可能导致故障和终止的发生。故障处理程序会重新开始故障指令,而终止处理程序从不将控制返回给被中断的流。最后,陷阱就像是用来实现系统调用的函数调用,系统调用提供给应用到操作系统代码的受控入口点。
  
    在操作系统层,内核提供关于一个进程的基础性概念。一个进程提供给应用的2个重要的抽象:
    1)逻辑控制流(它提供给每个程序一个假象,好像它是在独占地使用处理器)
    2)私有地址空间(它提供给每个程序一个假象,好像它是在独占地使用主存)
    在操作系统和应用之间的接口处,应用可以创建子进程,等待它们的字进程暂停或者终止,运行新的程序,并捕获来自其他进程的信号。信号处理的语义是微妙的,并且随系统不同而不同。
  
    一个信号(signal)就是一条消息,它通知进程一个某种类型的事件已经在系统中发生了。每种信号类型都对应于某个类型的系统事件。低层的硬件异常是由内核异常处理程序处理的,对用户进程而言通常是不可见的。信号提供了一种机制向用户进程通知这些异常发生。传送一个信号到目的进程是通过发送信号和接收信号两个不同步骤组成的,而一个待处理信号(只发出而没有被接收,pending signal)最多只能被接受一次。
    当一个程序要捕获多个信号时,会发生待处理信号被阻塞;待处理信号不会排队等待和系统调用可以被中断等问题。
    
    而在应用层,C程序可以使用非本地跳转来规避正常的调用/返回栈规则,并且直接从一个函数转移到另一个函数。
  
  第9章 测量程序执行时间
    计算机用来记录时间流逝主要有2种基本机制:
    1)基于低频率计时器(timer),它会周期性中断处理器。它发生的频率似乎很快,但是从微观的角度来看却很慢。
    2)基于计数器(counter),每个时钟周期计数器会加1。在负载很重的系统上误差会非常大。
    由于上下文切换引起的计时变化会非常大,因此必须消除。而两种方法都各有缺陷,所以理解在一个特殊的的系统上能够获得的准确度是很重要的。
  
    计算机是在两个完全不同的时间尺度(time scale)上工作的。在微观级别,它们以每个时钟周期(1ns~10ns)一条或多条指令的速度执行指令。在宏观级别上,处理器必须响应外部事件(1ms)
    从一个进程切换到另一个进程需要几千个时钟周期(若干ms)来保存当前进程的状态,并且为下一个进程准备好状态。
  
    高速缓存和转移预测的哦影响可以导致执行代码的某个片段所需要的时间每次都不同。通过事先运行某些将高速缓存设置为可预测状态的代码,我们可以部分地控制引起这种变化的因素,但是在有上下文切换发生时,这些常识就没有用了。因此,我们必须进行多次测量,分析结果,以确定真实的执行时间。幸运的是,所有引起变化的因素的效果都是增加执行时间,因此秩序分析确定测出的时间的最小值是否是一个准确的测量值。
  
    设计一种准确计时方法(K次最优计时方法),需要注意到的一些重要经验:
    1)每个系统不都是不同的,不同的实现细节以及精确度可以达到多少都有很大的影响
    2)试验可以是非常有启迪性的
    3)在负载很重的系统上获得准确的计时特别困难
    4)誓言建立必须控制一些造成性能变换的因素
  
  第10章 虚拟存储器
    虚拟存储器(VM)是硬件异常、硬件地址翻译、主存、磁盘文件和内核软件的完美交互。它为每个进程提供了一个大的、一致的、私有地址空间。鉴于虚拟存储器是重要的、强大的和危险的,作为程序要需要很好的理解它。
    虚拟存储器是对主存的一个抽象。支持虚拟存储器的处理器通过使用一种叫做虚拟村支的渐渐形式来引用主存。处理器产生一个虚拟地址,在被发送到主存之前,这个地址被翻译成一个物理地址。从虚拟地址空间到物理地址空间的地址翻译要求硬件和软件的紧密合作。专门的硬件通过使用页表来翻译虚拟地址,而页表的内容是由操作系统提供的。
    虚拟存储器提供3个重要的功能:
    1)它在主存中自动缓存最近使用的存放磁盘上的虚拟地址空间的内容。虚拟存储器缓存中的块叫做页。对磁盘上的页引用会触发却也,却也将控制转移到操作系统中的一个缺页处理程序。却也处理程序将页面从磁盘拷贝到主存缓存,如果必要,将写回被驱逐的页。
    2)虚拟存储器简化了存储器管理,进而又简化了链接、在进程间共享数据、进程的存储器分配,以及程序加载。
    3)虚拟存储器通过在每条页表条目中加入保护位,从而简化了存储器保护。
  
    地址翻译的过程必须和系统中任意硬件缓存的操作集成在一起。大多数页表天目位于L1高速缓存中,但是一个称为TLB的页表条目在芯片上的高速缓存,通常会消除访问在L1上的页表条目的开销。
    现代系统通过将虚拟存储器组块(chunk)和磁盘上的文件组块关联起来,来初始化虚拟存储器组块,这个过程称为存储器映射。存储器映射为共享数据、创建新的额进程以及加载程序,提供了一种高效的机制。应用可以使用mmap函数来手工地创建和删除虚拟地址空间的区域。然而,大多数程序依赖于动态存储器,例如malloc,它管理虚拟地址空间区域内称为堆的区域。动态存储器分配器是一个有系统级感觉的应用级程序,它直接操作存储器,而无需类型系统的很多帮助。分配器有两种类型:显式分配器要求应用显式地释放它们的存储器块;隐式分配器(垃圾收集器)自动释放任何无用的和不可达的块。
  
    动态存储器分配器的实现要求:处理任意请求序列、立即响应请求、只是用堆、对齐块、不修改已分配的块。实现目标为:最大化吞吐量、最大化存储器利用率。
    有关虚拟存储器有2个关键的经验教训:
    1)即使VM是由系统自动提供的,它也是一种有限的存储器资源,应用程序必须精明地管理它
    2)与存储器有关的错误很讨厌,在C程序中很容易犯与存储器有关的错误(所以有Java和C#等类似语言的出现)
  
    对于C程序员来说,管理和使用虚拟存储器是一件困难和容易出错的任务。常见的错误事例包括:间接引用坏指针,读取未初始化的存储器,允许栈缓冲区溢出,假设指针和它们指向的对象大小相同,引用指针而不是它所指向的对象,误解指针运算,引用不存在的变量,以及引起存储器泄漏等。
  
  
  第3部分 程序间的交互和通信
  
  第11章 系统级I/O
    输入/输出(I/O)是在主存(main memory)和外部设备(磁盘驱动器、中断和网络)之间拷贝数据的过程,输入操作是从I/O设备拷贝数据到主存,而输出操作是从主存拷贝数据到I/O设备。由于了解I/O能帮助你理解其他的系统概念;以及很多时候你不能使用高级I/O函数,除了Unix I/O别无选择,所以学习I/O非常重要。
  
   一个Unix文件就是一个m字节的序列(b(0)b(1),...,b(k),...,b(m-1))。所有的I/O设备都被模型化为文件,而所有的输入和数据除都被当作对相应文件的读和写来执行。这种将设备优雅地映射为文件的方式,允许Unix内核引出一个简单的、低级的应用接口,成为Unix I/O,这使得所有的输入输出都能以一种统一且一致的方式来执行。也就是说,打开文件、改变文件位置、读写文件、关闭文件等实际上是通过对特定文件的读和写的执行来实现的。
  
   Unix提供了少量系统级函数,他们允许应用程序打开、关闭、读和写文件,提取文件的元数据,以及执行I/O重定向。Unix的读和写操作会出现不足值(short counts),应用程序必须能正确地预计和处理这种情况。应用程序不直接调用Unix I/O函数,而应该使用Rio(Robust I/O)包,Rio包通过反复执行读写操作,知道传送完所有的请求数据,自动处理不足值。
  
   Unix内核使用三种相关的数据结构来表示打开的文件。描述符表中的表项指向打开文件表中的表项,而打开文件表中的表项又指向v-node表中的表项。每个进程都有它自己单独的描述符表,而所有的进程共享同一打开文件表和v-node表。理解这些结构的一般构成就能使我们清楚地理解文件共享和I/O重定向。
  
   标准I/O库是基于Unix I/O实现的,并提供了一组强大的高级I/O例程。对于大多数应用程序而言,标准I/O更简单,是优于Unix I/O的选择。然而,因为对标准I/O和网络文件的一些星湖不兼容的限制,Unix I/O比之标准I/O更该适用于网络应用程序。
  第12章 网络编程
   所有的网络应用都是有着相似的整体逻辑结构,并且依赖相同的编程接口,基于相同的编程模型——客户端-服务器模型。服务器管理资源,以某种方式操作资源,为它的客户端提供服务。客户端和服务器通过计算机网络来通信,而对于主机而言,网络就是一种I/O设备。不同的主机通过协议( 目前使用TCP/IP协议族)来完成网络数据的传递,从而达到兼容不同的物理网络和物理主机。这种协议必须提供以下两种基本能力:
   1)命名方法。不同局域网技术有不同和不兼容的方式来为主机分配地址,协议通过定义一种一致的主机地址格式,消除了这些差异。每天主机会被分配至少一个这种internet地址,这个地址唯一地标识了它。
   2)传送机制。在电缆上编码位和将这些位封装成帧方面,不同的网络互联技术有不同的和不兼容的方式。协议通过定义一种把数据位捆扎成不连续的组块(chunk)——也就是包(packet)——的统一方式,从而消除了这些差异。一个包是由包头(header)和有效载荷(payload)组成的,其中包头包括包的大小以及源主机和目的主机的地址,有效载荷包括从源主机发出的数据位。
   因特网客户端和服务器通过在连接(connection)上发送和接受字节流来通信。从连接一对进程的意义上而言,连接是点对点(point-to-point)的;从数据可以同时双向流动的角度来说,它是全双工(full-duplex)的。并且从由源进程发出的字节流最终被目的进程以及它发出的顺序收到它的角度来说,它也是可靠(reliable)的。
   套接字(socket)是连接的端点(end-point)。对于应用程序来说,连接是以文件描述符的形式出现的。每个套接字都有相应的套接字地址(socket address),是由一个因特网地址和一个16位的整数端口组成的,用“地址:端口”来表示。当客户端发起一个连接请求事,客户端套接字地址中的端口是由内核自动分配的,成为临时端口(ephemeral port)。这里要注意的是父亲武器套接字地址中的端口通常是某个知名的端口(well-known port),是和服务对应的(如web-80、mail-25,、ftp-21)。套接字接口(socket interface)是一组用来结合Unix I/O函数创建网络应用的函数。包括Unix变种、Win和Mac等现代系统都实现了它。客户端和服务端使用套接字借口提供的打开可关闭套接字描述符的函数,通过读写这些描述符来实现彼此间的通信。
  
   Web服务器使用HTTP协议和它们的客户端(或者Browser)彼此通信。浏览器向服务器请求静态或者动态的呃内容。对静态的内容请求是通过服务器磁盘取得文件并把它返回给客户端来服务的。对动态内容的请求是通过在服务器上的一个子进程的上下文运行一个程序并将它的输出返回给客户媏来服务的。
   CGI(Common Gateway Interface)标准提供了一组规则,主要实现以下3个功能:
   1)管理客户端将程序参数传递给服务器
   2)服务器将这些参数以及其他信息传递给子进程
   3)子进程将它的输出发送回客户端。
  
   HTTP格式:
   1)请求(request):<method><uri><version>
   2)响应(response):<version><status code><status message>
  第13章 并发编程
    如果逻辑控制流在时间上重叠,那么它们就是并发的(concurrent),这种现象一般称作并发性(concurrency),出现在计算机系统的许多不同层面中,在内核里并发层是必须的,而在应用层,并发可以作为程序设计上的一个有效提高性能的方法,主要体现在以下5个方面:
   1)在多处理器上进行并行计算
   2)访问慢速I/O设备
   3)与人交互
   4)通过推迟工作以减少执行时间
   5)服务多个网络客户端
  
   使用应用级并发的应用程序成为并发程序(concurrent program)。现代操作系统提供了3种基本的构造并发程序的方法:进程、I/O多路复用和线程。进程是由内核自动调度的,而且因为它们有各自独立的虚拟地址空间,所以要实现共享数据,它们需要显式的IPC机制(进程间通信interprocess communication)。事件驱动程序创建它们自己的并发逻辑流,这些逻辑流被模型化为状态机,用I/O多路复用来显式地调度这些流。因为程序运行在一个单一进程中,所以在流之间共享数据速度很快而且很容易。线程是这些方法的综合。基于进程的流一样,线程是由内核自动调度的。同基于I/O的多路复用的留一样,线程是运行在一个单一进程的上下文中的,因此可以快速而方便地共享数据。
   无论哪种并发机制,同步对共享数据的并发访问都是一个困难的问题。提出对信号量P和V操作就是为了帮助解决这个问题。信号量操作可以用来提供对共享数据的互斥访问,也对诸如生产者-消费者程序中共享缓冲区这样的资源访问进行调度。
  
   并发性也引入了其他一些困难的问题。被线程调用的函数必须具有一种称为线程安全的属性。我们定义了4类线程不安全函数,以及一些将它们变为线程安全的建议。可重入函数(reentrant function)是线程安全函数的一个真子集 ,它不访问任何共享数据。可重入函数通常比不可重入函数更为有效,因为它们不需要任何同步原语。竞争和死锁是并发程序中出现的另一些困难的问题。当程序员错误地假设逻辑流该如何调度时,就会发生竞争。当一个流等待一个永远不会发生的事件时,就会产生死锁。
  
   4类线程不安全的函数:
   1)不保护共享变量的函数
   2)保持跨越多个调用的状态函数
   3)返回指向静态变量的指针的函数
   4)调用线程不安全函数的函数
  
  


   回顾一下这本书,总体感觉是汇编/计算机系统结构/虚拟内存/链接/unix高级编程/unix进程间通信这些范围的知识。unix高级编程/unix进程间通信可以参看W. Richard Stevens的,链接可以参看《linkers and loaders》的。但是汇编/计算机系统结构/虚拟内存,但却一时找不到比这本书写得更好的书了,这些概念在作者的循序渐进、恰当的图例下,好像一切都别有洞天。也许是站的高度不同,视角不同吧。
  
  1. 汇编,写几句C语句,再反汇编看一下,从C的角度学会看汇编,汇编的角度看C,从而逐步学会适当时候调整C代码,是优化代码的基础。并用缓冲区溢出的案例让你进一步理解堆栈和汇编。
  2. 高速缓存:直接映射、组相联、全相联,介绍得简明扼要,通过memory mountain,让你了解L1/L2缓存在不同时候的工作机制和由此产生的性能问题。
  3. 优化程序性能,涉及了方方面面,浅显易懂,每次都有简单的例子供你参考。
  4. 虚拟存储器,循序渐进的方法介绍PA、VA、PTE、寻址的概念,并简化模型,手工计算VA、TLB、L1缓存,PA的相互转化,通过实践计算加深了对虚拟存储器的理解。没有几页,就把相互关系说得一清二楚了。
  5. 对malloc函数,也是通过简单例子展现,却让你理解了实质。
  
   总结来说,对很多人来说,可能没有什么新的知识,或者懵懵懂懂也知道部分,但知识点相互孤立,形成信息的孤岛,但这一本书,却把知识点高度统一、融合了。仅仅是一本,以系统的、全新的认知角度,理解汇编、TBL、缓存、虚拟存储器的紧密关系,并能让你应用到实际程序中,买这本书,赚了!但等等,其实如果你不是做服务器端程序,没有大量数据处理,不做系统编程...这些其实也没有啥大的作用,无非是让你更崇拜洋人而已...神马都是浮云...
  


赞毅力!


我也会读完的。


加油!相信你不会后悔的。


开始读第二章了 :)


我觉得这个书给非计算机专业的看看还行,计算机专业科班出身的就不用看了吧。这里面哪个东西没学过呢?而且课堂上讲的也比这深


忽略了书里的 lab,真是罪过。其实这本书不算太厚(很多章节的内容都是独立成篇的,其中最厚的是第四章讲 CPU 设计的部分),如果要深入学习的话,千万别错过每章最后提及的参考文献


给跪了。。。


五个Lab全部做完,感觉自己老了几岁。我最喜欢的是malloc,free那个实验,因为花去很多时间理解框架代码,完成以后相当有成就感...这门课确实非常赞!顺便说一下,最后一节好像预示着他们还要开一门操作系统的课,感兴趣的可以关注一下。有种华盛顿大学打算把他们整个CS本科搬到Coursera的感觉...


再多说一句,http://www.cs.washington.edu/education/courses/cse351/ 这是他们学校这门课的主页。可以看到Coursera版和他们学校线下版的内容基本一致(主要是五个Lab),并没有因为是网络公开课而在难度和内容上缩水


赞楼上


UW是良心啊,他们的Programming Language被很多人称为Coursera最好的课程


是的,我发邮件问过Dan Grossman,他说预计9月底可能会再开一轮,绝对跟。他算是一个在网络上受到英雄般待遇的讲师,基本上没看到过差评


coursera一直都在看,从来没系统的学完过Orz


这课什么时候再开一轮啊 现在看不了lecture video


现在有地方可以看到这门课吗


我把这门课的课程视频上传了,拜托课程图谱帮我整理了一下,地址:http://blog.coursegraph.com/%E5%85%AC%E5%BC%80%E8%AF%BE%E5%8F%AF%E4%B8%8B%E8%BD%BD%E8%B5%84%E6%BA%90%E6%B1%87%E6%80%BB


留个爪印~~


有点巧,我正在搜这门课有人下好的视频,就看到夸赞它的言语.更关键的是回复中还夹了一个下载资源! 太开心了!


原來有對應的 Mooc 啊,太好了!


mark一下。看看。


最近想买这本书的。。


@theonejhdx 买这本书要节衣缩食半个月才行.


为了应试读这本书真是悲哀


有完美电子版,为什么还要买这本书?


@timewei 各取所需, 其实很多中小的招聘单位也不知道自己技术部门需要什么技术,会从一些经典的参考书上找题目.
@qysh123 作为手册一样的书还是放在手边翻翻比较好.


那更是中小企业的悲哀。不懂还要硬上。只能耽误别人,耽误自己。


多谢总结。


mark...
CSAPP对于非科班出身的程序员,是一本非常不错的计算机专业的导航书籍.


同意!我也是时候重读一遍了。


相关图书