小鱼儿玄机2站点击下图进入官网:
小鱼儿玄机2站点击下图进入活动:
小鱼儿玄机2站点击下图进入领取彩金:
钱柜娱乐平台|http://qgylptueru.weebly.com
合乐888总代|http://hlzdaekf.weebly.com
博e佰官网|http://bebgwovep.weebly.com
武松娱乐官网|http://wsylgwwflu.weebly.com
香港王中王|http://xgwzwknfl.weebly.com
亚虎老虎机|http://yhlhjniji.weebly.com
实覆盖了“计算机组成原理”,“操作系统”等许多课程的内容,其中的许多话题都能再次展开,继续深入,都能再变成一本,甚至N本经典。事实上,在高年级的计算机专业课程设置中,都会有更加纵向的内容出现。因此,如果有人说它“底层”,我同意。但如果说它“深入”,至少我不那么赞同。
“覆盖面广”,其实就是这本书的最大优点。它告诉我们计算机是如何设计和工作的,操作系统有哪些重点,它们的作用又是什么。CSAPP的目标其实便是要讲清楚原理,但并不会把某个话题挖掘地过于深入,过于细节。例如书中第4章使用了自己“设计”和“实现”的“Y86”处理器架构,便是为了简化X86指令集,使课本内容在能够说明问题的前提下也不至于太复杂。因此,读完(其实也并不一定要读完,说实话我也没有读完)这本书后,我们就可以对计算机系统各组件的工作方式有了理性的认识。
那么,这本书适合什么人阅读呢?对于这个问题我也有过犹豫。在打算写“老赵书托”系列的之后,前两本列在书单的上便是SICP和CSAPP。我对CSAPP推崇备至,在以前的几篇文章中也都有提及,但最后还是先推荐了SICP。怪怪同学当时在回复中说到“我还以为你会先推荐CSAPP”,其实这就是因为一个“适合面”的问题。在我看来,SICP所强调的编程和抽象能力是任何程序员都需要的,但是如果您问我“所有程序员都应该读CSAPP吗?”,或者再具体一些:“前端JavaScript程序员需要看CSAPP吗?”,那么我可能就无法给出100%令人满意的答案了。我可能会这样回答:其实这些内容很多时候并不一定可以“直接用于”某个工作,但是它其实和操作系统,编译原理等话题一样,包含的是一套“工作方式”,“算法集”,“实践成果集”,其中很多理念,如Cache Hierarchy,Copy on Write等理解的适用范围其实都是非常广泛的。在一定程度上,其实它和SICP一样也是在锻炼思维方式,只不过是已经经过具体化的实践方式而已。
因此,即便你是一个前端JavaScript程序员,也可以从CSAPP这本书中获益。如果您是.NET程序员,那么您更加适合看这本书了。说一句“豪情万丈”的话:如果不知道XX,YY或ZZ的话,这如何算是一个优秀的程序员?这本书和平时的工作可能的确不一样,相比起来“底层”了一些,但是它还是会把“底层内容”控制在一定深度之内,而不会讲某个具体话题挖掘到“事倍功半”的程度。而事实上,虽然在进行.NET开发的时候我们已经在一个较高的抽象上工作了,但是我们的程序还是运行在操作系统上,还是在遵循着某个规律在运行着,了解一些内部的工作机制也有助于我们写出更好的应用程序。
说来也奇怪,虽然各种语言,框架发展地越来越好,按理来说我们写程序也应该越来越容易。但是现在看来,一些基础性的内容反而也变得越来越重要了,例如在并行计算面前,计算系统的一些细节,如内存一致性模型,线程调度,程序的局部性(Locality)又被提上台面,否则我们很难写出高效的应用程序。同样,一些如函数式编程,Monad等在几年前看起来十分科研型,数学化的事物也离我们越来越近了,如LINQ,Reactive Framework等等,其实它们都已经是我们身边的事物了。
CSAPP这本书覆盖面很广,我认为并非要一字不漏地读完才行。根据我的个人观点,我们应该着重阅读书的第1章“A Tour of Computer Systems”和第一部分“Program Structure and Execution”(从第2章开始,大约占据了书中一半篇幅),其中包含了数据的机器级别表示方法,汇编语言和执行方式以及CPU架构方面的内容,我们应该关键性地理解其原理。如第6章“Optimizing Program Performance”提出了许多种机器级别的优化方式,在现在看来,其中的某些方式过于细致,乃至在实际工作过程中已经不再推荐了(如内联一些方法以提高性能),我们要在把握住“为什么”而并不是单纯的吸收“怎么做”。对于书中的第二部分“Running Programs on a System”主要讲述的是操作系统方面的内容,可以读得略为简单一些,但其中的第10章“Virtual Memory”,它谈论了操作系统中虚拟内存机制的各个方面,非常关键,需要细读。至于书中的第三部分“Interaction and Communication Between Programs”便可以更加“选择性”地阅读,我只阅读了第13章“Concurrent Programming”,而其他两章都只是简单地扫过而已。
作为经典的教材它一定有许多附加资源,例如在它的官方站点给出了一些链接,其中最关键的可能是学习者站点,其中包括这本书所需要的各种工具,参考文档等各种资源。从网站上也可以了解到,CSAPP即将在2010年2月份推出第2版,根据近几年的发展做出了不少改进。
不过,在这里我要着重推荐的是接下来的内容:我的大学时代就读于复旦大学软件学院,属于教育部35所实验性软件学院,学费比较昂贵——幸运的是 宝马会官网 ,我所接受的“实验性教学”使用了一种比较“西化”的方式,无论是课程设计还是教材都比较“与国际接轨”。例如和爱尔兰都柏林大学合作办学,有些课程由老外来教,同时也会接触一些“函数式编程”等国内较少接触的内容。大二的“计算机系统导论”课程便参考了CMU的ICS这门课,教材自然就是CSAPP这本书。在我印象中,每年最热闹的课程便是大二的这门必修课(高年级所开设的“计算机组成原理”,“编译原理”、“计算机网络”等就是“方向性”课程,并非人人必修),尤其是做一些大作业的时候,在BBS上便会讨论的非常热烈(不得不承认,“拆炸弹1”等实验也特别有趣),而每年此时也往往会诞生出一些“牛人”,基本上都是些“前途似锦”的人物,大都即将或已经在世界顶级学府深造,令人难以望其项背。而在两年前,这门原本是一个学期的课程,也已经变成了为期一年的课程,这也说明了ICS的重要程度。现在这门课已经成为了复旦大学的精品课程之一:“计算机系统基础”,我们从网站上可以下载到所有的PPT,练习和解答等内容,甚至还有视频下载。希望这些内容能够对您有所帮助。
上次我也提到北大使用SICP的课程:“程序设计技术和方法”。其实现在国内有很多大学都在使用世界一流教材,希望也会有越来越多公开的内容。
在这里我想可以再提及两本书,一本是之前所提到的国产书精品《链接、装载与库》。这本书主要讲解了编译过程中的“生成文件”的过程,以及应用程序执行时文件是如何被操作系统加载的,并且同时涉及到Linux和Windows两个平台。实话说,这些内容并对我来说并不是些必须了解的内容(相信对大部分同学也一样),因此我把它当作一种“扩展阅读”以及“知识巩固”。
对于这种类型的书,我有自己特殊的阅读方式,那就是“快速浏览”。例如,对我来说,我可能更需要知道链接是做什么用的,一个可执行文件或一个动态链接库文件大致组成有哪些,加载时各段的作用是什么等等,但我不需要具体了解每个段的布局,文件头的具体格式,占多少字节等等。因此,我更关注的可能是其中的示意图,而对于其中一些和具体数据相关的表格和代码就匆匆掠过了。这本书我“翻”得很快,大约只用了4、5天,我想等我真需要这些内容的时候再回头细读吧。有朋友说,更值得一读的是著名的《Linkers and Loaders》,但这部分话题对我来说实在有些距离,我还是从更容易接受的《链》来接触吧。
说来有意思,我建议您在读《链》这本书的时候,着重关注非“链接、装载与库”的部分,而是那些少量的,如操作系统的线程和内存管理方式,甚至于附录中有关“字节序(Byte Order)”的内容。因为它们往往是书中主要内容的基础,拥有更广的适用性。
而第二本书“顺便提及”的书是《Windows Internals 5th Edition》,人民邮电出版社已经引进了其影印版(而且影印质量好的令人发指,我仔细对比之后发现,除了不是硬皮之外,从纸张和文字几乎和原版一模一样)。这的确是本“深入”级别的书,基本上覆盖了Windows内核的方方面面,包括系统架构,内存管理,线程调度,安全机制, 白菜注册送18体验金文件系统等各种话题,对于我们Windows平台上的程序员,这方面内容可能更有针对性。
不过说实话,我刚刚购入这本书,更别提仔细阅读了。不过我看过这本书第4版中文版的大部分内容,它由潘爱民老师翻译,应该说翻译地很不错。如果您对英文的接受程度不高,也可以从中文版入手。不过第5版覆盖了Windows Server 2008和Windows Vista,直接增加了200多页的篇幅,还加入了Superfetch、BitLocker和Hyper-V相关的内容,可谓是一次重大的升级——其实这其实也可以看出Vista的相对于XP,在内核级别有了很大改进。而目前Windows Internals第6版也在写作过程中,其中包含Windows 7和Server 2008 R2的内容。我本以为Win 7的内核改进不大,但是从近期的PDC大会上发现似乎也不能这么说。
Windows Internals一书的主要作者之一是Mark Russinovich,这位和基努·李维斯有几分相像的帅哥除了是Windows NT内核专家,微软Technical Fellow之外,还是著名的Sysinternals工具包的作者。Sysinternals工具包可谓Windows程序员居家旅行,杀bug灭口的必备工具,因此Windows Internal的重要特点之一便是用Sysinternal中的各种工具来进行“实验”,这也给这种有深度的书带来了相当的实践性。在我看来,这本书虽然深入,但并非是“枯燥”理论,还是一本写得比较“好看”的书。
说到“好看”的技术书,那么我还是以CSAPP这本书中“致谢”部分的最后一句话来结尾吧:
Finally, we would like to acknowledge the great technical writers Brian Kenighan and the late W. Richard Stevens, for showing us that technical books can be beautiful。
如何把技术书写的“好看”,真是门艺术。
- 老赵书托(1):写在前面
- 老赵书托(2):计算机程序的构造与解释
- 老赵书托(3):深入理解计算机系统
注1:“拆炸弹”是ICS课程的配套实验之一,它的主要工作便是通过将一些小程序(即“炸弹”)反汇编后阅读其汇编代码,然后通过在程序运行时输入特定的字符串来“拆除”炸弹。有些炸弹可能只是输入某个特定的字符,而有些炸弹可能需要输入复杂的字符串,通过“内存溢出”来覆盖掉堆栈中的特定内存(如return address),以此改变程序运行的“轨迹”。整个过程非常有挑战,但也很有趣味。能设计出这样的实验的确令人敬佩。
[XCAR 试驾 原创]
成名于世界上最艰苦拉力赛事的“山猫”帕杰罗一直是越野爱好者们最热衷的车型,时至今日,对于它曾取得过的辉煌,三菱粉丝们依旧能够如数家珍。不错,三菱汽车的先进技术支持成就了帕杰罗在达喀尔赛场七连冠的宏伟霸业(参赛总冠军次数达12次),同时其出色的越野性能和优异的可靠性也同样赢得了众多普通消费者的信赖。
然而近年来,三菱汽车产品力不足的实际问题也导致了旗下多款车型市场表现的萎靡,并且就连作为三菱品牌旗舰车型的帕杰罗也一度遭遇了停产的传闻。不过让三菱铁粉们为之振奋的是,剧情从去年底开始有了较为乐观的转变,广汽三菱的全资入主让三菱中国的进口车型业务重获新生。因此在国内市场,帕杰罗依旧会是三菱品牌领衔市场的旗舰产品。
从初代车型至今,三菱帕杰罗累计销往了170多个国家和地区,总计销量超过300万台。毫不夸张地说,“山猫”的足迹早已遍布全球。而现款第四代车型(V93)进入中国市场也已有近十年的时间,从设计上,它依旧沿袭了三菱一贯的硬朗外形。孔武有力的车头简洁而立体,再结合其方正魁伟的车身轮廓,都使帕杰罗展现出硬派越野SUV应有的霸气形象。
“普洱茶饼黑而漆,醒酒第一,绿色者更佳,消暑化痰,清胃生津,功力尤也。”
——《本草纲目拾遗》
爱茶之人,家里不可缺少的东西自然就是茶叶了。老骥爱喝茶,尤爱喝普洱。朋友来访或外出时,跟友人聊聊天,喝喝普洱茶,时间也在品茶的间隙中慢慢流逝。
这不,今天去拜访一位友人,正赶上他要打开普洱茶饼。他要打开的是一款古树普洱茶,外形上呈饼状,属于紧压茶。友人知道老骥是个老茶友,打开普洱茶饼,义不容辞啊。
喝茶的都知道,普洱茶属于黑茶,由云南大叶种晒毛青茶为原料,发酵加工后形成散茶和紧压茶。刚好老骥教大家打开普洱茶饼之余,也来说说普洱茶是紧压茶的来由。
云南茶叶在古代的时候,通过“茶马古道”将茶叶运送到西藏等地方。而古代交通运输不便,茶叶又需要长途跋涉才能到达远方的城市。为了运送方便及多运送茶叶。人们把茶叶加工成砖、饼、沱等形状,以一饼357克、七饼为一挑来计量普洱茶。所以在当时也有这么个说法传了下来,“一二级作散茶,三四级作沱茶,七八级作饼茶,九十级作砖茶。”但是现在的普洱茶,不管是散茶、沱茶、饼茶还是砖茶,其外形和质量早已不相关,他们只和原料凹凸有关。
紧压茶的来由讲完了,接下来老骥给大家说说如何打开普洱茶饼。了解适合的方法打开茶饼,不会导致普洱茶变碎而影响饮用效果。
首先要准备工具,普洱刀、茶锥。没有这两种工具的话,可以用普通的坠子或竹签代替。不然也可以在购买普洱茶时向卖家索要开茶饼工具。
【打开普洱茶饼方法——撬动原则】
方法一:使用双手(适用于较传统的铁饼生茶)
1.选择一个平整的桌面,将茶叶外包装纸展开;
2.利用茶饼饼面的球面,双手在茶饼背面左右两端向下压,双臂伸直身体重心向前移,利用体重施压;
3.依靠两侧施力以及饼面的定点,可以很轻松的将茶饼压开;
4.茶叶断面可以很方便的穿入普洱茶刀或茶锥/茶针,再慢慢把茶饼撬散;
5.拆开较大的饼块时,双手向两侧拉动(而不是掰开),可以更好地保存条索的完整。
方法二:使用普洱茶刀(适用于压制较松的生茶或熟茶)
1.打开把茶刀从茶饼侧面沿边缘插入;
2.稍微用点力,把茶刀再往茶饼里推进;
3.向上用力,把茶饼撬开剥落;
4.再用同样的方法顺着茶叶间隙,一层一层地撬开;
5.这样重复几遍,茶饼就可以慢慢撬散了。
方法三:使用茶锥/茶针(适用于压制较松的生茶或熟茶以及砖茶、沱茶)
1.把茶锥/茶针沿沱茶的内涡边沿用力插入;
2.沿沱茶内涡边缘慢慢剥开及撬动(撬--会有点像剥橘子皮的感觉);也可沿着沱茶外沿慢慢剥开及撬动;
3.沱茶就可以慢慢撬散了。
【注意】
1.锥子(普洱茶刀)很锋利,不要伤到手。
2.一边施力一边撬动,掌握好茶刀的握法。
3.如果是普洱生茶,在尽可能保持条索完整的情况下,尽量撬散,不要整块投入盖碗。
4.如果是普洱熟茶,也是遵循尽量撬散的原则,之后冲泡,饮茶会有味。
拆完普洱茶饼,就把不泡的茶叶存放好。可以直接放回包装纸里重新存放,也可以选用茶罐放好。
最后,老骥要去好好品友人的这一杯茶了。要是你也感兴趣,欢迎关注老骥茶,了解多些关于普洱茶的知识。
|