《深入理解计算机系统》CSAPP(一)
计算机系统漫游
信息就是位+上下文
- 8位为一字节
- 只有ASCLL字符构成的文件称为文本文件,所有其他文件都称为二进制文件
- 系统中所有信息都是由一串比特表示的,仅靠数据对象的上下文进行区分
程序被其他程序翻译成不同的格式
- 预处理阶段:预处理器根据#开头的命令修改原始C程序。hello.c$\rightarrow$hello.i
- 编译阶段:编译器将hello.i翻译成汇编语言程序。hello.i$\rightarrow$hello.s
- 汇编阶段:汇编器将hello.s翻译成机械语言指令,把这些指令打包成可重定位目标程序的格式,将结果保存在hello.o中。hello.s$\rightarrow$hello.o
- 链接阶段:将单独预编译好的文件与hello.o合并,得到可执行文件hello。hello.o$\rightarrow$hello
了解编译系统如何工作大有益处
- 可优化程序性能
- 理解链接时出现的错误
- 避免安全漏洞
处理器读并解释储存在内存中的指令
- 此时hello.c已被编译系统翻译成了可执行文件hello,并被存放在磁盘上
- 将它的文件名输入到成为shell的应用程序中以在Unix系统上运行该文件
系统的硬件组成
- 总线
- 贯穿整个系统的一组电子管道
- 携带信息字节并负责在各个部件间传递
- I/O设备
- 系统与外部世界的联系通道
- 每个I/O设备都通过一个控制器或适配器与I/O总线相连
- 控制器与适配器都用于在I/O总线和I/O设备之间传递信息
- 主存
- 临时储存设备
- 处理器执行程序时用来存放程序和程序处理的数据
- 物理上:由一组动态随机存取存储器(DRAM)芯片组成
- 逻辑上:是一个线性的字节数组,每个字节都有其唯一的地址(数组索引),地址从零开始
- 中央处理单元/处理器(CPU)
- 执行存储在主存中的指令
- 核心为一个大小为一个字的寄存器,称为程序计数器(PC)
- PC指向机器语言指令(CS:IP)
- 算术/逻辑单元(ALU)
- 下面为CPU可能执行的操作
- 加载:从主存复制一个字/字节到寄存器
- 储存:从寄存器复制一个字/字节到主存
- 操作:把两个寄存器的内容复制到ALU,ALU对这两个字做算数运算,并将结果储存到一个寄存器中
- 跳转:改变PC中的值
- 区分处理器的指令集架构和微体系架构
- 指令集架构描述每条机器代码指令的效果
- 微体系架构描述处理器实际实现方式
运行hello程序
高速缓存至关重要
- 上述例子揭示了:系统花费大量时间运输信息
- 机械原理:较大的存储设备比较小的存储设备运行慢
- 高速缓存(cache)
- 存放处理器近期可能会需要的信息
- L1和L2高速缓存用静态随机访问存储器(SRAM)的硬件技术实现
储存设备形成层次结构
- 上一层作为下一层的高速缓存
操作系统管理硬件
- 所有应用程序对硬件的操作尝试都必须通过操作系统
- 操作系统功能
- 防止硬件被失控的应用程序滥用
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备
- 操作系统通过几个抽象概念(进程、虚拟内存和文件)来实现这两个功能
- 文件是对I/O设备的抽象表示
- 虚拟内存是对主存和磁盘I/O设备的抽象表示
- 进程是对处理器、主存和I/O设备的抽象表示
进程
- 进程制造了程序在单独运行的假象
- 在一个系统上可以同时运行多个进程,而每个进程都好像在独占地使用硬件。
- 并发运行是说一个进程和另一个进程交错执行
线程
- 一个进程实际上可以由多个称为线程的执行单元组成
- 每个线程都运行在线程的上下文中
- 多线程之间比多进程之间更容易共享数据
- 线程一般比进程高效
虚拟内存
- 为每个进程提供每个进程都在独占内存的假象
- 每个进程看到的内存一致,称为虚拟内存地址
- 地址空间最上面保留给操作系统中的代码和数据,底部存放用户进程定义的代码和数据
- 图中地址从下往上增大
- 每个进程看到的虚拟空间由大量准确定义的区构成,每个区都有专门的功能
- 最低的地址开始,逐步向上介绍
- 程序代码和数据
- 对所有的进程来说,代码是从同一固定地址开始,紧接着的是和全局变量相对应的数据位置。
- 代码和数据区是直接按照可执行目标文件的内容初始化的,在示例中就是可执行文件hello
- 堆
- 代码和数据区后紧随着的是运行时堆
- 指定了大小,与此不同,当调用像malloc和free这样的C标准库函数时,堆可以在运行时动态地扩展和收缩
- 共享库
- 大约在地址空间的中间部分是一块用来存放像C标准库和数学库这样的共享库的代码和数据的区域
- 栈
- 位于用户虚拟地址空间顶部的是用户栈,编译器用它来实现函数调用
- 用户栈在程序执行期间可以动态地扩展和收缩
- 每次调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩
- 内核虚拟内存
- 地址空间顶部的区域是为内核保留的
- 不允许应用程序读写这个区域的内容或者直接调用内核代码定义的函数。
- 必须调用内核来执行这些操作
- 程序代码和数据
文件
- 仅仅为字节序列
- 每个I/O设备都可以看成是文件
- 向应用程序提供了一个统一的视图来看待系统中可能含有的所有各式各样的I/O设备
系统之间利用网络通信
- 现代系统通过网络和其他系统连接到一起
- 网络也可视为一个I/O设备
重要主题
- 系统是硬件和软件互相交织的集合体
Amdahl定律
- 当我们对系统的某个部分加速时,其对系统整体性能的影响取决于该部分的重要性和加速程度
- 若程序执行莫应用程序所需时间为$T_{old}$
- 系统某部分所需执行时间与该时间的比例为α,而该部分提升比例为k
- 即该部分初始所需时间为$αT_{old}$,现在所需时间为$(αT_{old})/k$
- 总执行时间为$T_{new} = (1 - α)T_{old} + (αT_{old})/k = T_{old}[(1 - α) + α/k]$
- 加速比$S = T_{old} / T_{new}$为$S=\frac{1}{(1-α)+α/k}$
- 要想显著加速整个系统,必须提升全系统中相当大部分的速度
- 当k趋向于∞时,发现$S=\frac{1}{1-α}$
并发和并行
- 并发:一个同时具有多个活动的系统
- 并行:用并发来使一个系统运行得更快
1.线程级并发
- 同时有多个程序运行的系统
- 单线程系统:在多个任务间切换
- 构建单操作系统控制的多处理器系统$\rightarrow$多处理器系统
- 多核处理器:将多个CPU集成到一个集成电路芯片上
- 超线程
2.指令级并行
- 现代处理器可以同时执行多条指令的属性称为指令级并行
- 如果处理器可以达到比一个周期一条指令更快的执行速率,就称之为超标量处理器
3.单指令、多数据并行
- SIMD并行
- 一条指令产生多个可以并行执行的操作
计算机系统中抽象的重要性
- 减少复杂性
- 虚拟机:对整个计算机的抽象
小结
《深入理解计算机系统》CSAPP(一)