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