计算机系统漫游
信息就是位+上下文
系统中的信息都是由一串比特表示的,在不同的上下文中,一个同样的字节序列可能表示一个整数、浮点数、字符串或者机器指令。
此处的上下文在我的理解中就是数据的类型 int char float等
程序被其他程序翻译成不同的格式
一段简单的程序 hello.c
1 |
|
在linux系统上被GCC翻译时经历以下四个阶段
- 预处理器根据头文件将程序修改为另一个C程序 此时文件为hello.i
- 编译器将程序编译成汇编语言 此时文件为hello.s
- 汇编器将汇编程序翻译成机器语言指令并打包成可重定位目标程序的格式,保存在hello.o二进制文件中此时程序为01二进制表示的一串数字序列 此时文件为hello.o
- 链接器将printf函数(各种库函数)的可重定位目标程序文件printf.o合并到该原始文件hello.o中 最终得到hello 文件 此时文件为hello
系统的硬件组成
CPU I/O设备(磁盘、鼠标、显示器、键盘等) 内存(主存) 总线
CPU由 PC(程序计数器 指向要操作的指令的地址) 寄存器文件(由寄存器组成 寄存器为大小为一个字的存储设备) ALU(用于计算) 等其他设备(比如cache)组成,CPU可执行这些操作
- 加载:从内存复制一个字节/一个字到寄存器,覆盖寄存器原来内容
- 操作:把两个寄存器内容复制到ALU,ALU进行运算后把内容存放到一个寄存器中,覆盖寄存器中的原内容
- 存储:从寄存器中复制内容到内存中
- 跳转:从指令中复制内容到PC中,覆盖PC的原来内容
高速缓存(cache)和存储设备
以下存储器层次结构 左方可以看成是右方的高速缓存
寄存器-L1高速缓存-L2高速缓存-L3高速缓存-主存(也就是常说的内存)-磁盘-远程存储
L1 L2 L3高速缓存是因为CPU访问主存太慢依据局部性原理而诞生的(用SRAM制造)
进程和线程
以普通单核CPU为例子,进程为程序加上程序运行所需要的资源空间,线程为进程中程序的子部分,同一进程的线程共享该进程的所有数据。
CPU中实际运行的是线程 但用户看见的只有进程
四个抽象
- I/O设备抽象成文件,用户看来操作系统通过操作设备对应的文件(鼠标文件 显示器文件等)来控制I/O设备,网络也可以看成一种I/O设备即文件。
- 文件和主存抽象成虚拟内存
虚拟地址空间:(和虚拟内存不是一个概念)在每个进程看来自己独占整个操作系统,实际上每个进程所看到的都是虚拟地址空间,虚拟地址经过映射指向实际的地址空间.编写代码的指针的数值实际上是虚拟地址,并没有指向实际的地址空间
虚拟内存:将所有存储设备(磁盘、网络文件等)都看成内存的一部分,对用户进程来说它们都是内存,是一个非常大的连续的字节数组,但实际上是虚拟内存。当进程要使用不在内存的内容时操作系统会把这些内容调进内存中。
虚拟内存作为一个概念是内存可以有不同的支持。进程的一些内存可以在磁盘上,一些在主内存中,有些甚至可以在远程网络上。这是由操作系统管理的,对正在运行的用户进程是透明的。对于用户进程来说,它只是内存。虚拟地址空间意味着映射到用户进程的内存地址。两个不同的用户进程访问(对它们)内存中的相同地址,但它们将包含完全不同的数据。如果用户地址空间很小(如 32 位),这一点尤其重要。这意味着每个进程都可以访问地址空间允许的尽可能多的内存,无论进程如何存在。在操作系统中,它们中的每一个都可以在没有另一个的情况下存在。但是它们结合起来是最有用的,因此通常由操作系统以紧密耦合的方式实现。
- 虚拟内存+处理器抽象成进程(一个正在运行的程序的抽象)
- 进程+操作系统抽象成虚拟机
并发和并行
- 并发
CPU只能同时运转一个进程,当进程需要处理一些耗费时间较长且不需要CPU操作的事情时,CPU会去执行下一个进程,此时操作系统会保存被切换进程运行所需要的所有状态信息,也就是上下文信息。这被称为进程切换
并发就是CPU不断切换执行的进程来提高CPU的利用率,好比一个单人跑道上面 A跑累了切换成B去跑,B跑累了切换成C去跑,每个人都记住自己被切换时停止的位置信息(即上下文信息),轮到他跑步时从原来位置接着跑
- 并行
线程级并发
这是并发并不是并行,早期操作系统没有线程这个概念,进行进程切换更新上下文信息代价过大(切换指令以及切换资源空间),切换线程只需要切换指令,速度很快。
用户级线程和核心级线程:用户级线程并不涉及内核中,当用户级线程堵塞时候,操作系统会以为整个进程堵塞从而切换进程。核心级线程分为内核部分和用户部分,所以核心级线程堵塞时候操作系统可以“看到”从而切换到另一个核心级线程(不一定是同一个进程下),该切换操作在内核部分完成,之后可以返回到用户部分。
线程级并行
超线程技术(Hyper-Threading) 一个物理核心同时运行两个线程,称为虚拟内核;
多核技术(物理上多个核心),即多个CPU
指令集并行
CPU采用流水线技术同时执行多条指令,举个例子:两双鞋子需要加工 鞋底 鞋带,一个机器上只能同时加工一个鞋底和一个鞋带,那么就先加工A鞋子的鞋底和B鞋子的鞋带然后在加工B鞋子的鞋底和A鞋子的鞋带,即为流水线技术。
多数据并行
一个指令对应一个操作,多数据并行运用SIMD技术可以一个指令执行更多操作数提供更快的运行速度。