# Ch1:Computer Abstraction and Technology
:::warning
前面廢話蠻多的,要考前衝刺的直接跳到 Permormance
:::
## 1-1 Introduction
- **Moore's Law**:
- 每 1.5 年晶片上的電晶體密度會翻倍
- 會有極限:因為**量子穿隧效應**會限制電晶體所能達到的最大密度

### 電腦的種類
- **Personal PC**:目前最廣泛使用的電腦
- **Server**:
- 專門運行**大型程式**
- 常用於網路傳輸
- 允許**多使用者同步使用**

- **Supercomputer**:
- 擁有最高的性能與成本
- 經常用於**科學與工程計算**

- **Embedded Computer(嵌入式電腦)**:
- 一種嵌入在其他裝置上的電腦
- 能力與表現受限於**硬體**

- **個人移動裝置(PMD)**:
- 使用**電池**供應電源
- 使用**無線網路**
- e.g. 手機、平板
- **Cloud computing**:
- 依賴 **Warehouse Scale Computer(WSCs)**
- **Software as a Service(SaaS)**
- 一部分運行在 PMD;另一部分運行在雲端
## 1-2 Eight Great Ideas
以下是電腦架構的八大核心理念:
1. **為 Moore's Law 設計(Design for Moore’s Law)**:
- 摩爾定律預測:晶片上的電晶體數量每兩年會翻倍
- 設計電腦時要考慮到這個成長趨勢,讓系統可以隨著硬體的進步一起升級,不會被限制住。
2. **使用抽象來簡化設計(Use Abstraction to Simplify Design)**
- 使用抽象來將複雜的系統分層,簡化開發流程
- e.g.作業系統不用思考硬體設計
3. **讓常見情況執行更快(Make the Common Case Fast)**:
- 優化**常見的操作情境**,有助於提升效率
- e.g. 如果 90% 的時候都在讀資料,那你就應該先讓「讀」的操作更快,而不是優化用不到 10% 的「寫」操作。
4. **透過平行處理提升效能(Performance via Parallelism)**:
- 允許設備可以同時執行多個 process
- e.g. 多核心處理器
5. **透過 Pipelining 提升效能(Performance via Pipelining)**:
- 像工廠流水線一樣,把一個任務拆成多個步驟,每個階段同時運作,提升處理速度。
- e.g. CPU 執行一條指令時,會分成 **Fetch, Decode, Execute, Store**。當第一條在 execute 時,第二條可以 Decode,第三條可以 Fetch。

6. **透過預測提升效能(Performance via Prediction)**:
- 猜測接下來會發生什麼,提前準備,減少等待時間。
- 即使偶爾猜錯,只要常常猜對,效能整體就會好。
7. **建立記憶體分層(Hierarchy of Memories)**:
- 不同記憶體會有不同的容量與讀取速度

8. **靠系統冗餘提升可靠性(Dependability via Redundancy)**:
- 加入**備份** -> 當部分系統出問題時還能運作,避免整個系統掛掉。
- e.g. 資料中心會用 **RAID 技術**,把資料寫到多顆硬碟上,即使一顆壞掉,還是可以救回資料。
## 1-3 Below Your Program
### 計算機結構分層
- **Application Software**:
- 使用者能夠**直接接觸**的階層
- 使用高階語言撰寫
- **System Software**:
- **Compiler, Assembler**:將高階語言轉成 Machine code
- **作業系統**:溝通軟硬體的媒介
- **Hardware**:
- CPU, Memory, I/O 裝置

### 程式語言分層

## 1-4 Under the Cover
### Liquid Crystal Display(LCD)
- 由薄層的液晶組成
- 使用**電晶體**去控制每個液晶穿透的光線
- **Frame buffer**:
- 資料以 **bit map** 的方式儲存
- RGB -> 24 bits

### Abstraction
- **目標**:隱藏 low-level
- **Instruction set architecture(ISA, 指令集)**:
- 是**硬體與低階軟體**的 interface
- 封裝於**作業系統**中
- 控制一些**基礎操作**(如 I/O 控制...)
- **Application binary interface**:ISA + 作業系統
### 記憶體揮發性(Volatility)
| | 揮發性記憶體(Volatile) | 非揮發性記憶體(Nonvolatile) |
| -------- | -------- | -------- |
| 描述 | 只有在電源開啟時才儲存資料,電源關閉後資料會消失 | 可以永遠儲存資料,不受電源供應影響 |
| 讀取速度| 快 | 慢 |
| 成本| 高 | 低 |
| 容量 | 小 | 大 |
| 例子 | RAM(DRAM、SRAM) | 硬碟、SSD、ROM、Flash |
## 1-5 Technology of Processor and Memory
- **電腦組成科技的演變**

