0%

CSAPP 学习笔记 0 计算机系统漫游

前言

CSAPP(深入理解计算机系统)这本书豆瓣评分接近满分,是学习计算机系统的经典教材之一。这一周开始阅读此书,并计划以后每周写一篇学习笔记。

正文

信息

数据和信息是两个含义不同的词。数据是“死”的,而信息是“活”的。举个例子,阿拉伯数字8,在不同的情景下,可传递不同的信息。当电梯中可表示第8层,在桌球桌上可表示黑球8,而在聊天中可表示”拜拜”的意思。是什么赋予了它内涵?是情景,也称作上下文。在计算机系统中,数据就是比特串,是一个一个的位,再加上具体的上下文,就成为了信息。在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。

编译

一个C语言程序,需要经过预处理器、编译器、汇编器、链接器的翻译,才能转化成可执行目标程序。

编译是个转化数据的过程。转化前是源代码,是人类可以理解的信息。而转化后,变成了机器语言,变成了人类无法理解的信息,而机器在一定的上下文中,能够理解这些数据。机器语言是机器能够理解的信息。

学习编译系统,可以帮助我们优化程序性能、理解链接时出现的错误、避免安全漏洞等。

指令

编译后产生的可执行文件在磁盘里。当我们执行该文件时,计算机系统是怎么运作的呢?

假设我们是在shell执行该程序的。键盘是一个外部设备,通过系统I/O总线和其他硬件连接在一起。当我们通过键盘输入可执行文件的文件名时,字符串会通过总线被逐一读入CPU中的寄存器并送入内存,且会输出到图形适配器(所以我们才可以在屏幕上看到输入的字符)。当输入回车后,shell就会通过一系列的指令来执行该程序,将程序的文件内容装载进内存,开始子进程,将CPU让给它执行。这个过程中,不同的指令,会让数据在CPU、内存、I/O设备间流动,比如输出文字到屏幕、通过网络下载文件等。

高速缓存

所谓高速缓存,是为了解决CPU从寄存器读取数据与从内存读取数据的速度差异问题。CPU从寄存器读取数据比从内存读取数据要高几个数量级。所以一个自然的想法是提高寄存器的容量,这是一个解决思路,但是因为寄存器的价格要比内存贵得多,大幅提高容量从经济的角度考虑不太现实。另一个解决思路是提高主存的读取速度,这很接近现在大部分计算机系统采用的方法了。根据计算机组成原理的知识,我们知道SRAM的读取性能比DRAM的快得多,且SRAM也分多种,不同的SRAM实现会有不同的性能表现,价格也有差异。因为SRAM的价格还是要比DRAM高,大量采用SRAM作为主存也不现实。因此形成了一种折中的方案,采用DRAM作为主存,SRAM作为CPU的高速缓存。当CPU执行指令时,首先会从寄存器取数据,假如取不到,再到高速缓存取,假如还取不到,才到主存取。通过引进高速缓存,缓解了CPU执行速度与从内存读取数据速度不匹配的问题。

利用局部性原理,可提高高速缓存的命中率,让CPU尽可能快地取到指令去执行,提高整体效率。至于高速缓存中的数据与内存中的数据的映射,则涉及到了计算机组成原理,这里不再深入讲述。

抽象

所谓抽象,在生活中其实随处可见。记得《人类简史》中写到,人类区别于其他生物的重要原因便是想象力丰富。人类之间通过讲述各种故事,塑造各种抽象概念,诸如宗族、城市、国家等概念,让原本互不认识的人有了联系的纽带,共同合作,诞生了各种文明。计算机系统中也有各种抽象概念,诸如文件、虚拟内存、进程。这些抽象,在我看来,是人类设计冯诺依曼计算机的基础,没有这些概念,计算机系统便不知道从何说起。

文件时什么?文件是一些二进制位在I/O设备中的抽象。

虚拟内存是什么?虚拟内存是程序的在主存和I/O设备中的空间的抽象。

进程是什么?进程是程序在CPU、主存、I/O设备活动的抽象。

(全文完)