---
# System prepended metadata

title: 'OS '

---

## 第一章
### OS Goals 
- 執行使用者的程式和讓使用者的問題能簡單解決
- 讓電腦系統更方便使用
- 更有效率的使用電腦hardware
### Computer System Structure
- Hardware: CPU, memory, I/O devices
- Operating system: 控制和協調各種應用程式和使用者之間硬體的使用
- Application programs: 應用程式
- Users: 人, 機器, 其他電腦 

### Computer-System Operation
- I/O devices跟CPU可以同時執行
- 每個device controller分別掌管特定的device type, 且都有自己的local buffer
- CPU把資料從main memory移到local buffer或從local buffer移到main memory
- I/O是從device到controller的local buffer
- Device controller 產生interrupt來告訴CPU他完成了

### 發展順序
- Batch -> Multi-programming-> Time sharing -> Multi-processor
- 從timesharing開始重視context switch time
- 作業系統的演進主要在於提升CPU的使用率
- time sharing開始有人機互動
-
### tips
- OS 是分配資源的: 在有衝突的requests決定出合理且有效率的方法
- OS 是控制程式: 控制執行的程式以預防錯誤或較低效的使用
- 
-  concurrently有交互的看似在同時進行
-  simultaneously真的在同時
-  Synchronous operation照順序來不能併行 反義詞是: Asynchronous
-  multi-programming在記憶體中載入多個行程, 系統得以並行(concurrently)地執行多個行程
- passive multi-programming在 IO, exit切換
- Asynchronous Interrupts的來源是外部裝置, 產生的時序與CPU無關(不可預測)user按鍵盤
- Synchronous Interrupts則是由CPU執行指令之後產生的, 時序與CPU同步(可預測)程式執行時發生錯誤的中斷


## 第二章

### 特權指令
- 存取系統控制暫存器：

    更改 CPU 的狀態，例如設定或修改程序狀態字（PSW）。
    更改系統的中斷向量表或處理器的中斷權限。

- 記憶體管理：

    設置或修改記憶體管理單元（MMU）中的頁表或段表。
    更改虛擬記憶體管理的配置，如開啟或關閉分頁或分段。

- I/O 操作指令：

    直接訪問或操作 I/O 設備的指令。
    控制硬碟、網卡、顯示器等設備的指令，例如設置 I/O 端口或寄存器。

- 啟動和停止設備：

    启动或停止特定硬體設備的指令，控制設備的電源管理。

- 模式切換指令：

    切換 CPU 從用戶模式到內核模式或反向的指令。
    設置中斷或中斷屏蔽（如打開或關閉中斷系統）。

- 系統時鐘設置：

    修改系統時鐘或定時器的設置，例如調整系統定時器以支持多任務調度或計算。

- 處理器和系統配置：

    修改 CPU 相關配置，如打開或關閉快取（Cache）。
    配置多核心處理器的行為或調度。

- 程式執行管理：

    創建或終止進程的指令。
    更改進程的優先級或進程狀態，如切換上下文。
### tips
- fork() 複製一個當前的行程，複製出來的叫子行程，子行程會父行程呼叫fork()的地方開始執行(在同一程式要執行不同任務時使用)
- exit() 讓行程終止並回傳狀態碼告知行程是否成功執行(程式爛了按終止)
- wait() 讓父行程等待子行程結束讓子進程回傳值(可能要等子行程完成某些工作父行程才有辦法繼續做 所以讓他wait())
- 作業系統不用layered approach 因為不好明確分層，分太多層表現也會不佳
- API類似於使用者介面，讓使用者不用知道不同系統之間的差異，若使用跨平台的API則只需專注於API的使用
- system call是直接跟kernel做溝通 
API是呼叫多個system call去完成指定的任務
- API搭配libary完成並在user mode執行

