Skip to content
yucing edited this page Jun 16, 2022 · 16 revisions

第九週筆記

參考資料

系統程設

作業系統的五大功能模組

  • 行程管理
  • 讓程式可以執行
  • 記憶體管理
  • 記憶體配置環境
  • 不會被其他程式干擾
  • 輸出入系統
  • 系統函數
  • 檔案系統
  • 輸出入系統的延伸
  • 針對永久儲存裝置
  • 使用者介面

行程

  1. 程式設計師寫完一個程式
  2. 產生執行檔
  3. 由使用者介面執行
  4. 執行檔備載入記憶體執行

行程的行為模式

  • 分為兩種
  1. 使用 CPU
  2. 使用 I/O (Input/Output)

多工(Multtasking)

  • 具備同時執行多個程式的能力

協同式多工

  • 偽多工系統
  • 任一程式當機,都會導致系統失效

排程

基本排程

  • 先做排程 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)

循環分時排程 (Round-Robin Scheduling)

重要性

  • 最常用的排程方法

方法

  • 先分配一個時間分段 T (Time Slice), 才切換到該行程
  • 切換到行程前, 先設定 T 時間後應發生時間中斷, 才將 CPU 控制權交給行程
  • T 用盡後, 中斷, 排程系統取回 CPU 控制權, 然後切換到下一個行程, 防止行程霸佔 CPU 過久

內文切換

  • 排成器選定下一行程後, 需進行「內文切換」, 將 CPU 交給該行程執行
  • 將行程從 CPU 中取出, 轉換另一行程進入 CPU 執行的動作
  • 需進行大量暫存器的存取, 以組合語言撰寫
  • 作業系統被移植到另一平台時, 內文切換的程式通常必須完全重寫

行程的資料共享方式

  • 每一行程/程式, 有可能會分裂許多行程
  • 每個程式都是獨立執行, 不共享資料
  • 希望行程間能共享某些資料, 有兩種方法 :
  1. 透過作業系統的通訊機制互相溝通
  2. 執行緒(Thread) 的機制取代行程

執行緒 Thread

  • 輕量級行程(Light Weight Process)
  • 共用記憶體空間與資源
  • 切換時保存在暫存器, 切換動作快速

行程 v.s 執行緒

~ 行程 執行緒
記憶體空間 記憶體空間完全獨立 共用記憶體空間
映射表 行程切換時須更換映射表 行程切換時不需更換映射表
切換動作 耗時 迅速

競爭狀況 v.s 臨界區間

  • 兩執行緒 P1, P2 同時修改某變數 v1 的值 x1, x2, 修改後 v1 的值可能為 x1, 也可能為 x2, 或是其他值, 這種不確定的情形稱為「競爭狀況」, 修改共用變數的程式區段為「臨界區間」

行程同步機制

  • 避免兩程式同時進入臨界區間的可能性, 防止競爭情況發生
  • 方法 :
  1. 禁止中斷
  2. 支援同步的硬體
  3. 利用「號誌」等「鎖定機制」

記憶體管理

  • 提高電腦效率
  • 保護電腦不受駭客或惡意程式的入侵

C 語言中的記憶體分配與回收

  • 分配 : malloc()
  • 回收 : free()

記憶體分配策略

  1. First Fit 最先符合法
  • 從「串列開頭」開始尋找, 將找到的第一個足夠大的區塊分配給程式
  1. Next-Fit 下一個符合法
  • 使用「環狀串列」結構, 每次都從上一個搜尋停止點開始搜尋, 然後將找到的第一個足夠大的區塊分配給程式
  1. Best-Fit 最佳符合法
  • 「搜尋整個串列」一遍, 將大小最接近的可用區塊分配給程式
  1. Worst-Fit 最差符合法
  • 將大小最大的區塊分配給程式, 以留下較大的剩餘區塊給其他程式

記憶體不足

  • 使用 malloc() 分配記憶體時, 如果無法找到足夠大的可用區塊, 就會產生記憶體空間不足的情況
  • 處理方法 :
  1. 直接回報錯誤
  2. 處理記憶體不足的情況
  • 記憶體聚集法 Memory Compaction
  • 垃圾蒐集法 Garbage Collection Algorithm

處理記憶體不足

記憶體聚集法 Memory Compaction

  • 將記憶體重新搬動, 將分散的小型可用區塊聚集為大型可用區塊
  • 需消耗大量時間搬移記憶體

垃圾蒐集法 Garbage Collection Algorithm

  • 用程式自動回收記憶體
  • 不須程式主動釋放記憶體

記憶體管理單元 MMU

  • 記憶體除了儲存資料, 還可用來儲存程式, 程式在被啟動之前, 必須先載入記憶體中
  • 管理記憶體時,通常需要硬體的記憶體管理單元 (MMU) 配合, 才能有效管理記憶體
  • 常見的 MMU 硬體 :
  • 重定位暫存器
  • 基底界線暫存器
  • 分段表
  • 分頁表

輸出入系統

  • 透過系統函式庫, 規定輸出入介面, 以便驅動程式掛載到作業系統中

檔案系統

  • 主要核心概念為「檔案」與「目錄」
  • 利用輸出入驅動程式建構出檔案系統
  • 簡化輸出入動作

windows 檔案系統 v.s Linux 檔案系統

~ windows 檔案系統 Linux 檔案系統
結構 樹狀結構 格狀
連結檔案 利用捷徑(Shortcut) 利用硬式連結 (Hard Link)

磁區結構

磁區分配

  • 以固定大小的磁區為單位, 進行區塊分配動作

磁區的組織方式

  • 需使用某種資料結構
  • 兩種常見的區塊管理結構
  1. 鏈結串列法 Linked List
  2. 位元映射法 Bit mapped

區塊管理結構

鏈結串列法 Linked List

  • 在可用磁區中, 記錄下一個可用磁區的代號, 將可用磁區一個一個串接起來
  • 效率很差
  • 採用磁區群組模式, 非單一磁區的鏈結方式

位元映射法 Bit mapped

  • 將整個磁碟的映射位元儲存在數個磁區中
  • 效用高

驅動程式

  • 控制輸出入裝置
  • 將函數指標傳遞給作業系統, 讓作業系統記住函數
  • 作業系統會在有該裝置的輸出入需求時, 呼叫函數
  • 函數通常稱為「反向呼叫函數 Call Back Function」

Linux 系統架構

  • 分為硬體、核心、函式庫、使用者程式等四層

硬體層

  • 硬體裝置的驅動程式

核心層

  • 由 Linus Torvalds 維護的 Linux 作業系統

函式庫層

  • 對作業系統的功能封裝後,提供給使用者程式呼叫使用

使用者程式層

  • 一般的應用程式

Linux 行程管理

行程管理

  • 使用 fork() 分岔出新行程
  • 使用 execvp(prog, arg_list) 將新行程替換為另一個程式

執行緒

  • 使用 pthread 函式庫
  • 使用 pthread_create() 建立新執行緒
  • 使用 sleep() 暫停一段時間

Linux 記憶體管理

分段式分頁

  • 在 IA32(x86) 處理器上設計
  • IA32 具有分段式分頁的 MMU 單元, 包含 LDT 與 GDT 等兩個分段表

分段表

  1. LDT 分段表 Local Descriptor Table
  • 一般行程用
  • 紀載個行程的分段表,以及行程的狀態段 (Task State Segment : TSS)
  1. GDT 分段表 Global Descriptor Table
  • 包含各行程共享片段, 作業系統用
  • 核心分頁
  • 紀載 LDT 分段表的起始點, TSS 起始點, 各核心分段的起點