Skip to content

Commit ceec536

Browse files
committed
8.26 co modify
1 parent e1325aa commit ceec536

3 files changed

Lines changed: 365 additions & 1 deletion

File tree

Lines changed: 364 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,364 @@
1+
# 计算机组成原理
2+
3+
!!! abstract "课程概述"
4+
本笔记涵盖计算机组成原理的核心内容,包括计算机系统结构、指令执行过程、性能评估等重要概念。
5+
6+
## 1. 计算机系统概述
7+
8+
### 1.1 计算机发展历程
9+
10+
!!! timeline "计算机发展的四个阶段"
11+
12+
| 年份 | 技术特征 | 代表机型 |
13+
|--------|------------------------|----------|
14+
| 1946 | 电子管时代 | ENIAC |
15+
| 1958 | 晶体管、磁芯存储器 | IBM 7090 |
16+
| 1965 | 中小规模集成电路 | IBM 360 |
17+
| 1972 | 超大规模集成电路 | Intel 4004 |
18+
19+
!!! info "摩尔定律"
20+
**核心观点:** 每18个月,CPU性能翻倍
21+
22+
**发展趋势:** 半导体存储器容量从1KB增长到1GB,体现了集成电路技术的飞速发展
23+
24+
#### 微处理器发展历程
25+
26+
!!! example "Intel微处理器演进"
27+
28+
| 年份 | 型号 | 位数 | 特点 |
29+
|-----------|-------------------|--------|------|
30+
| 1971 | Intel 4004 | 4位 | 首款微处理器 |
31+
| 1974 | Intel 8080 | 8位 | 个人计算机起步 |
32+
| 1978 | Intel 8086 | 16位 | x86架构诞生 |
33+
| 1985 | Intel 80386 | 32位 | 保护模式 |
34+
| 1993 | Pentium | 64位 | 超标量架构 |
35+
| 2000年代 | Core系列 | 64位 | 多核时代 |
36+
37+
### 1.2 计算机系统结构
38+
39+
!!! abstract "冯·诺依曼结构"
40+
计算机由**五大部分**组成:
41+
42+
- **运算器(ALU)**:执行算术和逻辑运算
43+
- **控制器(CU)**:控制程序执行流程
44+
- **存储器(Memory)**:存储程序和数据
45+
- **输入设备**:数据输入
46+
- **输出设备**:结果输出
47+
48+
#### 重要寄存器
49+
50+
!!! note "存储器相关寄存器"
51+
- **MAR**(Memory Address Register):存储器地址寄存器
52+
- **MDR**(Memory Data Register):存储器数据寄存器
53+
54+
!!! note "运算器相关寄存器"
55+
- **ACC**(Accumulator):累加器
56+
- **MQ**(Multiplier-Quotient):乘商寄存器
57+
- **X**:操作数寄存器
58+
- **IX**(Index Register):变址寄存器
59+
- **BR**(Base Register):基址寄存器
60+
61+
!!! note "控制器相关寄存器"
62+
- **PSW**(Program Status Word):程序状态字寄存器
63+
- **PC**(Program Counter):程序计数器
64+
- **IR**(Instruction Register):指令寄存器
65+
66+
#### 程序编译执行过程
67+
68+
!!! example "从源码到可执行文件"
69+
```
70+
hello.c → hello.i → hello.s → hello.o → hello.exe
71+
源文件 预处理 汇编代码 目标文件 可执行文件
72+
```
73+
74+
#### 指令执行过程
75+
76+
!!! important "指令执行的基本步骤"
77+
78+
**1. 取指阶段:**
79+
```
80+
PC → MAR → Memory → MDR → IR
81+
```
82+
83+
**2. 分析阶段:**
84+
```
85+
OP(IR) → CU(控制单元分析操作码)
86+
```
87+
88+
**3. 执行阶段:**
89+
```
90+
Address(IR) → MAR → Memory → MDR → ACC
91+
```
92+
93+
### 1.3 计算机性能指标
94+
95+
#### 基本概念
96+
97+
!!! info "硬件性能参数"
98+
- **机器字长**:CPU一次能处理的二进制位数
99+
- **数据通路带宽**:数据总线的位数
100+
- **主存容量**:$2^{MAR} \times MDR$(地址空间×字长)
101+
102+
#### 运算速度指标
103+
104+
!!! tip "性能评估指标"
105+
106+
**基本概念:**
107+
- **吞吐量**:单位时间内处理的任务数量
108+
- **响应时间**:从请求到完成的时间
109+
- **主频**:CPU时钟频率
110+
- **CPU时钟周期**:主频的倒数
111+
112+
!!! example "重要性能公式"
113+
114+
**CPI(每指令周期数):**
115+
$$CPI = \frac{CPU时钟周期数}{指令数}$$
116+
117+
**IPS(每秒指令数):**
118+
$$IPS = \frac{主频}{CPI}$$
119+
120+
**CPU执行时间:**
121+
$$CPU执行时间 = \frac{CPU时钟周期数}{主频} = \frac{指令条数 \times CPI}{主频}$$
122+
123+
**MIPS(每秒百万指令):**
124+
$$MIPS = \frac{指令条数}{执行时间 \times 10^6} = \frac{主频}{CPI \times 10^6}$$
125+
126+
**FLOPS(每秒浮点运算数):**
127+
$$FLOPS = 每秒执行的浮点运算次数$$
128+
129+
!!! warning "性能指标使用注意"
130+
- CPI是衡量CPU效率的重要指标,越小越好
131+
- MIPS不能完全反映计算机性能,因为不同指令复杂度不同
132+
- FLOPS主要用于科学计算领域的性能评估
133+
134+
## 2. 数据表示和运算
135+
136+
### 2.1 数制与编码
137+
#### 2.1.1 进制转换
138+
139+
!!! tip "十进制转二进制方法"
140+
141+
**整数部分转换:**
142+
- 方法:不断除以2,取余数
143+
- 顺序:余数倒序排列(先余为低位,后余为高位)
144+
145+
**小数部分转换:**
146+
- 方法:不断乘以2,取整数部分
147+
- 顺序:整数部分顺序排列(先整为高位,后整为低位)
148+
149+
!!! example "进制转换示例"
150+
151+
**整数转换:** 13₁₀ → ?₂
152+
```
153+
13 ÷ 2 = 6 ... 1
154+
6 ÷ 2 = 3 ... 0
155+
3 ÷ 2 = 1 ... 1
156+
1 ÷ 2 = 0 ... 1
157+
```
158+
结果:1101₂
159+
160+
**小数转换:** 0.375₁₀ → ?₂
161+
```
162+
0.375 × 2 = 0.75 → 取整数部分 0
163+
0.75 × 2 = 1.5 → 取整数部分 1
164+
0.5 × 2 = 1.0 → 取整数部分 1
165+
```
166+
结果:0.011₂
167+
168+
#### 2.1.2 定点数表示
169+
170+
!!! abstract "定点数的两种形式"
171+
172+
**定点整数:** 符号位 + 数值位,小数点固定在最低位之后
173+
- 格式:`S.XXXXXXX`(实际小数点在末尾)
174+
- 示例:`00000101` 表示 +5,`10000101` 表示 -5
175+
176+
**定点小数:** 符号位 + 数值位,小数点固定在符号位之后
177+
- 格式:`S.XXXXXXX`(小数点在符号位后)
178+
- 示例:`0.1010000` 表示 +0.625,`1.1010000` 表示 -0.625
179+
180+
#### 2.1.3 编码方式
181+
182+
!!! important "四种编码方式对比"
183+
184+
| 编码方式 | 定义 | 求法 | 表示范围(n位) | 特点 |
185+
|----------|------|------|-----------------|------|
186+
| **原码** | 最高位为符号位,其余为绝对值 | 正数:直接转二进制<br>负数:符号位为1,数值位为绝对值 | $-(2^{n-1}-1)$ ~ $+(2^{n-1}-1)$ | 有±0,直观易懂 |
187+
| **反码** | 正数同原码,负数数值位按位取反 | 正数:同原码<br>负数:符号位不变,数值位取反 | 同原码 | 有±0,是补码的中间步骤 |
188+
| **补码** | 正数同原码,负数为反码+1 | 正数:同原码<br>负数:反码+1 | $-2^{n-1}$ ~ $+(2^{n-1}-1)$ | 0唯一,便于运算 |
189+
| **移码** | 真值加上偏移量$2^{n-1}$ | $[X]_{移} = X + 2^{n-1}$ | 同补码 | 便于大小比较,用于浮点数指数 |
190+
191+
!!! example "8位编码示例(以±5为例)"
192+
193+
| 编码方式 | +5 | -5 |
194+
|----------|----|----|
195+
| **原码** | `00000101` | `10000101` |
196+
| **反码** | `00000101` | `11111010` |
197+
| **补码** | `00000101` | `11111011` |
198+
| **移码** | `10000101` | `01111011` |
199+
200+
!!! note "变形补码(模4补码)"
201+
- **特点:** 符号位占两位
202+
- **编码:** 00表示正数,11表示负数
203+
- **用途:** 某些特殊运算场合
204+
205+
* 补充:两个互为相反数的数的补码可以通过互相取反加一得到。
206+
* 补充:注意带符号整数用补码表示这种表述。
207+
208+
### 2.1.4 编码方式的关系与特点
209+
210+
!!! tip "编码转换规律"
211+
212+
**正数特点:**
213+
- 正数的原码、反码、补码完全相同
214+
215+
**负数转换:**
216+
1. 原码 → 反码:符号位不变,数值位按位取反
217+
2. 反码 → 补码:反码的最低位加1
218+
3. 原码 → 补码:可直接通过反码中转
219+
220+
**补码优势:**
221+
- 解决了0的唯一性问题(只有+0,没有-0)
222+
- 加减运算统一,便于硬件实现
223+
224+
**移码特点:**
225+
- 编码值与真值单调对应,便于比较大小
226+
- 主要用于浮点数的指数部分
227+
228+
![表示方式](https://eclipseyue-1323281044.cos.ap-nanjing.myqcloud.com/pic/jinzhi.png)
229+
230+
### 2.1.5 C语言中的数值类型
231+
232+
!!! info "C语言整数类型"
233+
234+
**无符号整数(unsigned int):**
235+
- 表示范围:$0$ ~ $2^n - 1$
236+
- 特点:只能表示非负数,没有符号位
237+
238+
**有符号整数(int):**
239+
- 表示范围:$-2^{n-1}$ ~ $2^{n-1} - 1$
240+
- 编码方式:采用补码表示
241+
- 特点:最高位为符号位
242+
243+
!!! warning "类型转换注意事项"
244+
- **有符号与无符号转换:** 位模式不变,但解释方式改变
245+
- **溢出处理:** 超出表示范围时会发生截断
246+
- **位运算:** 逻辑右移补0,算术右移补符号位
247+
248+
### 2.2 运算方式和电路
249+
250+
!!! todo "待补充内容"
251+
定点数运算、移位运算、ALU设计等相关内容
252+
253+
### 2.3 浮点数的表示与计算
254+
255+
#### 2.3.1 浮点数基本格式
256+
257+
!!! abstract "浮点数组成"
258+
浮点数由**阶码****尾数**两部分组成:
259+
260+
```
261+
|<-----阶码E----->|<-----尾数M----->|
262+
|E_f|E1E2...E(n-1)|M_f|M1M2...M(n-1)|
263+
```
264+
265+
**浮点数表示公式:**
266+
$$N = r^E \times M$$
267+
268+
其中:
269+
- **N**:浮点数的真值
270+
- **r**:基数(通常为2)
271+
- **E**:阶码,表示指数部分
272+
- **M**:尾数,表示有效数字部分
273+
274+
#### 2.3.2 浮点数的特点
275+
276+
!!! warning "浮点数溢出问题"
277+
- **上溢出**:指数过大,超出表示范围
278+
- **下溢出**:指数过小,接近于0
279+
- **解决方案**:需要进行溢出检测和处理
280+
281+
!!! important "规格化要求"
282+
为了提高精度和唯一性,浮点数需要规格化:
283+
- **规格化形式**:尾数的最高位为1
284+
- **目的**:消除前导零,提高有效数字位数
285+
286+
!!! note "编码方式"
287+
- **阶码**:通常采用移码表示,便于比较大小
288+
- **尾数**:采用补码表示,包含符号位
289+
- **注意**:阶码和尾数要分别进行补码转换
290+
291+
#### 2.3.3 IEEE 754标准
292+
293+
!!! abstract "IEEE 754浮点数标准"
294+
国际通用的浮点数表示标准,定义了单精度和双精度两种格式。
295+
296+
##### 单精度浮点数(32位)
297+
298+
对应C语言中的`float`类型:
299+
300+
```
301+
|符号(1)|<-----阶码E(8)----->|<-----尾数M(23)----->|
302+
|S 31|30 bias 23 |22 frac 0|
303+
```
304+
305+
##### 双精度浮点数(64位)
306+
307+
对应C语言中的`double`类型:
308+
309+
```
310+
|符号(1)|<-----阶码E(11)----->|<-----尾数M(52)----->|
311+
|S 63 |62 bias 52 |51 frac 0|
312+
```
313+
314+
#### 2.3.4 IEEE 754编码规则
315+
316+
!!! tip "编码方式说明"
317+
318+
**阶码编码:**
319+
- 采用**移码**表示
320+
- 偏移量:$2^{k-1}-1$(k为阶码位数)
321+
- 单精度偏移量:127
322+
- 双精度偏移量:1023
323+
324+
**尾数编码:**
325+
- 采用**原码**表示(注意不是补码)
326+
- 隐含前导1:实际表示为 `1.M`
327+
- 只存储小数点后的部分
328+
329+
!!! warning "特殊值处理"
330+
IEEE 754标准中,阶码全0和全1有特殊用途:
331+
332+
- **阶码全0**:表示非规格化数或零
333+
- **阶码全1**:表示无穷大或NaN(非数值)
334+
335+
!!! example "IEEE 754格式特点"
336+
337+
**隐含位技术:**
338+
- 规格化数的尾数隐含前导1
339+
- 实际尾数为 `1.fraction`
340+
- 只存储小数点后的23位(单精度)或52位(双精度)
341+
342+
**为什么偏移量是 $2^{k-1}-1$:**
343+
- 避免阶码为128时导致的特殊情况
344+
- 确保有足够的正负指数范围
345+
346+
#### 2.3.5 浮点数表示范围
347+
348+
!!! info "IEEE 754表示范围"
349+
350+
**单精度浮点数(float):**
351+
- 有效数字:约7位十进制数字
352+
- 指数范围:-126 ~ +127
353+
- 数值范围:约 $1.4 \times 10^{-45}$ ~ $3.4 \times 10^{38}$
354+
355+
**双精度浮点数(double):**
356+
- 有效数字:约15-16位十进制数字
357+
- 指数范围:-1022 ~ +1023
358+
- 数值范围:约 $4.9 \times 10^{-324}$ ~ $1.8 \times 10^{308}$
359+
360+
![float和double对比](https://eclipseyue-1323281044.cos.ap-nanjing.myqcloud.com/pic/float.png)
361+
362+
![IEEE754标准详解](https://eclipseyue-1323281044.cos.ap-nanjing.myqcloud.com/pic/ieee.png)
363+
364+

docs/CS/data_structure/data_structure.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -794,7 +794,7 @@ typedef struct CSNode {
794794
795795
!!! tip "转换规则"
796796
797-
**树转二叉树:**
797+
**树转二叉树:(左孩子右兄弟)**
798798
1. 加线:在所有兄弟结点之间加一条连线
799799
2. 去线:树中每个结点,只保留与第一个孩子结点的连线,删除与其他孩子的连线
800800
3. 层次调整:以树的根结点为轴心,将整棵树顺时针旋转一定角度

docs/Tech/cpp_Basic.md

Whitespace-only changes.

0 commit comments

Comments
 (0)