[阅读本书的目的]
我们傻傻的编写程序,其实并不知道计算机是如何将源代码文件编译链接成可执行的程序,也不知道指令是如何被加载,如何一条一条的执行,到最后显示出结果。在这一过程中,写代码的人如何能编写出健壮的代码、如何很好的利用操作系统的特性优化代码、发生了问题如何学会自己去分析,而不做拿来主义google式的程序猿。这本书也许是这些终极问题的最好解答,正如作者在开篇说的一样:“如果你全力投入学习本书的概念中去,完全理解底层计算机系统以及它对程序的影响,那么你将逐渐成为凤毛麟角的权威程序猿”。
[笔记内容]
本章从一个程序的生命周期讲起,分别对程序的创建、编译、执行、输出、终止进行了详细的解读,从中引出了关于信息上下文、编译系统、高速缓存、操作系统等重要概念,并对上述问题进行了简单的讲解,其中作为程序猿应该要好好理解和利用的部分正是:高速缓存。
1.信息就是如何解释:
在我们编写程序源代码的时候,计算机系统其实为我们完成了源码与 ascii码的一一对应
2.编译系统
这里简单讲解了从源程序:hello.c到可执行文件到四个阶段。每个阶段完成的工作和对应生成文件。
1]预处理的工作比较简单:对应的就是展开#include中的.h头文件;
2]编译器其实包含了一个汇编语言程序,讲程序语言转化成汇编语言;
3]汇编阶段:生成可重定位的.o二进制目标文件,这一步完成汇编语言转机器指令;
4]链接阶段:合并许多的.o文件,主要是我们在源程序中用到过的如:printf.o
3.高速缓存
举一个例子来讲述我们为什么需要高速缓存技术:“我们在月球上建立了一间厨房,可以做出许多美味的食物。由于月球离地球的距离太遥远,我们要炒一个番茄炒蛋,需要大老远大从地球上通过宇宙飞船运输过去,而厨师真正开始炒菜需要的时间并不多。如果这样来回的运输食材,厨师大部分时间上空闲的在等待食材,这对高薪聘请的厨师来说,实在是太浪费了。有没有什么办法能够加快厨师做菜的速度呢?在这个例子中厨师就相当于cpu,而食材就相当于数据,而解决方案就是:高速缓存”
我们先来看看没用高速缓存中一个程序的运行干了什么:
当我们从外壳执行hello程序的时候,首先是将程序的数据和代码从磁盘复制到主存,处理器开始执行指令,并将需要显示的数据从主存复制到寄存器中,最后需要显示是将寄存器的数据复制到显示设备,最终显示出来的。这些复制操作就是开销,减缓了程序真正的工作。因此就需要高速缓存技术:暂时集结区域。
我们来看看高速缓存存储器的位置:
由于机械原理,访问速度越快的存储设备造价相对越高,拿硬盘和主存来说。硬盘的造价可能是主存的1000倍,但是访问的开销却要比主存大10000000倍。高速缓存就是为了存放可能经常访问到的数据,这就大大提高了访问的速度,减小了开销。
主要思想是:一层上的存储器作为低一层存储器的高速缓存
4.操作系统
操作系统提供了软件与硬件之间的一层抽象,既可以防止程序滥用硬件也方便了我们对于程序的编写。这里的抽象主要是指:1]对运行中程序的抽象(进程);2]对于存储器的抽象(虚拟存储器);3]对输入输出的抽象(文件)甚至包括网络;4]虚拟机等。
这里的很多内容都是简单的提了一下,后续章节中还有详细的讲解。
漫游至此,对于本书要讲解的内容有了大概的了解,本书的出发点是很好的,正如《圣经》约翰福音中说的一样:你们必晓得真理,真理必叫你们得以自由。