# CS3009 作業系統 Operation System Textbook: Operating System Concepts Abraham Instructor: 鄭欣明 Shin-Ming Cheng ###### tags: `TaiwanTech`, `CS` ## Ch1 * 作業系統是中間的媒介 * 將使用者需求轉譯成對硬體資源的取用 * 提升硬體使用效率 * 硬體-作業系統-應用程式-使用者 * resource allocator * control program * Interrupt Handling * polling: 一個一個確認對方 * vectored: 讓對方來中斷自己 ## Ch2 * system call: API * 安全、簡便 vs 效率 ## Ch3 * Process 程序 * text (program code) * data (global data) * heap * stack * PCB (Process Control Block) * State * new: 創建中,現在幾乎都可省略 * ready: 準備好執行(以前會避免ready的process太多) * waiting: 中斷保留,PCB的program counter紀錄執行位置 * thread 執行緒 * 一個Process中,共用text與data,但各自有stack和heap * Scheduling * Long-term scheduler * 每幾秒每幾分鐘執行一次,只能服務很少數量的程序,棄用 * degree of multiprogramming * Short-term scheduler * 以milliseconds為單位 * Medium-term scheduler * swapping: 記憶體滿時可能會將一些Process放進硬碟(PCB還在),未來再重新拿回記憶體中處理(所以記憶體滿載硬碟會開始轉) * Process Creation and Termination * fork: children process會完全複製parent process的所有資訊(新建PID) * zombie: * orphan: parent已終止,沒有wait() * 親屬關係避免記憶體被不知道沒有被清掉的程序佔據 ## Ch5 * IO等待與CPU運算速率不成比例 * Medium Term: swap * CPU Scheduler decision 發生時機 * running to waiting (nonpreemptive) * running to ready (preemptive) * waiting to ready (preemptive) * terminate (nonpreemptive) * SJF 純理論、不實際 * Real-time scheduling * 確保工作不被拖延 * soft real-time: 儘量在指定時間前完成 * hard real-time: 保證在指定時間前完成 * Priority-based scheduling * soft real-time版本支援preemptive * hard real-time必定確保達成死線 * 不行直接不服務 * Rate Montonic * 越頻繁要求的給越高的Prio * Missed Deadlines: $U=\sum_{i=1}{n}\dfrac{C_i}{T_i}\leq n(2^{1/n}......)$ * Earliest Deadline First * 理論最佳解(實際上應該要考慮中斷成本) * Linux Scheduling * 分多層的Prio * 在同一層待太久會自動提升 * nice value: 越高越後面、越低越前 ## Synchronization * 跨程序共用資料的同步問題 * race condition * 多個程序共用一個需要預期順序執行的資源 * 反言之設計共用資源應該要不論如何都具一致性 * CTF: 故意用錯誤的CPU排程時將會暴露出此類程式的漏洞 * Critical Section * 對共用資源讀寫的段落 * 各自保護 * 不能取決於Scheduling policy * Mutual Exclusion 僅限一程序執行 * 不同程序共用同一資源的Critical Section,只有一個能執行 * 進去與出來時必定有一個值來確保 * 如果用共用變數來確保Critical Section,那如何確保共用的變數?(套套邏輯,暫且不論) * Progress 必能選出一個程序 * 只有沒在執行其餘部分的程序能參與競爭 * 寫在entry和exit決定 * 決定必定能在有限時間解決 * Bound Waiting 每個程序必能執行 * 一個程序一定能在有限時間內進入CS * Algo 1 * 當優先權不在手上就一直空loop * 當執行完就將優先權丟給別人 * 不滿足progress: 對面不丟出優先權就永遠進不去 * 不滿足progress也就不滿足BW * Algo 2 * 設自己為是 * 看別人的狀態,是則等待,否則自己執行 * 自己執行完再將自己設為否 * 不滿足progress: 必須確保前兩行一起執行,否則會互相乾瞪眼(還是回到schedule問題) * Peterson's Combined Solution (2 processes) * 把兩個結合,把Algo 1的「turn設為對面」設在Algo 2的第一步與第二部之間 * 如果CPU替指令reorder最佳化可能會出事 * Lock * 作業系統提供的Library * 硬體支援 * Memory barrier * `memory_barrier()` * 告知指令reorder發生 * Hardware Instruction (atomic instruction) * `test_and_set` * 第一個進去的人鎖門 * 有Bound Waiting問題(反覆都是第一個人進去,不夠幸運的選不到) * `compare_and_swap` * Atomic Variables * `increment(&sequence)` * 從解決變數被interrupt解決問題 * 可以用`compare_and_swap`實作 * N processes solution * Bakery Algorithm * 設計抽籤比大小 * (a, b) < (c, d) * a < c OR (a = c AND b < d) * 先比抽號,再比process ID * 可能多個 process 同號,但 process ID 能確保總能輪流 * `test_and_set` w/ Bound Waiting * Mutex Lock (mutual exclusion lock) * 軟體工具,檢查開關 * `acquire()` and `release()` * busy waiting: 一直反覆確認Mutex Lock(Spinlock) * 同一個區塊只能有一個,同一個process上鎖與解鎖 * Semaphore * 軟體工具,檢查<=0 * `wait()` and `signal()` * 可以用來控制程序執行順序 * counting * 數值範圍沒有特定限制 * binary * 只有 0 和 1 * 只有一個process * 基本上和 mutex 一樣 * busy waiting * 優化 busy waiting: 給予串接 process 的能力,放置 waiting queue * `sleep()` in `wait()`, `wakeup()` in `signal()` * deadlock: 錯誤設置的 semaphore 加上執行順序導致卡死 * starvation: 無上限的 waiting * Priority 順序被介入 * Priority Inherirance: 把semephore中的優先級提升到與waiting中最高的一個一樣 * 資源的同步,可以有多個 process 進入,可以由不同 process 處理 * Monitor * 高階程式語言結構 * count 變成 private member,需要accessor介面 * 串接entry queue * 解決 dining philosophers problem * `pickup(i)` and `putdown(i)` * 發現自己現在不能動就釋放資源給別人 * **Q: 如何用 Semophore 實作 Monitor?** * **Q: 如何用 Monitor 實作 Critical section problem?** * 除非做過,建議跳過 ## Deadlocks * Bridge Crossing Problem * 必須有一方退讓 * 但誰讓? * 大多數OS不處理 * System Model * 使用者 * 資源 * instance * process使用資源的流程 * Request * Use * Release * 用graph來表示 * no cycle: no deadlock * cycle: 進一步分析 * Handling * Prevention * 讓 preevtive 必然發生 * 讓 mutual exclusion 不存在(??? * Hold and Wait 一次只能拿一種東西 * No Preemption(??? * 沒有 circular waiting(??? * Avoidance: 逃開會進入 deadlock 的狀況 * 有更多資訊、紀錄系統狀態 * request 演算法避免unsafe * 管太多 * Deadlock 不發生太浪費資源,發生時糾錯才是現代解法 ## Memory-Management * main memory 是 CPU 唯一可以直接存取的記憶體 * 硬體查表取得資料 * Memory Protection * page: * invalid bit * point to same memory (share) * structure * 4 KB page table -> 4 MB memory * two-level * not enough?(64bit) more level * hash * page number 去 hash * hash 可以辨認資料傳輸間是否被竄改 * hash key 重複就 linked-list * inverted page table * 用一個超級大的page table讓所有process共用 * pid做indentify * 不能sharing ## Virtual-Memory Management * 只管理虛擬(page table)的資訊,不管對應方式或實體位置 * 專注於定址位置 * 不能保證實體記憶體容量確實到虛擬記憶體的量 * 需要仔細控管實體使用量 * 沒有必要的東西就不放到記憶體(不然就放在二級儲存體就好 * 降低I/O,降低記憶體空間,反應變快 * 遇到還沒load的東西? * page table需要重新設計,區分不存在的page與在disk裡的page * lazy swapper 不用就不load、用完就丟出去的swapper * Valid-Invalid Bit * 確認這個page在不在記憶體 * Page Fault * 確認address合法性 * 找不到memory時找出disk位置然後load進frame並存到page table * 如果沒有free frame就要搞一個出來 * cost很高但不能不做(常態的40倍 * 盡量share,新增的page越少越好 * Free-Frame List * 存值的瞬間才清空原本的值 * 可以創造更多free frame * Page Replacement * 挑選一個最不可能再次發生Page Fault的踢掉 * Algorithm * 先列出接下來有哪些page被reference * FIFO: 最短Loading time,常常白做工,某些情況下增加frame反而導致fault rate上升 * Optimal: 最久以後用的踢掉,關鍵是如何預測 ## Mass-Storage * Mass-Storage: disk * logical blocks: 軟體層傳輸最小單位 * disk 排程 * ceek time: 約略就是 seek distance * bandwidth: 傳輸總量 * FCFS: 先來後到 * SSTF: 最短距離,一直有新請求時會導致比較遠區域的請求永遠沒執行到,常見 * SCAN: 選一個方向,觸底折返,讀取時間不平均 * C-SCAN: 單向繞圈 * SCAN系對於重負載系統有用 * C-LOOK: 不到底只到最後一個請求,不到頭只到第一個請求 * 也適合當作預設 * NVM scheduling * 沒有讀取頭 * 一次會讀一個block,可以安排資料儲存位置增加效率 * 要分兩個步驟寫入(垃圾收集管理可用空間) * Detection and Correction * parity bit * CRC * ECC * Management * physical formatting: 切分 disk 的 sector,通常是 512 bytes * Partition: OS 的分割 * root partition: dual boot * 在 boot 時 mounted * logical formatting: 文件系統 * OS 在硬碟有獨立區塊 * Swap-Space Management * DRAM不夠用時用Disk來頂 * 一直複寫一份到disk裡以防萬一? * 真的發生不夠用時才寫到disk * 整個process放到disk * 動態區塊放到disk * 存取 * 本機存取可用光纖技術 * NAS * 網路上的檔案系統 * iSCSI協定 * Cloud * 不開完整檔案介面,需要藉由API * Storage Array * 擴充容量 * 擴充效率 * 儲存平行化 * 額外controller * Storage Area Network 常用 * RAID * 原本沒有打算提除錯能力而只有偵錯 * Solaris(Suns) 提出 ZFS 除錯格式 * 多個disk(多餘的空間)換得可靠性 * 擴充冗餘 * level 0: 沒有可靠性,就只是把資料平行分配到多個硬碟 * level 1: mirror,備份,兩倍寫入時間(要寫兩次),兩倍的空間要求 * 0+1 or 1+0 * level 2: 資料做 ECC encode,如 7,4 hamming code * level 3: sector 做 single parity bit * level 4: 把 parity 放在專門的 disk,回復比較慢,但有機會比較強 * level 5: 把 parity 平均放在各個 disk(不會放自己 disk 的驗證) * level 6: 兩組 parity chk,要多兩顆 disk * Snapshot: 備份目前工作狀態 ## I/O Systems * 種類繁多差異大 * 必然具備的通用訊號 * port: 硬體連接節點 * bus: 資料傳輸協定 * controller: 控制以上兩項,可能有自己的處理器與記憶體 * 光纖: 速度快但控制複雜,需要 host-bus adapter, HBA * 設備通常有四個 1-4 bytes 暫存器 data-in, data-out, status, control * polling: host 週期性向 device 主動要資料 * 讀取 device 暫存器 * 下對應指令 * 將 ready bit設為1 * controller設定busy bit * controller清除busy bit, errorbut, commend-ready bit * CPU排程不知什麼時候可以切回來 * Interrupts: 由 device 告知 CPU 工作完成 * Mask概念遮蔽特定中斷 * Kernel IO * Scheduling * Buffering: device傳輸資料存至記憶體緩衝 ## CH15 * NFS * 每層資料夾都要做遠端查詢 * 讀寫做buffer與cache,改動一次寫入遠端 --- ## 虛擬化 * qemu 架構(軟體) * 幫助虛擬化開源套件 * 類 VM,模擬 PCB * 把服務拆成不同 container(docker) * 不需要資源時可以回收部署 * 韌體模擬的問題 * 靜態分析誤報率高 * 只有虛擬,沒有真正的硬體設備,如何讀取不存在的東西 * 攻擊類型 * OWASP * 已存在於密碼表的密碼、預設密碼 * 非必要服務 * 未關閉的API(如Debug API) * 缺乏更新 * 不安全或過時組件 * 資料庫 * 資料加密 * 實體設備埠 * firmadyne * 動態模擬分析韌體 * 集成類工具 * 存取外圍設備時回傳 0 * 如何修改可以更像是真實設備? * 只能使用他提供的kernal,沒辦法把真實環境的kernal丟進去用 * 實作流程 * 使用爬蟲/FTP取得韌體檔案 * 用 binwalk 提取 * 使用 firmadyne