《深入理解计算机系统》读书札记(第一章)
原书网盘链接地址:https://pan.baidu.com/s/1kF1Q9TloZzzgXewv7atWBw
提取码:gtt1
第一章 计算机系统漫游
计算机系统是由硬件和系统软件组成的,他们共同工作来运行应用程序。
1.1 信息就是位+上下文
程序的生命周期是从一个源程序(源文件)开始,程序员编写的文本文件,源程序实际上就是一个由值0和1组成的位(bit)序列,8位为一组,称为Byte(可参考计算机常用存储单位了解),每个字节表示程序中的某些文本字符。大部分现代操作系统都使用ASCII 标准来表示文本。系统中所有的信息(包括磁盘文件内存中的程序,用户数据以及网络上传送的数据)都是一串bit序列。
1.2 程序被其他程序翻译成不同的格式
程序的执行是从高级语言转化为一系列的低级机器语言指令的过程,不同的程序都可以在转化为低级机器语言指令被操作系统识别并且可执行。
1.3 了解编译系统如何工作是大有益处的
我们可以依靠编译系统生成机器语言指令,我们需要了解编译系统是如何工作的,学会优化程序性能,理解链接时出现的错误,避免安全漏洞。
1.4 处理器读并解释储存在内存中的指令
1.4.1 系统的硬件组成
总线:贯穿整个系统的电子管道,它负责携带字节信息在各个部件间传递,通常总线被设计成传送定长的字节块,也就是字(word)。字中的字节数(即字长)是一个基本的系统参数,各个系统都不相同,现在大多数字长要么是4个字节(32位),要么是8个字节(64位)。
I/O设备:输入输出设备是系统与外部世界沟通的媒介(eg:键盘,鼠标,显示器,硬盘等),每个I/O设备都通过一个控制器或者适配器与I/O总线相连。
控制器或者适配器的区别
- 控制器是I/O设备本身或者系统的主印制电路板(主板)上的芯片组。
- 适配器是插在主板插槽上的卡。
主存:是一个临时存储设备,在处理器执行程序时,用来存放程序和程序处理的数据。从物理上说,主存是由一组动态随机存取存储器(DRAM)芯片组成,从逻辑上说:是一个线性的字节数组,每个字节都有唯一的地址(数组索引),地址从零开始。
处理器:中央处理器(CPU)是解释(或执行)存储在主存中指令的引擎,处理器的核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器(PC),在任何时刻PC都指向主存中某条机器语言指令(即含有该条指令的地址)。
1.4.2 运行hello程序
略
1.5 高速缓存至关重要
系统花费了大量时间把信息从一个地方挪到另一个地方(磁盘<—>主存<—>处理器)。
根据机械原理,较大的存储设备要比较小的存储设备运行慢,而快速设备的造价远高于同类的低速设备
,磁盘比主存大1000倍,从磁盘读取一个字的时间开销比从主存中的读取的开销大1000万倍,处理器从寄存器文件中读数据比主存中读取几乎快100倍。
针对处理器与主存之间的差异,系统设计者采用了更快更小的存储设备,成为高速缓存存储器(cache memory,简称为cache或者高速缓存),作为暂时的集结区域,存放处理器近期可能会需要的信息。
上图所示的典型系统中的高速缓存存储器,位于处理器芯片上的L1高速缓存的容量可以达到数万字节,访问速度几乎和寄存器文件一样快,一个容量为数十万到数百万字节的更大的L2高速缓存通过一条特殊的主线连接到处理器,进程访问L2高速缓存的时间要比访问L1高速缓存的时间长5倍,但是这任然比访问主存的时间长5-10倍,L1L2高速缓存是用一种叫做静态随机访问存储器(SRAM),更新的操作系统设计更多层级的高级缓存L1L2L3等。
1.6 存储设备形成的层次结构
处理器与一个较慢的设备中间插上一个更小更快的存储设备的想法已经成为一个普遍的观念,存储器层次结构主要思想上一层的存储器作为低一层存储器的高速缓存。
1.7 操作系统管理硬件
如上图应用程序对硬件操作都要经过操作系统。
操作系统有两个基本功能
- 防止硬件被失控的应用程序滥用
- 向应用程序提供统一简单的机制来控制复杂而又通常不同的低级硬件设备。操作系统通过几个基本的抽象概念(进程,虚拟内存,文件),文件是对I/O设备的抽象,虚拟内存是对储存和磁盘I/O的设备的抽象,进程则是对处理器,主存,和I/O设备的抽象表示。
1.7.1 进程
进程是操作系统对一个正在运行的程序的抽象,在操作系统上可以同时运行多个程序,而每一个进程都好像是独占地使用硬件,而并发执行则是一个进程的指令和另一个进程的指令是交错执行的,一个CPU看上去都像是并发的执行多个进程,这是通过处理器在进程间切换来实现的,这种机制就是上下文切换,操作系统保持跟踪进程运行的所有状态信息,包括PC和寄存器文件的当前值以及主存的的内容。进程与进程之间的切换则是由操作系统内核(kernel)来管理的,内核不是一个独立的进程,而是系统管理的全部进程所用的代码和数据结构的集合。
1.7.2 线程
一个进程实际上可以有多个线程的执行单元祖成。每个线程都运行在进程的上下文中,并共享同样的代码和全局数据,多线程比多进程之间更容易共享数据,所以线程一般来说都比进程更高效。
1.7.3 虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供一个假象,即每一个进程都是独占地使用主存。每个进程看到的内存都是一致的,成为虚拟内存
Linux进程的虚拟内存地址空间
1.7.4 文件
文件就是字节序列。每个I/O设备(磁盘,键盘,显示器,网络)都可以看作是文件,系统中的所有输入输出都是通过使用一小组称为Unix I/O的系统函数调用读写文件来实现的
1.8 系统之间利用网络通信
网络属于文件的一种类型,则操作系统就可通过网络适配器读取网络中字节序列,从而实现不同操作系统的互联
1.9 重要主题
1.9.1 Amdahl定律
提升系统某一部分性能所带来的效果,定律详细讲解可参看:Amdahl定律
1.9.2 并发和并行
并发(concurrency)是指一个同时具有多个活动的系统
并行(parallelism)是指用并发使一个系统运行的更快
从系统层次结构由高到低可以有三个层次:
- 线程级并发(早期地并发是模拟出来的,后面多核处理器系统才真正意义上实现真正地并发),超线程(同时多线程 simultaneous multi-threading):是一项允许一个CPU执行多个控制流的技术。
- 指令级并行在较低的抽象层次上,现代处理器可以同时执行多条指令的属性称为指令集并行。
- 单指令,多数据并行在最低层次上,许多现代处理器拥有特殊的硬件,允许一条指令产生多个可以并行的操作,即SIMD并行