## 第三章
### Process state
- new: 新process剛被建立
- ready: new狀態被admit後轉換成ready，或是waiting條件完成後也會回到ready，或是running時被interrupt也回到ready(在ready時可被scheduler挑選而執行)
- running: 被scheduler挑到後的執行狀態 
- waiting: 當running發生IO需求或需要等待其他process完成才能繼續run就會盡waiting
- terminated: process正常結束後的狀態
### Context Switch
- 作業系統在多個進程間切換時發生的過程，當前進程停止，儲存其狀態，載入新進程，改作新的，使CPU concurrently做事
- 進程被interrupt, 完成, 及多工處裡時可能會做切換
- 硬體特性，作業系統實作方式，進程及執行緒特性，中斷和新被處理進程的影響
- context switch time是為了管理多個任務不得不的開銷
### PCB (process control block)
- 進程ID 父進程ID
- 進程狀態(ready,running waiting)
- CPU 註冊資訊: context switch時需要保存
- 記憶體管理資訊: 分配給進程的記憶體空間
- 資源管理資訊: 進程使用到的資源(文件，IO device)
- 進程間通信資訊: IPC資訊(Message queue,Shared memory)
### strace 
- 除錯（Debugging）：用來追蹤一個程式的系統呼叫，找出可能的錯誤來源。例如，如果一個程式因為無法開啟檔案而崩潰，strace 可以幫助找出問題出在哪個系統呼叫上。
- 性能分析：查看系統呼叫的執行時間，以了解程式在系統資源上的消耗情況，找出瓶頸。
- 安全分析：檢查程式是否發出不當的系統呼叫，從而評估其安全性。
- 系統行為理解：理解程式和系統之間的交互細節，這對學習作業系統和程式運行機制很有幫助。
### Difference between Process & Thread
![圖片](https://hackmd.io/_uploads/BkmeRe9WJl.png)
-     資源共享: Sibling Threads可以共享data，因此不需要進行Process間通信的額外操作(IPC)
-     
- 創建和切換開銷低:Thread之間的context switch比Process快，在需要頻繁切換或高並發操作時，Thread的性能優勢更加明顯。

- 高效利用多核處理器: Thread可以在多核處理器上並行執行
### tips
- interprocess communication: process之間溝通用，用Shared memory(共享一塊記憶體把記憶體裡的東西丟給各進程)達成或Message queue(進程把信息封裝丟到queue裡讓其他進程讀)
- orphan process: 子進程的父進程沒了 沒影響 init進程會收養並正常處理
- zombie process: 子進程已經做完了但是父進程沒有做wait() 他的PCB就一直卡在裡面
- OS紀錄進程狀態讓scheduling時只要考慮ready狀態的進程，以及可以讓user查詢
- Device queue: 存放多個進程的裝置請求，透過有序管理請求，防止多個進程同時存取硬體裝置(disk queue, printer queue, network queue, I/O queue)
- Ordinary Pipe: 匿名單向，父子之間傳遞
- Named Pipe: 允許非父子的進程雙向傳遞，有權限的進程都可透過名字訪問，可在多個進程中共享
- Casading termination: 父進程結束，子進程就被迫結束，一路到最下層
- CPU-bound process: 大部分時間在計算，不太需要IO
- I/O-bound Process: 需頻繁的IO操作，因此常處於等待狀態

## 第四章
### Parallelism
- Data: 把一個大資料切成多份丟給各個thread，每個thread做相同的操作但處理不同部分的資料(用於處理相同任務大量資料)
- Task: 多個thread同時執行不同操作處理相同或不同的資料
### Multi process/thread
![圖片](https://hackmd.io/_uploads/ryF8_bqWke.png)
#### Multi thread管理
- Many-to-One Model: 一個kernel thread管一堆user level thread(可能阻塞)
- One-to-One Model: 一個user level thread分一個kernel thread管理(耗資源)
- Many-to-Many Model: 幾個kernel thread管理多個user level thread(kernel thread之間同步和調度需成本來建構)
#### Multi process管理
- Symmetric Multiprocessing: 所有處理器共享同一個記憶體空間，處理器之間地位對等，每個處理器都可以存取所有的記憶體和I/O資源。處理任務可以被分配到任何一個處理器，並且各處理器之間透過共享記憶體進行通訊
- Asymmetric Multiprocessing: 處理器之間的功能不對等，通常由一個主處理器負責系統調度和管理，其餘的處理器則執行特定的任務或工作
- Distributed Processing: 計算資源分佈在不同的運算節點上，通常透過網路相連。每個連接的節點擁有獨立的處理器、記憶體和I/O設備


### Deadlock

#### 必要條件
- 互斥（Mutual Exclusion）：資源只能由一個進程獨佔。
- 請求與保持（Hold and Wait）：進程持有資源的同時，還可以請求其他資源。
- 不可搶奪（No Preemption）：資源一旦分配給進程，除非該進程釋放，否則其他進程不能強行搶奪。
- 循環等待（Circular Wait）：一組進程形成循環等待資源的情形

#### 作法
- Deadlock Prevention: 提前打破死鎖發生的必要條件，必要條件不滿足就不會發生死鎖(能徹底避免但較不靈活)
- Deadlock Avoidance:  在資源分配前，透過算法算下一步是否會進死鎖(更靈活但是須一直計算可能增加開銷)
### tips
- User level thread: 因不用經過kernel所以執行速度較快，但假如有發出block時kernel會把整個process block掉(由user level library管理)
- Kernel level thread: 能處理system call，但開發難度較高(由OS管理)
- implicit threading: 由作業系統或執行環境自動管理並調度thread的技術,thread pool:創一堆thread 等要執行任務的時候從pool裡拉幾個去做，做完繼續回pool
- Race condition: 多個thread要訪問同一個東西導致錯誤，用不同的鎖讓每個thread之間要做的操作不會衝突
- Single process中CPU等其操作全做完才做下一個，waiting的時候CPU會閒置
- Multi process可以去處理別的等有需求再回去處理
- process affinity把一個進程綁在一個核心上執行不讓它跳來跳去(計算密集型程式好用，多線程程式讓線程在同個核心上共享資料，real time延遲低)
- ULT發出IO request需等待，其sibling thread也要等

## 第五章
### 評估
#### Simulation
- 一種通過程式化模型來評估排程演算法的方式
- 時鐘變數
- 隨機數生成
- 追蹤磁帶
#### Deterministic Modeling
- 使用預定義的工作負載來計算各種排程演算法的性能，例如平均等待時間。
#### Queuing Models
- 這種方法描述了進程到達和 CPU/I/O 執行的概率性行為。通過統計方法來計算平均吞吐量、利用率、等待時間等指標，但因其使用的是簡化的假設，可能無法完全精確。
#### Implementation and Testing
- 直接在真實系統中實作新的排程器並進行測試

### tips
- non-preemptive scheduling:CPU分給某個程序他就會一直做到他完成或進waiting
- preemptive scheduling: 一直切(可能使低優先級的一直做不到)(SRTF)
- 老化技術:放越久的進程優先級會越來越高
- Round Robin: 設個時間片 大家公平輪流使用CPU