### 半導體(Semiconductor)
:::warning
這邊有點超綱,可以不讀。詳情可以參考 **VLSI** 筆記。
:::
- 簡介:
- 半導體使用**矽**作為原料
- 矽本身不導電,但可以透過加入材料讓他倒電
- **p-type 半導體**:
- 加入 3A 族元素(硼)
- 形成電洞(hole)
- **n-type 半導體**:
- 加入 5A 族元素(鉍)
- 形成自由電子

- **製程**:

- **成本計算**:
:::warning
公式可以看一下
:::
- $\mathrm{code\ of\ per\ die} = \cfrac{\mathrm{cost\ per\ wafer}}{\mathrm{die\ per\ wafer} \times \mathrm{yield}}$
- $\mathrm{die\ per\ wafer} = \cfrac{\mathrm{wafer\ area}}{\mathrm{die\ area}}$
- $\mathrm{Yield} = \cfrac{1}{1 + (\mathrm{defect\ per\ area} \times \frac{\mathrm{die\ area}}{2})^2}$
## 1-6 Performance
- **Response time**:做完任務需要耗時多久
- **Throughput**:每段時間做完多少任務
- **Relative performance**:$\mathrm{performance} = \frac{1}{\mathrm{execution\ time}}$
### Response time 計算方式比較
:::warning
本章節大多數計算皆使用 CPU time
:::
- **Elapsed time**:
- 任務全部的 responce time
- 需要參考許多因素(I/O 處理、閒置時間等)
- 決定於**系統表現**
- **CPU time**:只參考 **CPU 的執行時間**
### CPU clocking
- 所有**數位硬體**操作都受到**固定速率的 CPU clock** 控制
- **Clock period**:clock cycle 的週期
- **Clock rate(時脈)**:clock 的頻率

- $\mathrm{CPU\ Time = CPU\ Clock\ Cycle \times Clock\ Cycle\ Time = \cfrac{CPU\ Clock\ Cycle}{Clock\ rate}}$
### Instruction Performance
- **Instruction count**:
- 一個程式所需要的指令數量
- 取決於 **program, ISA, compiler**
- **Cycles per instruction (CPI)**
- 由 **CPU 硬體**決定
- 不同 instruction 會有不同的 CPI
- $\mathrm{CPI = \cfrac{Clock\ Cycles}{Instruction\ Count}}$
- **平均 CPI**:
- 使用加權值來計算
- $\mathrm{Average\ CPI = \sum_{i=1}^n(CPI_i \times \cfrac{Instruction\ Count_i}{Instruction\ Count})}$
- $\mathrm{Clock\ Cycles = Instruction\ Count \times Cycles\ per\ Instruction}$
- 實際計算:

## 1-7 The Power Wall(功率牆)
- **Power wall**:
- 當 **CPU clock rate** 提升到某個程度後,就無法再繼續提升,因為晶片產生的熱量太高,無法有效冷卻,導致系統無法穩定運作。

- 動態功耗公式:$\mathrm{Power} = C \times V^2 \times f$
- $C$ = Capacitive load,電容負載
- $V$ = 電壓
- $f$ = CPU clock rate

- 因為 power wall 的存在,我們不能依賴提升 clock rate 來提升效能
- 我們使用**多核心處理**來提升效能
## 1-8 The Switch from Uniprocessors to Multiprocessors
- **Uniprocessors 的演變**:
- 瓶頸:Power wall, 平行化指令, 記憶體延遲

- **Multiprocessor**:
- **Multicore microprocessors**:一個 chip 有**多個 processor**
- 真正的**平行化編程**:
- 硬體同時處裡多個 instructions
- 對使用者隱藏
## Amdahl's Law
:::warning
結論:改善性能不代表整體變快
:::
- **概述**:
- 用來衡量改善系統的後的效率
- 改善性能不會改善整體表現
- **公式**:$T_{improved} = \cfrac{T_{affected}}{n} + T_{unaffected}$
- $T_{improved}$:系統整體改善後耗時
- $T_{affected}$:改善部分的「改善前耗時」
- $T_{unaffected}$:未改善部分的耗時
- $n$:系統效率提升倍率