CSAPP学习笔记
第一章计算机系统漫游
什么是信息
在CSAPP的理解中,信息指的是“位+上下文”
其中,“位”指的就是数据本身
“上下文”指的是在程序中对这些数据如何定义,或者说如何解释它们
一个C程序在编译(GCC)过程中的变化
首先,是编辑好的源程序(.c/文本)
通过预处理器(cpp)
变成修改后的源程序(.c/文本)
再经过编译器(ccl)
变成汇编程序(.s/文本)
再经过汇编器(as)
变为可重定位的目标程序(.o/二进制)
再和库函数(.o)等经过连接器(ld)
生成可执行目标文件(.o/二进制)
GNU项目
GNU项目即GNU‘s Not Unix,是一个开源项目,GNU环境包括EMACS编辑器、GCC编译器、GDB调试器、汇编器、连接器以及其他的一些工具。现代开放源码运动的思想就起源于其“自由软件”的思想。
为什么要了解编译系统的工作原理
1.为了在编写程序是能够尽可能写出高效的代码。
2.要能够理解链接器,能够理解连接时出现的错误,尤其是在大型的软件系统中。
3.为了能够避免一些安全漏洞,比如缓冲溢出。
处理器读并解释存储在内存中的指令
系统的硬件组成
系统的硬件组成包括总线、I/O设备、主存和处理器。
总线指的是连接计算机各部件的一组设备,它们负责在计算机运行过程中数据交换的工作。
I/O设备是计算机系统与外界进行交互的一系列设备。
主存是一个临时储存设备,用于存放运行的程序所需要的指令、数据等内容。
处理器是中央处理单元,即CPU,相当于计算机的大脑,控制着计算机的整个工作流程。
高速缓存至关重要
在计算机的存储系统中,处理器寄存器、内存、外存等设备的读写速度相差悬殊,存储空间大小同样相差悬殊,作为计算机系统的设计者和使用者,我们既希望计算机能拥有一个尽可能大的存储系统,也希望能够尽可能快地对数据进行读写操作。为此,设计了分级存储系统,即在处理器与内存之间设立分层存储设备,也就是高速缓存——cache。
cache的读写速度足够快,存储空间大小比处理器的寄存器大得多,比内存小得多,其能够兼顾读写速度与存储空间大小的原理是局部性原理。局部性原理就是将计算机短期可能用到的数据从外存加载到内存上,再从内存加载到cache上,这样计算机在后面进行这些操作的时候就可以直接从读写速度很快的cache上直接进行操作,而不必每次都等待内存和外存。
实际上,局部性原理可以理解为提前将计算机会用到的数据加载到cache上,这种提前并不是绝对的,但在大多数情况下它都是有效的。
存储设备形成层次结构
就是在两级速度、存储空间相差很大的物理设备之间插入一些“折中”的设备,这些设备速度比较突出,同时存储空间也能满足一定的需求。通过这些设备来对速度、存储空间相差很大的两级设备进行一个功能上的匹配。
存储器层次结构的思想就是上一层的存储器作为下一层的存储器的高速缓存。
操作系统管理硬件
所有应用程序想要对硬件进行操作都要通过操作系统。
操作系统存在的意义是,防止硬件资源被某些失控的应用软件过度占用,并且为应用软件提供一系列简单的机制来对复杂的硬件设备进行控制。
操作系统中的基本抽象概念有进程、虚拟内存和文件等。
进程是对正在运行中的程序的抽象概念,它的主要思想是:让计算机处理器交替地对不同的进程进行处理,以此来达到让多个任务“同时”运行的效果,这就是“并发性”。而操作系统保持和跟踪这些进程运行所需的所有状态信息,就是“上下文”。当操作系统要从执行一个进程中转而执行另一个进程时,就需要进行进程的调度,这个过程中需要进行上下文的切换,即保存当前进程的上下文,并恢复新进程的上下文,并将控制权转移给新的进程。
线程是对进程概念进行进一步细化的概念,线程的具体内容会在后面记录。
虚拟内存是为进程匹配的一个虚拟的概念,它让每个进程都自认为独占所有内存空间,但实际上只占有实际内存的一部分,因此虚拟内存的地址与实际内存的地址需要进行转换。
文件就是数据。计算机系统里的任何实体都可以看做是一个文件,而不用考虑其实际硬件情况,因为这些在操作系统层面已经做好了。
系统之间利用网络通信
网络系统可以看做一个I/O设备,实际上就是其中一个或多个设备将数据发送给另外一个或多个设备,由其对数据进行接收或转发,不断重复这个过程。
重要主题
Amdhal定理
当我们对系统的某个部分进行加速时,其对系统整体性能的影响取决于该部分的重要性以及加速程度。
设系统对一个任务原本的执行时间是Told,假设系统某部分所需执行时间与该时间的比例为α,即这部分原本所需时间是αTold,而这部分性能提升比例是k,即性能提升后用时(αTold)/k,则性能提升后系统整体耗时为
Tnew=(1-α)Told+(αTold)/k=[(1-α)+α/k]Told
加速比S=Told/Tnew=1/[(1-α)+α/k]
想要加速整个系统,需要对其中相当大的部分的速度。
并发和并行
线程级并发
多个线程切换执行。或多核处理器,多个进程可以同时在不同的CPU中执行。
指令级并行
即处理器可以同时执行多条指令。典型技术是流水线技术。
单指令、多数据并行
允许一条指令产生多个可以并行执行的操作。
计算机系统中抽象的重要性
抽象是忽略了硬件,而只提取出某个部件或系统需要实现的功能与逻辑后的概念,有了抽象概念,就可以在模型不改变的前提下,在不同的硬件平台上用相同的逻辑处理问题。
几个抽象:
文件是对I/O系统的抽象
虚拟内存是对存储系统的抽象
进程是对运行中的程序的抽象
虚拟机是对整个计算机系统的抽象