Skip to content

Latest commit

 

History

History
72 lines (38 loc) · 3.91 KB

试图深入理解计算机系统.md

File metadata and controls

72 lines (38 loc) · 3.91 KB

试图深入理解计算机系统

最近看了《深入理解计算机系统 Computer Systems:a programmgers' perspective》。看完感觉收获很大,来整理一下。

概览

全书一共 12 章,可以简单分成三个部分:

  • 前 6 章,计算机组成原理
  • 中 2 章,编译原理
  • 接下来 2 章,操作系统与系统调用
  • 后 2 章,计算机网络

按照作者的理解,文件读写属于第三部分“程序之间的交互与通信”,但是我的理解上,这部分实际上是属于操作系统相关的。

整本书大七百多页,阅读的体验不是特别好,因为是胶装,中间有一些开裂的情况。个人认为分成上下两本可能会好些。

不过也可能是我的问题,因为没有按照 139 的标价购买,而是第三方购买的。

如果分上下册的话,上册关注更加底层的硬件,而下册的焦点放在程序本身和其交互,作为一个更软件的部分实现。

一、计算机系统漫游

这一章内容不多,重在基础,事实上作者也没有将其放入第一部分,而是作为一个类似序言的存在。

二、信息的表示和处理

本章详细介绍了各种基础数据类型是如何在计算机中表示的,和许多其他计组教科书类似。

三、程序的机器级表示

这一章讲述了机器如何实际运行程序,并且较为详细的讲述了汇编的语法,个人感觉比其他书籍内容充实很多。

但作者花了很大的篇幅,不厌其烦的给每种数据大小(字节,字,双字,四字)反复申明,个人认为是有些累赘的。将相关内容单独摘出,作为一个单独的小节,似乎更加合理。

以前看到的计组中花费了大量篇幅讲述各种寻址方式,这是我不认同的。CSAPP中也确实并没有这么做。或许是英雄所见略同吧。

在第 10 节中讲述了几种恶意攻击和防范的方式,这是我之前从未在其他地方了解过的。

四、处理器体系结构

本章就程序如何利用处理器做了大量的阐述。作者首先构建了一个 x86-64 的指令子集,并且对于这个指令集进行实际的实现。

这里的实现没有精确到电路级,但是也远超一般人,哪怕是计算机专业大学生的想象,但是电子专业或许会好一些。

在之后,作者介绍了流水线技术,并且利用流水线优化了之前的架构图,然后介绍分支预测。即使是好的分支预测方法,其准确度通常还是只有 65% 左右,这一点符合我的直觉,毕竟这些分支预测方式都十分简单,但考虑到预测失败的巨大开销(清空流水线,若干个周期无法执行指令),还是让人觉得有些太低。事实上无法预测的指令本就占大多数,去掉这些后即使是非常简单的预测也能达到极高的准确度。

之后,作者介绍了另一种降低流水线清空损失的方法:插空,即增加一个空指令nop。

优化程序性能

尽管现代的编译器具有很先进的优化,以至于大部分人写出的汇编代码效率实际上低于等效的 C 代码编译结果,但编译器的优化能力是有局限的。即使同样是 C 代码,好的 C 代码即使不开优化,运行效率也会高于坏的代码开 -O3 优化。

举例来说:

*px += *py
*px += *py
// 和下面对比:
* px+= 2 * *py

两者看似等同,但如果 px 和 py 指向同一个对象,那么行为会不同,导致编译器无法优化。

接下来,作者引入了一个概念,CPE 来量化程序运行效率。CPE(Cycles Per Element) 指的是对于每个元素处理需要的处理器周期数量。使用这个量可以规避由于处理器频率不同带来的差别。

这个概念和现代处理器中的 IPC(Instructions Per Cycle) 概念类似,但更加简单,仅仅考虑一个大循环的情况(这通常是最耗时的部分,因此改进得到的效率最大。