为什么要读这本书?
《深入理解计算机系统》英文名《computer system: A programmer’s perspective》。从程序员的角度来理解计算机系统。为程序员描述计算机系统的实现细节。可以对程序的整体,在计算机系统内部运行的细节都熟悉。可以开发出高效,健壮的程序,并且可以更快地排除程序错误,调整性能。以上这些对于一名程序员来说诱惑是很大的,如果只专注于应用程序的实现,而不熟悉运行在下面的系统知识,不是一个完美的programmer。
第一章《计算机系统漫游》
概述性质的一章,以“hello world”程序的生命周期,来介绍计算机系统的主要概念和主题。
计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序。
理解计算机的本质和它如何影响你的应用程序是非常重要的。
信息是一些比特流,区分不同比特的方法是读到这些数据对象的上下文。
C语言源文件被其他程序转化为一系列的低级机器语言指令,然后按照可执行目标程序打包,以二进制文件存放起来。目标程序也就是可执行目标文件。
Hello.c 编译为hello二进制的路程为:
Hello.c hello.i hello.s hello.o hello
分别经历预处理阶段,编译阶段,汇编阶段,链接阶段。
知道编译系统如何工作的好处:
优化程序性能
理解链接时出现的错误
避免安全漏洞
系统的硬件组成:
总线:贯穿系统的电子管道
IO设备:每个IO设备都是通过控制器或者适配器与I/O总线连接起来的。
主存:主存是一个临时存储设备,由一组DRAM芯片组成。
处理器:中央处理单元(CPU),是解释或执行存储在主存中指令的引擎。在任何一个时间点PC都指向主存中的某条机器语言指令。
执行hello程序的步骤:加载程序,把代码和数据拷贝到主存。处理器执行hello程序主存中的机器语言指令。把需要的字节从存储器中拷贝到寄存器堆,再从寄存器中文件拷贝到显示设备,显示到屏幕。
执行一次程序经过好几次拷贝,会把性能变慢。硬件的高速缓存存储器的机理,可以使程序员利用这些极大地提高程序的性能。
设备是分层次的,按照缓存的概念,上层的设备都可以说是下层的缓存,例如本地磁盘是其他系统磁盘的缓存。技术都是想通的,计算机底层的思想在上层应用中也有广泛的使用。就如同物理中的宏观微观,他们都有着类似的原理。
操作系统主要由两个用途:1.防止硬件被失控的应用程序滥用2.在控制复杂而又通常广泛不同的低级硬件设备方面,为应用程序提供简单一致的方法。
进程是操作系统对运行程序的一种抽象。
操作系统保存进程运行所需要的所有状态信息——上下文(context)
系统调用会将控制权传递给操作系统。
每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。多线程之间比多进程之间更容易共享数据,线程一般比进程更高效。
虚拟地址空间:一个很经典的图。
基本思想:一个进程虚拟存储器的内容存储在磁盘上,用主存作为磁盘的告诉缓存。
文件:一个强大的定义,磁盘、IO设备、网络都可以抽象为文件。
本章还是概述性质,通过一个简单的程序引出众多的概念,为后面的章节铺垫。
文件是对IO设备的抽象概念;虚拟存储器是对主存和磁盘的抽象概念;进程是粗利器、主存和IO设备的抽象概念。网络也是一种IO设备。
对系统的种种抽象,都是为了解耦,抽象后可以对无限的不同的设备以统一的方式进行处理。应用程序也可以借鉴,这样程序就有了扩展性。程序员要写一个程序摧毁斯巴达,是应该写destroySparta () ,还是distroycity(Sparta)呢?