## 如何快速上手一項新技術
Ian Chen
---
## 關於我
---
- 在交大資工所擔任菸酒生
- 開源社群
- COSCUP 2021 IT Team Lead
- 在 COSCUP, SITCON, DevFest 擔任過講者 Speaker
- Deno Taiwan 社群管理員(雖然有點荒廢)
- Leader @ Google DSC NYCU
- IT 幫鐵人賽老鳥
---
## 今天談什麼?
- 我的學習路徑
- 如何快速上手一門技術
- 作業系統理論與實作
- 個人推廣
---
### 我的學習路徑
背景:大一 GPA 2.4 的電子系學生 QQ
0. PHP
1. Vue.js
2. Deno (TypeScript)
3. C
4. golang
---
## 如何快速上手一門技術
---
0. 一個好的學習動機
1. 學習基礎理論
2. 實戰
3. 學習進階理論
4. 繼續實戰...
---
以我學習作業系統的經驗來說:
- 契機
- 基礎理論
- 實戰
---
- 逛 GitHub 時偶然發現陳鍾誠老師的新專案 **mini-riscv-os**
- 因為看到 Jserv 的 COSCUP 演講影片,覺得自幹作業系統超酷的!
https://github.com/cccriscv/mini-riscv-os
---
### 基礎理論
- RISC-V Specification
- 交大開放式課程 -- 計算機組織
- 作業系統概論
- Trace code
- 計算機組織跟作業系統都沒學好
- 本來都在寫 JavaScript,對於 C 語言排斥到爆
---
### 實戰
- 路見不平,拿 Patch (Pull Request) 來補!

---
### 成果
- 鐵人賽軟體組佳作 -- 微自幹的作業系統輕旅行
- GDG DevFest 演講
- 部分內容收錄至金門大學資工系與成功大學資工系的相關課程中
---
讓我們也來學習作業系統開發吧!
---
### 開始之前:記憶體金字塔

---
### 開始之前:處理器內的暫存器

舉例:乘除法心算
---
### 為何要用 C 語言開發作業系統?
- 在 C 語言出現之前:**組合語言**!
- [UNIX 發展](https://github.com/ianchen0119/AwesomeCS/wiki/UNIX%E3%80%81BSD-%E8%88%87-Linux-%E7%9A%84%E6%84%9B%E6%81%A8%E6%83%85%E4%BB%87)
---
### 組合語言(ㄧ)
```assembly
li x6, 1 # a = 1
li x7, 2 # b = 2
add x5, x6, x7 # c = a + b
```
---
### 組合語言(二)
```
_start:
# i = 0
# while (i < 5) i++;
li x5, 0
li x6, 5
loop:
addi x5, x5, 1
bne x5, x6, loop
stop:
j stop # Infinite loop to stop execution
```
---
### 作業系統是什麼?
幫助我們管理硬體資源的軟體,它決定了哪些軟體在哪個時刻能夠分配到 CPU 資源,同時還負責了所有的外部硬體訊號。
---
### 學習作業系統的好處
1. 加強對軟體與硬體的理解
2. 學習記憶體管理、檔案存取的方法
3. 許多技術都是以作業系統的某個觀念作為參考
---
### C 語言與 JS 的差異
1. 強型別與弱型別
2. 記憶體管理
3. 同步與非同步
4. 多執行緒的可能?

---
### 作業系統如何管理硬體資源?
利用 Scheduler!

<small> Ref: http://cs241.cs.illinois.edu/coursebook/Scheduling </small>
---
### 什麼是 Process?
- Thread
- Process
- Program
---
### Thread
- N 個核心就能有 N 個實體 Thread
- N 個實體 Thread 可以對應更多個 Thread

舉例:餐廳的前場與後場
---
### Process
Process 是正在運行的程式,每一個 Process 都會有各自的:
- Register set
- Stack
- Priority
- **通常**一個 Process 只會有一個 Thread
---
Hart -> Kernel Thread -> User Thread -> Process
Hart: 實體執行緒
---
### Program
- Executable file
- 當我們執行 Program 時,作業系統會將它初始化並載入 RAM,初始化完成後就是剛剛提到的 Process
---
### 作業系統如何做到任務切換
- 只考慮 Single Thread 硬體
- 已知 Process 有自己的 Stack 以及 Register Set
- 答案: [Context Switch](https://github.com/ianchen0119/AwesomeCS/wiki/%E5%AD%B8%E7%BF%92%E4%B8%8A%E4%B8%8B%E6%96%87%E4%BA%A4%E6%8F%9B)!
---
### 作業系統如何處理外部訊號?
1. [Interrupt 處理](https://docs.google.com/presentation/d/1VZ0my-lc7o5pIV59_B07NnGUtOlhkv05/edit#slide=id.p13)
2. [User/Kernel Space](https://github.com/ianchen0119/AwesomeCS/wiki/%E6%B7%BA%E8%AB%87%E7%89%B9%E6%AC%8A%E6%A8%A1%E5%BC%8F%E8%88%87%E6%A8%A1%E5%BC%8F%E5%88%87%E6%8F%9B)
---
### 個人推廣
- [微自幹的作業系統輕旅行](https://github.com/ianchen0119/AwesomeCS/wiki)
- [AwesomeCS](https://www.facebook.com/AwesomeComputerScience/)
- [Youtube](https://www.youtube.com/channel/UCaN0t7tYczmrCVLbXljn4tQ)
- [GitHub](https://github.com/ianchen0119)
- [LinkedIn](https://www.linkedin.com/in/ian-chen-88b70b1aa/)
---
### 如何找到我?
- [AwesomeCS](https://www.facebook.com/AwesomeComputerScience/)
- [Linkedin](https://www.linkedin.com/in/ian-chen-88b70b1aa/)
- [IT Help](https://ithelp.ithome.com.tw/users/20110850)
{"metaMigratedAt":"2023-06-16T23:38:46.028Z","metaMigratedFrom":"YAML","title":"六角演講 [Slide]","breaks":true,"slideOptions":"{\"theme\":\"solarized\",\"transition\":\"fade\"}","contributors":"[{\"id\":\"7333ca6e-8194-4198-bafa-dc6af47703ab\",\"add\":7149,\"del\":3609}]"}