此系列用以记录我阅读《深入理解计算机系统》的总结,从2019/10开始阅读,至2020/02/20阅读完毕。这是第一次通读,感受良多,受益匪浅。
计算机学科的两大方面:计算机系统的构建 和 基于计算机系统的计算机技术应用。
学习系统的唯一方法就是 做(do)系统 ,即在真正的系统上解决具体的问题,或是编写和运行程序。
CSAPP主页: http://csapp.cs.cmu.edu
计算机系统 是由硬件和系统软件组成的,它们共同工作来运行应用程序。
源程序实际上是一个由值 0和1组成的位 (又称为比特)序列,8个位被组织成一组,称为 字节 。
只由ASCII码字符构成的文件称为文本文件,所有其他文件都称为二进制文件。
系统中所有的信息——包括磁盘文件、内存中的程序、内存中存放的用户数据以及网络上传送的数据,都是由 一串比特 表示的。
大部分Unix内核(操作系统的核心部分),以及所有支撑工具和函数库都是用C语言编写的。
C语言是系统级编程的首选,同时它也非常适用于应用级程序的编写。
编写好的 C语言程序 ,为了在系统上运行,每条C语句都必须被其他程序转化为一系列的低级 机器语言指令。
这些指令按照 可执行目标程序 的格式打好包,并以 二进制磁盘文件 的形式存放起来。
目标程序也称为 可执行目标文件 。
了解编译系统如何工作,可以:
指令集架构描述的是每条机器代码指令的效果,微体系结构描述的是处理器实际上是如何实现的。
计算机系统花费大量时间把信息从一个地方挪到另一个地方。
较大的存储设备要比较小的存储设备运行得慢,快速设备的造价远高于同类的低速设备。
加快处理器的运行速度比加快主存的运行速度要容易和便宜得多。
针对处理器与主存之间得差异,系统设计者采用了更小更快存储设备,称为 高速缓存存储器(cache memory) ,存放处理器近期可能会需要的信息。
L1和L2缓存时用静态随机访问存储器(SRAM)硬件技术实现的。
利用缓存系统访问速度变快,原因是利用了高速缓存的 局部性原理 ,即程序具有访问局部区域里的数据和代码的趋势。通过让高速缓存里存放可能经常访问的数据,大部分的内存操作都能在快速的高速缓存中完成。
意识到高速缓存存储器存在的应用程序员能够 利用高速缓存将程序性能提高一个数量级 。
存储器结构(从上至下,容量更大,速度更慢,价格更便宜),其主要思想是 上一层的存储器作为低一层存储器的高速缓存 :
操作系统可以看成是应用程序和硬件之间插入的一层软件,它有两个基本功能:(1) 防止硬件被失控的应用程序滥用 (2) 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备 。
进程 是操作系统对一个正在运行的程序的一种抽象,一个系统可同时运行多个进程,每个进程好像独占的使用硬件。
并发运行 是指一个进程的指令和另一个进程的指令是 交错执行 的。
操作系统实现这种交错执行的机制称为 上下文切换 。
操作系统保持跟踪进程运行所需的所有状态信息,这种状态就是 上下文 。
任何时刻,单处理器系统都只能执行一个进程的代码,当操作系统决定把控制权转移到某个新进程时,就会进行上下文切换,即 保存当前进程的上下文 、 恢复新进程的上下文 、然后 将控制权传递到新进程 。
从一个进程到另一个进程的转换是由操作系统内核管理的,操作系统内核是操作系统代码常驻内存的部分。
当应用程序需要操作系统的某些操作时,比如读写文件,就执行一条特殊的 系统调用(system call) 指令,将控制权传递给内核,然后内核执行被请求的操作并返回应用程序。内核不是一个独立的进程,而是 系统管理全部进程所用代码和数据结构的集合 。
一个进程实际上可以由多个 线程 组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
多线程之间比多进程更容易共享数据。
每个进程看到的内存都是一样的,称为 虚拟地址空间 。Linux中,地址空间最上面的区域是保留给操作系统中的代码和数据的,底部区域存放用户进程定义的代码和数据。
- 程序代码和数据:对所有进程,代码是从同一固定地址开始,代码和数据是直接按照可执行目标文件的内容初始化的
- 堆:代码和数据区后的是运行时堆,代码和数据区在进程开始运行时就被指定了大小;当调用像malloc和free这样的库函数时,堆可以在运行时动态地扩展和收缩
- 共享库:大约在地址空间的中间部分是存放像C标准库和数学库这样的共享库的代码和数据的区域
- 栈:位于用户虚拟地址空间顶部的是用户栈,编译器用栈来实现函数调用。用户栈在执行期间可以动态地扩展和收缩,每次调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩
- 内核虚拟内存:地址空间顶部区域是为内核保留的,它们必须由内核来执行这些操作
虚拟内存的基本思想是:把一个进程虚拟内存的内容存储在磁盘上,然后用主存作为磁盘的高速缓存
文件就是 字节序列 ,仅此而已。
从一个单独的系统来看,网络可视为一个I/O设备。
系统是 硬件和软件互相交织的集合体 ,它们必须共同协作以达到运行应用程序的最终目的。
当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度。
Amdahl定律的主要观点是: 要想显著加速整个系统,必须提升全系统中相当大部分的速度
计算机历史中,有两个需求是驱动进步的持续动力:一是我们想要计算机 做得更多 ,另一个是我们想要计算机 运行得更快 。
并发(concurrency) 指一个同时具有多个活动的系统。
并行(parallelism) 指用并发来使一个系统运行得更快。
抽象 的使用是计算机科学中最为重要的概念之一。
a
--
123456789
更改id为3
--
test
更改id为2
--
commentor
伪造名称???
--
hhh
伪造名称???
--
yayay