深入理解计算机系统 笔记
第一章 计算机系统漫游
信息就是位 上下文
位 = bit 8位 = 8bit = 1byte = 1字节
程序被其他程序翻译成不同的格式
- 源程序
hello.c
-> 预处理器 (cpp) - hello.i -> 编译器 (ccl)
- hello.s -> 汇编器 (as)
- hello.o (bin)
- printf.o (bin)
- ... -> 链接器 (ld)
- hello可执行目标程序 (bin)
预处理阶段
读取源程序的头文件的内容,插入程序文本,得到另一个C程序 hello.i
编译阶段
将程序翻译成汇编语言,包含程序main的定义,hello.i -> hello.s
汇编阶段
将汇编语言翻译成机器语言指令,并将指令打包成 可重定位目标程序
,hello.s -> hello.o (bin)
链接阶
程序中调用的函数存在于标准C库中,而该函数存在于单独预编译好的目标文件中
链接器负责将这类文件合并到我们的程序中,之后得到 可执行目标文件
了解编译系统如何工作是大有益处的
不要教编译器优化代码
系统的硬件组成
- 总线
- I/O设备
- 主存 (内存)
- 处理器
总线
贯穿整个系统的电子管道,负责在各个部件之间传递信息字节。
总线被设计成传送定长的字节块,也就是 字
字长是操作系统的基本参数:
8位 = 字节
16位 = 字
32位 = 双字
64位 = 四字
I/O设备
I/O设备时系统与外部世界的联系通道。 每个I/O设备都通过一个控制器或适配器与I/O总线相连,两者的区别在于封装方式的不同。 控制器是I/O设备本身或主板的芯片组;适配器是插在主板上的卡。
主存
主存由DRAM芯片组成 逻辑上可看成线性的字节数组,没个字节都有唯一的地址 (数组索引)
处理器
CPU 是解释或执行储存在主存中指令的引擎。
其核心是一个大小为一个字的 寄存器
,称为 程序计数器 (PC)
PC指向主存中含有该条指令的地址。
从通电开始到断电技术,处理器一直在不断地执行PC指向的指令,再更新PC指向的地址。
处理器按照指令执行模型来操作,这个模型由 指令集架构
决定。
解释或执行指令的操作围绕着 主存,寄存器文件和算数/逻辑单元 (ALU)
高速缓存
现代处理器主要分为 L1, L2, L3 三级缓存,而 L0 指的是CPU寄存器。速度逐级减少。
进程
进程是操作系统对一个正在运行的程序的一种抽象。
在一个系统上可以同时运行多个进程,而每个进程都好像在独占硬件。
并发
是说一个进程的指令和另一个进程的指令时交错执行的。
无论在单核还是多核系统中,一个CPU看上去都是在并发的执行多个进程,这是通过处理器在进程间的切换来实现的。
操作系统实现这种交错执行的机制成为 上下文切换
。
上下文切换
当系统决定要把控制权从当前进程转移到某个新进程时,就会执行 上下文切换
即 保存当前进程的上下文、恢复新进程的上下文、将控制权转移到新进程,新进程会从它上次停止的地方开始。
上下文切换的操作是由操作系统的 内核
管理的
内核不是独立的进程,它是系统管理全部进程所用代码和数据结构的集合
线程
在现代操作系统中,一个进程实际上可以由多个称为 线程
的执行单元组成
虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在 独占主存,每个进程看到的内存都是一致的,称为 虚拟地址空间
虚拟内存的进本思想是把一个进程虚拟内存的内容存储在硬盘上,然后用主存作为高速缓存
虚拟地址空间
程序代码和数据
对所有进程来说,代码是从同一固定地址开始 代码和数据区在进程开始时就被置顶了大小
堆
堆可以在进程运行时动态地拓展和收缩
共享库
存放C标准库之类的共享库代码和数据的区域
栈
编译器用栈来实现函数调用,栈在程序执行期间可以动态的拓展和收缩 特别的,每当我们调用一个函数时,栈就会增长;从一个函数返回时,栈就会收缩 注:方法的压栈和弹栈
内核虚拟内存
地址顶部空间区域是为内核保留的 不允许应用程序读写或直接调用内核代码定义的函数,相反的,应该通过调用内核,通过内核来执行函数
Amdahl定律
当我们对系统的某个部分加速时,其对系统整体性能得影响取决于该部分的重要性和加速程度。 想要显著加速整个系统,必须提升全系统中相当大的部分的速度。
并发和并行
并发
指一个同时具有多个活动的系统
并行
指使用 并发
来使一个系统运行得更快
- 线程级并发
- 指令级并行
- 单指令、多指令并行
计算机系统中的抽象
- 文件 - I/O设备的抽象
- 虚拟内存 - 程序存储器的抽象
- 进程 - 正在运行的程序的抽象
- 虚拟机 - 整个计算机的抽象