【CSAPP】【Wk01】学习笔记

65 阅读4分钟

什么是“A Programmer's Perspective"?

很可惜,这本书的中文译名并没有体现出这个副标题的精髓。

作为一名程序员,我们的目的是让程序,满足我们设计之初的所面临的需求。而我们所依赖的资源,则是这本书想要为我们介绍的计算机系统。通过程序员的视角深入理解计算机系统,我们有机会能够让程序运行得

  • 正确——正确地达成目的
  • 高效——以更低的“开销”运行程序
  • 安全——程序不易被恶意行为干扰

程序何以“正确”达成目的

在计算机系统中,信息好比货币——一个文档、一段源代码、一个可执行文件、一条消息,本质上都是信息。信息是+上下文。这是计算机系统内的最底层的法则。

不同的信息的区别在于其位序列的差异以及上下文的不同。拿源代码和可执行文件对比来说,虽然其内涵的逻辑是相同的,但是源代码是一个程序员可读的文本文档,而其生成的可执行文件则是能够让计算机理解的指令和数据的集合。从源代码到可执行文件的过程叫编译

编译是个复杂的过程,编译系统需要按照程序员的设计,在库中旁征博引,按照指令集,准确翻译源代码中蕴含的逻辑,再将不同的文件相互链接,最终构建出一个完整的程序。

掌握计算机系统内信息的表示方式,熟练驯服编译器,方能设计出能够达到目的的程序。

程序何以“高效”地运行

程序是如何运行的呢?运行程序的主体是中央处理器(CPU)。我们首先要和 CPU 混熟。

CPU 是一个一直写作业的苦孩子,他被关在屋子里,桌子上放了几张草稿纸(寄存器)。他写作业很快,但是他记性很差,问他一加一等于几,他需要把左边的一和右边的一分别写在两张草稿纸上,才能用小脑瓜(算术逻辑单元 ALU)算出来答案。

不幸的是,一般的功课往往不止一道一加一,可是他的桌子大小有限,于是在他的书房里,有一个柜子(主存)放着其他的题目,供他随时取用。

然而这这个柜子,也不是特别大,总有很多东西暂时用不上,也没必要放在这,所以在另一个房间,有一整间书柜(磁盘),放着他暂时用不上得东西。我们写的程序就放在这。

那么他写了作业交哪呢?这个苦力小孩得门口有个门卫老大爷(I/O Bridge),把作业交给他,并且告诉他送给哪位老师(I/O Device),他就会帮忙传递了。包括他拿取或存放书柜房间里的内容,也是由老大爷帮忙的。

绘制漫画图.png

虽然这个小孩记性很差,但是他算东西出奇得快,以至于取/送一份作业花掉的时间,比他实际在写作业得时间多得多。于是有人设计出了离他手更近的小文件柜(高速缓存),有效缩短了他等待作业的时间。

学习高速缓存的工作方式,我们程序员,也就有机会能够让我们的程序运行得更加高效了。

并发

这个 CPU 小孩,在等作业的时候,难道就干等着吗?事实上,他会利用这段时间写其他作业。甚至他会刻意写一会儿作业 A,再写一会儿作业 B,造成一种他在同时写两份作业的假象,这就是并发的概念。而一份作业,也对应了计算机系统中抽象出的进程这个概念。

其实在进程中,也存在着更细分的线程概念,这就好比一门功课中有不同的题目,但是会用到同一份资料。

并发有很多门道,学好并发,也是让程序运行得更高效的关键。

程序何以“安全”的运行

程序运行面临的最主要安全问题应当是内存泄漏。学习计算机系统的内存管理策略,不光可以让我们的程序高效运行,也可以防范各类安全隐患。