前言
本书是从程序员的角度来写的,讲述应用程序员如何能够利用系统知识来编写出更好的程序。
我们的目标是以一种你会立刻发现有用的方式呈现这些基本概念。同时,你也要做好更深入探究的准备,研究像编译器、计算机体系结构、操作系统、嵌入式系统和网络互联这样的题目。
事实上,我们相信,学习系统的唯一方法就是做(do)系统,即在真正的系统上解决具体的问题,或是编写和运行程序。
第1章:计算机系统漫游
信息就是位+上下文
源程序实际上就是一个由0和1组成的位(bit)序列,8个位被组织成一组,称为字节。大部分的现代系统都使用ASCII标准来表示文本字符,即用一个0-128的整数值表示每个字符。由ASCII字符构成的文件称为文本文件,所有其他文件都称为二进制文件。区分不同数据对象的唯一方法是我们读到这些数据时的上下文。
程序被其他程序翻译成不同的格式
GCC分为四个阶段:预处理, 编译, 汇编和链接
预处理: 根据以字符#开头的命令,修改原始的C程序,把头文件中的内容直接插入到程序文本中。结果保存在.i文件中
编译:汇编语言程序中的每条语句都以一种标准的文本格式确切的描述了一条低级机器语言指令。结果保存在.s文件中
汇编:汇编器(as)将汇编语言翻译成机器语言指令,并把这些指令打包成一种叫做可重定位目标文件。结果保存在.o文件中
链接:连接器(ld)合并可重定位目标文件为可执行目标文件,可以被加载到内存中,由系统执行。
了解编译系统如何工作是大有益处的
优化程序性能,理解链接时出现的错误,避免安全漏洞
处理器读并解释存储在存储器中的指令
系统的硬件组成CPU
主要的硬件设备如下:
1. 总线:贯穿整个系统的是一组电子管道,叫做总线,他携带信息字节并负责在各个部件间传递。
2. I/O设备:每个I/O设备都通过一个控制器或者适配器与I/O总线相连,控制器置于I/O设备内部或者主板上,适配器是一块插在主板插槽上的卡。无论如何,它们的功能都是在I/O总线和I/O设备之间传递信息。
3. 主存:主存是一个临时存储设备。
4. 处理器:CPU是解释存储在主存中指令的引擎
高速缓存至关重要
存储设备形成层次结构
存储器层次结构的主要思想是一层上的存储器作为低一层存储器的高速缓存。
操作系统管理硬件
操作系统由两个基本功能:1)防止硬件被时空的应用程序滥用 2)向应用程序提供简单一致的机制来控制复杂而又通常大相径庭的低级硬件设备。操作系统通过几个基本的抽象概念来实现这两个功能。(进程,虚拟存储器和文件)
进程是操作系统对一个正在运行的程序的一种抽象。但网络服务器对并行的处理多用县城实现,因为多线程之间比多进程之间更容易共享数据。
虚拟存储器为每个进程提供了一个假象,即每个进程都在毒战的使用主存。
文件为应用程序提供了一个统一的视角,来看待系统中可能含有的所有各式各样的I/O设备。
系统之间利用网络和socket进行网络通信
重要主题
并发和并行
并发是一个通用的概念,指一个同时具有多个活动的系统。分为线程级并发(多线程),指令级并发(流水线),单指令多数据并行(SIMD GPU)
计算机系统中抽象的重要性
文件是对I/O的抽象,虚拟存储器是对程序存储器的抽象,而进程是对一个正在运行的程序的抽象,指令集结构提供了对实际处理器硬件的抽象,虚拟机提供对整个计算机的抽象。