forked from ccccourse1/sp110b
-
Notifications
You must be signed in to change notification settings - Fork 0
w9.md
yucing edited this page Jun 16, 2022
·
16 revisions
- 行程管理
- 讓程式可以執行
- 記憶體管理
- 記憶體配置環境
- 不會被其他程式干擾
- 輸出入系統
- 系統函數
- 檔案系統
- 輸出入系統的延伸
- 針對永久儲存裝置
- 使用者介面
- 程式設計師寫完一個程式
- 產生執行檔
- 由使用者介面執行
- 執行檔備載入記憶體執行
- 分為兩種
- 使用 CPU
- 使用 I/O (Input/Output)
- 具備同時執行多個程式的能力
- 偽多工系統
- 任一程式當機,都會導致系統失效
- 先做排程 FCFS (First-Come, First Served)
- 最短工作優先排程 SJF (Shortest Job First)
- 最短剩餘優先排程 SRF (Shortest Remaining)
- 優先權排程 PS (Priority Scheduling)
- 循環分時排程 RR (Round-Robin Scheduling)
- 多層佇列排程 (Multilevel Queue Scheduling)
- 多層反饋佇列排程 (Multilevel Feedback Queue Scheduling)
- 最常用的排程方法
- 先分配一個時間分段 T (Time Slice), 才切換到該行程
- 切換到行程前, 先設定 T 時間後應發生時間中斷, 才將 CPU 控制權交給行程
- T 用盡後, 中斷, 排程系統取回 CPU 控制權, 然後切換到下一個行程, 防止行程霸佔 CPU 過久
- 排成器選定下一行程後, 需進行「內文切換」, 將 CPU 交給該行程執行
- 將行程從 CPU 中取出, 轉換另一行程進入 CPU 執行的動作
- 需進行大量暫存器的存取, 以組合語言撰寫
- 作業系統被移植到另一平台時, 內文切換的程式通常必須完全重寫
- 每一行程/程式, 有可能會分裂許多行程
- 每個程式都是獨立執行, 不共享資料
- 希望行程間能共享某些資料, 有兩種方法 :
- 透過作業系統的通訊機制互相溝通
- 執行緒(Thread) 的機制取代行程
- 輕量級行程(Light Weight Process)
- 共用記憶體空間與資源
- 切換時保存在暫存器, 切換動作快速
~ | 行程 | 執行緒 |
---|---|---|
記憶體空間 | 記憶體空間完全獨立 | 共用記憶體空間 |
映射表 | 行程切換時須更換映射表 | 行程切換時不需更換映射表 |
切換動作 | 耗時 | 迅速 |
- 兩執行緒 P1, P2 同時修改某變數 v1 的值 x1, x2, 修改後 v1 的值可能為 x1, 也可能為 x2, 或是其他值, 這種不確定的情形稱為「競爭狀況」, 修改共用變數的程式區段為「臨界區間」
- 避免兩程式同時進入臨界區間的可能性, 防止競爭情況發生
- 方法 :
- 禁止中斷
- 支援同步的硬體
- 利用「號誌」等「鎖定機制」
- 提高電腦效率
- 保護電腦不受駭客或惡意程式的入侵
- 分配 : malloc()
- 回收 : free()
- First Fit 最先符合法
- 從「串列開頭」開始尋找, 將找到的第一個足夠大的區塊分配給程式
- Next-Fit 下一個符合法
- 使用「環狀串列」結構, 每次都從上一個搜尋停止點開始搜尋, 然後將找到的第一個足夠大的區塊分配給程式
- Best-Fit 最佳符合法
- 「搜尋整個串列」一遍, 將大小最接近的可用區塊分配給程式
- Worst-Fit 最差符合法
- 將大小最大的區塊分配給程式, 以留下較大的剩餘區塊給其他程式
- 使用 malloc() 分配記憶體時, 如果無法找到足夠大的可用區塊, 就會產生記憶體空間不足的情況
- 處理方法 :
- 直接回報錯誤
- 處理記憶體不足的情況
- 記憶體聚集法 Memory Compaction
- 垃圾蒐集法 Garbage Collection Algorithm
- 將記憶體重新搬動, 將分散的小型可用區塊聚集為大型可用區塊
- 需消耗大量時間搬移記憶體
- 用程式自動回收記憶體
- 不須程式主動釋放記憶體
- 記憶體除了儲存資料, 還可用來儲存程式, 程式在被啟動之前, 必須先載入記憶體中
- 管理記憶體時,通常需要硬體的記憶體管理單元 (MMU) 配合, 才能有效管理記憶體
- 常見的 MMU 硬體 :
- 重定位暫存器
- 基底界線暫存器
- 分段表
- 分頁表
- 透過系統函式庫, 規定輸出入介面, 以便驅動程式掛載到作業系統中
- 主要核心概念為「檔案」與「目錄」
- 利用輸出入驅動程式建構出檔案系統
- 簡化輸出入動作
~ | windows 檔案系統 | Linux 檔案系統 |
---|---|---|
結構 | 樹狀結構 | 格狀 |
連結檔案 | 利用捷徑(Shortcut) | 利用硬式連結 (Hard Link) |
- 以固定大小的磁區為單位, 進行區塊分配動作
- 需使用某種資料結構
- 兩種常見的區塊管理結構
- 鏈結串列法 Linked List
- 位元映射法 Bit mapped
- 在可用磁區中, 記錄下一個可用磁區的代號, 將可用磁區一個一個串接起來
- 效率很差
- 採用磁區群組模式, 非單一磁區的鏈結方式
- 將整個磁碟的映射位元儲存在數個磁區中
- 效用高
- 控制輸出入裝置
- 將函數指標傳遞給作業系統, 讓作業系統記住函數
- 作業系統會在有該裝置的輸出入需求時, 呼叫函數
- 函數通常稱為「反向呼叫函數 Call Back Function」
- 分為硬體、核心、函式庫、使用者程式等四層
- 硬體裝置的驅動程式
- 由 Linus Torvalds 維護的 Linux 作業系統
- 對作業系統的功能封裝後,提供給使用者程式呼叫使用
- 一般的應用程式
- 使用 fork() 分岔出新行程
- 使用 execvp(prog, arg_list) 將新行程替換為另一個程式
- 使用 pthread 函式庫
- 使用 pthread_create() 建立新執行緒
- 使用 sleep() 暫停一段時間
- 在 IA32(x86) 處理器上設計
- IA32 具有分段式分頁的 MMU 單元, 包含 LDT 與 GDT 等兩個分段表
- LDT 分段表 Local Descriptor Table
- 一般行程用
- 紀載個行程的分段表,以及行程的狀態段 (Task State Segment : TSS)
- GDT 分段表 Global Descriptor Table
- 包含各行程共享片段, 作業系統用
- 核心分頁
- 紀載 LDT 分段表的起始點, TSS 起始點, 各核心分段的起點