---
# System prepended metadata

title: 計概中的背景知識
tags: [System Software]

---

---
tags: System Software
---

<style>
    font {
        color: red;
        font-weight: bold;
    }
</style>

# 計概中的背景知識

- 不負責任整理
- 可能有不正確、不正式的用詞
- 歡迎提出修改

## Storage 儲存資料的硬體
> 引用文
> https://ithelp.ithome.com.tw/articles/10225077

![](https://i.imgur.com/VJq9NUM.png =400x)

1. **CPU register**
    CPU 使用的==暫存器==，速度非常的快但容量非常小，用來儲存instruction(指令)與資料。
2. **cache**
    CPU 讀取記憶體的行為相對慢，因此在讀取記憶體內容時，會是以一個單位來拿取資料後暫存於 cache(快取)，CPU 下次讀取記憶體資料前會先在 cache 裡面尋找，如果有找到就能直接拿 cache 的，加速讀取的過程。
3. **main memory**(RAM)
    大家比較熟悉的==記憶體==，用來儲存執行Process要用到的資源。
4. **electronic disk(SSD)**
    固態硬碟，比起傳統的硬碟使用磁頭的機械行為，SSD的體積比較小、速度快也比較省電。
5. **magnetic disk(HDD)**
    硬碟，就是上面講的使用磁頭的傳統硬碟，因為是物理的磁頭去讀取資料內容，資料的儲存位置會影響存取的速度，整體速度比SSD還慢，但容量大且造價便宜。
6. **optical disk**
    光碟，現在已經比較少了。
7. **magnetic tapes**
    磁碟片，基本上現在已經看不到了，小時候很喜歡拉磁碟片上面那條鐵片。
    > 古老到需要一張照片，我真不知道這個東西。
    > ![](https://i.imgur.com/qS8cF0p.png =300x)
    
:::success
上述設備由1至7的順序，數字越大造價越便宜、容量越大、速度越慢。
1-3具有揮發性，指斷電後儲存的資料會消失，反之4-7則不會。
:::

:::info
如果 **CPU** 是 **廚師**:
- **硬碟** 就是 **冰箱**
    - 食材可以長期儲存，不會壞掉
    - 但是食材要從冰箱拿出來才能用
    - 從冰箱拿食材要多花一點時間
- **記憶體** 就是 **流理台**
    - 從冰箱拿出來的食材、做到一半的半成品都會放在流理台上
    - 流理台上的食材不拿去冰會壞掉，所以用完要拿去冰
    - 從流理台直接拿食材會比較快
- **暫存器** 就是廚師的 **雙手**
    - 東西已經從冰箱拿放在流理台了，但是要拿在手上才能進行動作
    - 就算不拿著，你的手也要碰到食材才能做事吧
    - 拿在手上的東西最快，但你的手只有一雙，所以不能一次拿很多東西
:::

作業系統是個平台，可以讓許多的程式在他之上執行，其流程如下：

1. 苦命的工程師撰寫程式碼，不管是什麼程式語言 C++, C#, python, JavaScript。
1. 透過編譯器(compiler)，開始把原始碼編譯成Program。電腦這時會有一些檔案被放在硬碟(disk)之中。
1. 當使用者啟動了編譯後的Program(存放在disk裡面)，作業系統會把Program載入(load)到記憶體裡面，成為一個或多個Process。

==CPU 只能夠存取記憶體的內容，不能夠直接讀取硬碟的資料==，所以不論是要使用硬碟內的資料還是程式(Program)，都需要先載入到記憶體裡面。

## System Components 硬體架構
![](https://i.imgur.com/zyh79Y7.png)

* 指令暫存器(IR, Instruction Register)：存放正在執行或即將執行的指令
* 程式技術器(PC, Program Counter)：存放下一條指令的存儲單元地址，具有自動遞增的功能
* 存儲器地址暫存器(MAR, Memory Address Register)：存放即將要存取的存儲單元地址
* 存儲器數據暫存器(MDR, Memory Data Register) ：存放要對存儲單元進行讀寫的數據
* 指令譯碼元件：對IR中的指令進行譯碼，用以確定是哪種指令要被執行
* 控制電路：根據指令產生控制信號，在時序脈衝同步下控制CPU中各元件的動作

![](https://i.imgur.com/RB6Vqsh.png)

## Program, Process and Instructions

- **Program** (程式)
    - 儲存在 **硬碟** 中
    - 程式碼編譯後的產物，是一堆機器碼，但不是實際在執行的指令
    - 程式執行前，會被 program loader **載入**到記憶體中，變成 process
        - 載入時，硬碟中的內容會被複製到記憶體中，並設定好所有需要的記憶體位置資訊

- **Process** (程序)
    - 儲存在 **記憶體** 中
    - 實際在執行的一堆指令

- **Thread** (執行緒)
    - 一個 process 可以有多個執行緒
    - 用來實現平行執行
    - 但講下去會太複雜，有興趣的人可以搜尋 "Process vs. Thread"

### Instructions and Data

一個 process 可以分為 instructions 和 data 兩個部分
- **Instructions**
    - 告訴 CPU 該執行那些**動作**
    - 這些動作作用在哪些資料上
    - 這些動作的順序
    - 可以想成是程式語言中的 operator 和 function
- **Data**
    - process 中的**資料**
    - 所有運算時用到數值
    - 可以想成是程式語言中的變數和常數

:::info
如果把 CPU 想成是廚師，那...
- Instructions 就是食譜，告訴廚師該對哪些食材做哪些動作，以及每個動作間的先後順序
- Data 就是食材，是實際上被拿來操作的東西
:::

現代的機器都屬於 **Von Neumann architecture**(馮·紐曼架構)，指令會和資料一樣存放在記憶體中，所以指令也會占用記憶體空間
![](https://i.imgur.com/oDEVebr.png =300x)

### Instruction 的組成

Instruction 中一定包含幾個欄位，用來表示以下兩個資訊
- **OP Code**
    - 代表此指令要執行的運算 (動作)
    - 同一顆 CPU 能執行的每一種運算都會被分配一個編號
        - 這個編號就是 OP Code
    - E.g., 有一顆 CPU 支援加、減、乘、除四種運算，則可以設計成
        - 0(`00`) 表示加法
        - 1(`01`) 表示減法
        - 2(`10`) 表示乘法
        - 3(`11`) 表示除法
- **Operand**
    - 要拿來執行運算的資料
    - 根據不同的硬體架構，有不同的表示方式
    - 可以是數值
    - 也可以是記憶體位置，記憶體中對應位置的資料才是實際被用於運算的資料

## CPU and Instructions

- CPU 可以執行的每一種運算都對應到一種實體的電路
    - Ex: 加法運算對應到加法器電路
- 每一個運算都有一個編號 - OP Code
- 在 CPU 中，控制單元會依據 OP Code 選擇對應電路產生的結果
