## 第一章
### 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

- 資源共享: 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

#### 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