📌代表重要知识点
📖 代表摘录
📚代表大段摘录
✏️代表练习
💊代表公式
🍁代表自己的想法
计算机系统漫游
📖 系统中所有的信息都是由一串比特表示的。区分不同数据对象的唯一方法是我们读到这些数据对象时的上下文。
📖 预处理器、编译器、汇编器和连接器一起构成了编译系统
📚 系统的硬件组成
-
总线
总线是一组电子管道。
总线携带信息字节并负责在各个部件间传递。
通常总线被设计成传送定长的字节块,也就是字( w o r d word word)。
现在的大多数机器字长要么是 4 4 4个字节( 32 32 32位),要么是8 个字节( 64 64 64位)。
-
I / O I/O I/O设备
I / O I/O I/O设备是系统与外部世界的联系通道。
每个 I / O I/O I/O设备都通过一个控制器或适配器与 I / O I/O I/O总线相连。
控制器是 I / O I/O I/O设备本身或者系统主板上的芯片组。而适配器则是一块插在主板插槽上的卡。两者的作用都是在 I / O I/O I/O总线和 I / O I/O I/O设备之间传递信息。
-
主存
主存是一个临时存储设备。
从物理上来说,主存是由一组动态随机存取存储器( D R A M DRAM DRAM) 芯片组成的;从逻辑上来说,存储器是一个线性的字节数组,每个字节都有其唯一的地址(数组索引,从 0 0 0开始)。
-
处理器
中央处理单元( C P U CPU CPU)的简称,是解释(或执行)存储在主存中指令的引擎。
核心是一个大小为一个字的存储设备(或寄存器),称为程序计数器( P C PC PC) 。在任何时刻, P C PC PC都指向主存中的某条机器语言指令(即含有该条指令的地址)。
寄存器文件是一个小的存储设备,由一些单个字长的寄存器组成,每个寄存器都有唯一的名字。
算术/逻辑单元( A L U ALU ALU)计算新的数据和地址值。
C P U CPU CPU 在指令的要求下可能执行的操作:
-
加载:从主存复制一个字节或者一个字到寄存器,以覆盖寄存器原来的内容。
-
存储:从寄存器复制一个字节或者一个字到主存的某个位置,以覆盖这个位置上原来的内容。
-
操作: 把两个寄存器的内容复制到 A L U ALU ALU, A L U ALU ALU 对这两个字做算术运算,并将结果存放到一个寄存器中,以覆盖该寄存器中原来的内容。
-
跳转:从指令本身中抽取一个字,并将这个字复制到程序计数器( P C PC PC) 中,以覆盖 P C PC PC中原来的值。
-
📖 高速缓存存储器能提高程序的性能
📖 存储器层次结构的主要思想是上一层的存储器作为低一层存储器的高速缓存
📖 操作系统管理硬件
我们可以把操作系统看成是应用程序和硬件之间插入的一层软件,所有应用程序对硬件的操作尝试都必须通过操作系统。
操作系统的两个基本功能:
- 防止硬件被失控的应用程序滥用。
- 向应用程序提供简单一致的机制来控制复杂而又通常大不相同的低级硬件设备。
操作系统通过几个基本的抽象概念来实现这两个功能:
文件是对 I / O I/O I/O设备的抽象显示
虚拟内存是对主存和磁盘 I / O I/O I/O设备的抽象表示
进程则是对处理器、主存和 I / O I/O I/O设备的抽象表示
📚 进程
进程是操作系统对一个正在运行的程序的一种抽象。
并发运行是说一个进程的指令和另一个进程的指令是交错执行的。
操作系统保持跟踪进程运行所需的所有状态信息。这种状态就是上下文,当操作系统决定要把控制权从当前进程转移到某个新进
程时,就会进行上下文切换。进程之间的转换是由操作系统内核( k e r n e l kernel kernel) 管理的。
内核是操作系统代码常驻主存的部分。
📖 在现代系统中,一个进程实际上可以由多个称为线程的执行单元组成,每个线程都运行在进程的上下文中,并共享同样的代码和全局数据。
📚 虚拟内存
虚拟内存是一个抽象概念,它为每个进程提供了一个假象,即每个进程都在独占地使用主存。每个进程看到的内存都是一致的,称为虚拟地址空间。
虚拟地址从低到高的区域分布
程序代码和数据
对所有的进程来说,代码是从同一固定地址开始,紧接着的是和 C C C全局变量相对应的数据位置
堆
共享库
栈
内核虚拟内存
📖 文件就是字节序列。每个 I / O I/O I/O设备,包括磁盘、键盘、显示器,甚至网络,都可以看成是文件。
📖 系统之间利用网络通信。
📌 A m d a h l Amdahl Amdahl定律:假设系统某部分所需执行时间与该时间的比例为 α \alpha α, 而该部分性能提升比例为 k k k,则加速比 S = T o l d T n e w = 1 ( 1 − α ) + α k S=\frac{T_{old}}{T_{new}} = \frac{1}{(1-\alpha)+\frac{\alpha}{k}} S=TnewTold=(1−α)+kα1,可知要想显著加速整个系统,必须提升全系统中相当大的部分的速度。
📚 并发与并行
并发( c o n c u r r e n c y concurrency concurrency) 指一个同时具有多个活动的系统。
并行( p a r a l l e l i s m parallelism parallelism) 指的是用并发来使一个系统运行得更快。
从高到低的三个层次:
- 线程级并发
- 指令级并行
- 单指令、多数据并行( S I M D SIMD SIMD并行)
📖 超线程,又被称为同时多线程( s i m u l t a n e o u s m u l t i − t h r e a d i n g simultaneous multi-threading simultaneousmulti−threading),是一项允许一个 C P U CPU CPU执行多个控制流的技术。
📖 虚拟机提供对整个计算机的抽象,包括操作系统、处理器和程序。
信息的表示和处理
📚 三种最重要的数字表示:
- 无符号编码:表示大于或等于零的数字
- 补码编码:表示有符号整数的最常见的方式
- 浮点数编码:表示实数的科学技术发的以 2 2 2为基数的版本
信息存储
📖 机器级程序将内存视为一个非常大的字节数组,称为虚拟内存。内存的每个字节都由一个唯一的数字来标识,称为它的地址,所有可能地址的集合就称为虚拟地址空间。
📖 我们将程序称为"32 位程序”或"64 位程序”时,区别在于该程序是如何编译的,而不是其运行的机器类型。
linux> gcc -m32 prog.c
linux> gcc -m64 prog.c
📚 排列表示一个对象的字节有两个通用的规则:
- 大端法:最高有效字节在最前面
- 小端法:最低有效字节在最前面
📖 C C C语言的位级运算:或( ∣ | ∣)、与( & \& &)、取反( ∼ \sim ∼)、异或( ^ \hat{} ^)
📖 C C C语言中的逻辑运算: ∣ ∣ || ∣∣、 & & \&\& &&、 ! ! !
📚 C C C语言中的移位运算:
算术左移和逻辑左移相同
逻辑右移在左端补 0 0 0,而算术右移在左端补最高有效位的值
整数表示
💊 无符号编码的定义:
对 于 向 量 x ⃗ = [ x w − 1 , x w − 2 , ⋯ , x 0 ] , B 2 U w ( x ⃗ ) ≐ ∑ i = 0 w − 1 x i 2 i 对于向量\vec{x}=[x_{w-1},x_{w-2},\cdots,x_0],B2U_w(\vec{x})\doteq\sum_{i=0}^{w-1}{x_i2^i} 对于向量x=[xw−1,xw−2,⋯,x0],B2Uw(x)≐i=0∑w−1xi2i
函数 B 2 U w B2U_w B2Uw是一个双射
💊 补码编码的定义:
对 于 向 量 x ⃗ = [ x w − 1 , x w − 2 , ⋯ , x 0 ] , B 2 T w ( x ⃗ ) ≐ − x w − 1 2 w − 1 + ∑ i = 0 w − 2 x i 2 i 对于向量\vec{x}=[x_{w-1},x_{w-2},\cdots,x_0],B2T_w(\vec{x})\doteq-x_{w-1}2^{w-1}+\sum_{i=0}^{w-2}{x_i2^i} 对于向量x=[xw−1,xw−2,⋯,x0],B2Tw(x)≐−xw−12w−1+i=0∑w−2xi2i
函数 B 2 T w B2T_w B2Tw是一个双射
补码的范围是不对称的: ∣ T M i n ∣ = ∣ T M a x ∣ + 1 |TMin|=|TMax|+1 ∣TMin∣=∣TMax∣+1
💊 反码编码的定义:
对 于 向 量 x ⃗ = [ x w − 1 , x w − 2 , ⋯ , x 0 ] , B 2 O w ( x ⃗ ) ≐ − x w − 1 ( 2 w − 1 − 1 ) + ∑ i = 0 w − 2 x i 2 i 对于向量\vec{x}=[x_{w-1},x_{w-2},\cdots,x_0],B2O_w(\vec{x})\doteq-x_{w-1}(2^{w-1}-1)+\sum_{i=0}^{w-2}{x_i2^i} 对于向量x=[xw−1,xw−2,⋯,x0],B2Ow(x)≐−xw−1(2w−1−1)+i=0∑w−2xi2i
💊 原码编码的定义:
对 于 向 量 x ⃗ = [ x w − 1 , x w − 2 , ⋯ , x 0 ] , B 2 O w ( x ⃗ ) ≐ ( − 1 ) x w − 1 ⋅ ( ∑ i = 0 w − 2 x i 2 i ) 对于向量\vec{x}=[x_{w-1},x_{w-2},\cdots,x_0],B2O_w(\vec{x})\doteq(-1)^{x_{w-1}}\cdot(\sum_{i=0}^{w-2}{x_i2^i}) 对于向量x=[xw−1,xw−2,⋯,x0],B2Ow(x)≐(−1)xw−1⋅(i=0∑w−2xi2i)
💊 补码和无符号数之间的转换:
补 码 转 换 为 无 符 号 数 : T 2 U w ( x ) = { x + 2 w , x < 0 x , x ≥ 0 无 符 号 数 转 换 为 补 码 : U 2 T w ( u ) = { u , u ≤ T M a x w u − 2 w , u > T M a x w 简 化 公 式 有 : T 2 U w ( x ) = x + x w − 1 2 w U 2 T w ( u ) = − u w − 1 2 w + u 补码转换为无符号数: T2U_w(x)=\begin{cases} x+2^w,&x<0\\ x,&x\geq0 \end{cases}\\ 无符号数转换为补码:U2T_w(u)=\begin{cases} u,&u\leq TMax_w\\ u-2^w,&u>TMax_w \end{cases}\\ 简化公式有:T2U_w(x)=x+x_{w-1}2^w\\ U2T_w(u)=-u_{w-1}2^w+u 补码转换为无符号数:T2Uw(x)={
x+2w,x,x<0x≥0无符号数转换为补码:U2Tw(u)={
u,u−2w,u≤TMaxwu>TMaxw简化公式有:T2Uw(x)=x+xw−12wU2Tw(u)=−uw−12w+u
📖 当执行一个运算时,如果一个运算数是有符号的而另一个是无符号的,那么 C C C语言会隐式地将有符号参数强转为无符号数。
📖 零拓展:将无符号数转换为一个更大的数据类型时,在开头添加零
📖 符号拓展:将有符号数转换为更大的数据类型时,在开头添加最高有效位的值
💊 截断无符号数:
令 x ⃗ 等 于 位 向 量 [ x w − 1 , x w − 2 , ⋯ , x 0 ] 而 x ⃗ ′ 是 将 其 截 断 为 k 位 的 结 果 : x ⃗ ′ = [ x k − 1 , x k − 2 , ⋯ , x 0 ] 令 x = B 2 U w ( x ⃗ ) , x ′ = B 2 U k ( x ⃗ ′ ) 则 x ′ = x m o d 2 k 令\vec{x}等于位向量[x_{w-1},x_{w-2},\cdots,x_0]\\而\vec{x}'是将其截断为k位的结果:\vec{x}'=[x_{k-1},x_{k-2},\cdots,x_0]\\ 令x=B2U_w(\vec{x}),x'=B2U_k(\vec{x}')\\ 则x'=x\ mod\ 2^k 令x等于位向量[xw−1,xw−2,⋯,x0]而x′是将其截断为k位的结果:x′=[xk−1,xk−2,⋯,x0]令x=B2Uw(x),x′=B2Uk(x′)则x′=x mod 2k
💊 阶段补码数值:
条 件 与 截 断 无 符 号 数 相 同 , x ′ = U 2 T k ( x m o d 2 k ) 条件与截断无符号数相同,x'=U2T_k(x\ mod\ 2^k) 条件与截断无符号数相同,x′=U2Tk(x mod 2k)
整数运算
💊 无符号数加法:
x + w u y = { x + y , x + y < 2 w 正 常 x + y − 2 w , 2 w ≤ x + y < 2 w + 1 溢 出 x+_{w}^{u}y=\begin{cases} x+y,&x+y<2^w&正常\\ x+y-2^w,&2^w\leq x+y < 2^{w+1}&溢出 \end{cases} x+w