最后一次更新日期:2016-03-03
这本书的中文名字叫《深入理解计算机系统》。当我看到这本书第二章的浮点数部分时,回头发现前面的内容已经不怎么记得了。因此我打算通过写读书笔记的方式来强化自己的理解。笔记中的插图大都来自英文第二版。
第一章 计算机系统漫游
1.1 信息就是位+上下文
在计算机中,所有的信息,不管是视频、音频、图像、文本文件,在存储器中只有一个形式,就是一串位表示,即一串01011100…之类的东西。这些东西本身是没什么意义的,但置于不同的环境下,就载有了不同的信息。
1.2 高级程序语言由其他软件转换成机器语言
我们用c语言编写的程序文件计算机是无法执行的,需要通过compilation system来转换成计算机可执行的文件,整个过程如下图:
首先,预处理器把源代码中”#include”、”#define”之类的代码进行替换(这个过程中并没有语法检查),然后编译器负责对预处理得到的代码进行编译(警告和错误来自这步),接着汇编器负责对上一步的文件进行汇编(这一步也会报错)最后由链接器把各个部分链接起来得到二级制代码供机器运行
1.3 弄懂编译系统是如何工作是值得的
我们懂编译系统的话在三个方面可以帮助到我们:
- 优化程序设计:弄懂编译系统工作原理能让我们的明白if-else和switch谁更高效;也能让我们知道函数调用的开销有多大等等,这些都可以帮我们设计出效率更高的程序
- 帮我们理解链接时的错误:告诉我们静态库和动态库的差别;让我们明白为什么有些链接器相关的错误在运行时才会显现出来(这点还没遇到过,所以感悟不是特别深)
- 避免程序设计的漏洞:比如最常见的溢出错误(这点也没遇到过,感悟同样不深)
1.4 处理器从内存中读取和解释指令
计算机硬件构成的简图如下:
其中各个模块的功能分别为:
- CPU
- LOAD-从内存加载数据到CPU寄存器
- STORE-把数据从CPU寄存器保存到内存
- Operate-对寄存器数据进行运算
- Jump-跳转
- BUS-负责各个部分数据传输的电子管道
- I/O设备-输入输出设备,键盘、鼠标和显示器都算I/O设备,从广义上讲网络设备也是I/O设备
- 内存-简化了讲,计算机运行程序时需要把程序用到的代码和数据从硬盘拷贝至内存,从这个角度讲,内存大小决定着计算机能同时运行程序的数量,而硬盘大小决定着计算机能安装的软件的总数量。
对于hello world程序,首先用户从键盘输入”./hello”指令,此后字符串的流向是:键盘->I/O桥->CPU->内存,CPU处理这段命令的结果会使得:存储在硬盘中的”hello world”字符串->I/O桥->CPU->内存(如果采用DMA技术的话,数据可以不经过CPU直接从硬盘到内存),最后驻留在内存中的”hello world”字符串->I/O桥->CPU->显示器。
1.5 缓存的重要性
从1.4小节可以看出计算机执行程序时花了很多时间把数据从一个地方搬运到另外一个地方,这是由存储器的物理特性决定。容量越小的存储器,其访问速度越快,单位成本也越高,相应地容量越大的存储器,其访问速度越慢,单位成本也就越低。于是为了折中下访问速度和硬件成本,CPU内部出现了高速缓存的设计,把一些可能用到的数据暂时性存在缓存中,提高CPU的访问速度,从而提高程序整体运行效率。这提醒了程序员在设计程序时可以利用高速缓存来提高自己程序的性能。
不太理解的是CPU如何决定把哪一部分数据留在缓存中呢?我猜想可能是有某些类似C语言中register关键字的说明符来给程序员显示的决定哪部分驻留在缓存中,或者由编译器设计者根据优化等级来决定哪些数据留在缓存中。
1.6 存储器的层次模型
实际使用过程中,CPU往往会有不止一级的缓存,各级缓存+内存+硬盘组成了存储器的金字塔模型。(金字塔上层存储可以看成是下层存储的高速缓存)
1.7 操作系统管理硬件
上面1.4小节在描述hello程序的运行过程中涉及到对键盘、显示器等硬件的操作,这些操作在hello程序中并没有体现出来,因为hello程序是通过调用操作系统提供的函数来控制具体硬件的。这样做有两个好处:
- 防止硬件被失控的程序胡乱操作(有时会想电影中牛B黑客写个代码就能炸毁菜鸟的计算机的场景是不是通过让某些硬件一直超负荷工作来实现的^_^)
- 实际的硬件往往是很复杂的,操作系统屏蔽了这些硬件复杂的控制方式,给应用程序提供了统一的访问接口。比如说不管你电脑屏幕是什么牌子的,分辨率是多少,都可以调用操作系统提供的某个统一的函数来在屏幕的某个位置画个圈圈。
上面两点中第二点在实际开发中应该更能被感觉到。从抽象层次上看,操作系统夹在应用程序和具体硬件之间:
1.8 本地系统通过网络和其他系统通信
本地之外的别的计算机系统可以看成是一个特殊的硬盘,我们通过网络和这个“硬盘”进行数据交互。
1.9 重要主题
有两个因素一直在驱使计算机技术的发展:我们想让计算机做更多的事情,我们想让计算机做事做地更快。我们通过并行的方式使得计算机运行的更快,其中并行的概念体现在三个层次上(并发是种通用的说话,指一个系统有多个活动,并行是指用并发的概念来使得计算机系统运行的更快):
- 线程级并发
- 在买电脑时经常会听各个品牌的销售鼓吹自家用的是酷睿i7处理器,四核八线程。这里的四核八线程指的是处理器中集成了4个处理器,每个处理器中和程序运行状态相关的寄存器(比如PC寄存器)都有2个备份,即每个处理器可以同时存在两路控制流,实际运行时这两路控制流会高速切换(至少人类感觉不出来)仿佛两个控制流在同时运行一样,这样就充分利用了处理器的空闲时间,使得任务处理更快。
- 指令级并行
- 在计算机底层通过某些神奇的技术能实现一个时钟周期类执行几十条指令,实现指令级的并行。
- 单指令多数据并行
- 在计算机的最底层还有更神奇的技术能实现一个指令伴随多个操作
除了线程级并发是我理解的,后面两个玄妙的特性我都是没有真实体会的,也不知道怎么个实现法
更新记录
2016-03-03 添加了自己的理解和不理解的地方
2015-09-22 首次发布