歡迎來到系統軟件(A Level 9618)的世界

哈囉,未來的電腦科學家!在本章「系統軟件 (System Software)」中,我們將揭開電腦運作背後的神秘面紗,一探其核心機制。

我們通常會想到各種應用程式(即應用軟件),但如果沒有強大的系統軟件在背後運籌帷幄,這些程式根本無法執行。在 A Level 階段,我們將深入探討作業系統 (Operating System, OS) 的機制,以及語言翻譯器 (Language Translators) 所使用的關鍵程序。

如果「分頁 (paging)」或「詞法分析 (lexical analysis)」聽起來很複雜,請不用擔心——我們將會運用簡單的類比來為你拆解,確保你能完全掌握這些考試必備的核心知識!

16.1 作業系統 (OS) 的用途

什麼是作業系統?

作業系統 (OS) 是管理所有電腦資源(包括 CPU、記憶體、檔案及周邊設備)的主程式。它充當了硬件與使用者/應用程式之間的橋樑。

OS 功能 1:極大化資源利用並隱藏複雜性

作業系統的首要任務是極大化資源的使用效率(例如 CPU 時間和記憶體空間)。

  • 使用者介面 (User Interface): 作業系統提供使用者介面(如 Windows 或 macOS),讓你透過簡單的圖示和選單與電腦互動。此介面隱藏了硬件底層的複雜性
  • 類比: 想像你在開車。你只需要使用方向盤和油門剎車(介面),而不需要了解引擎內部複雜的物理運作或齒輪如何嚙合(隱藏的硬件複雜性)。
OS 功能 2:處理程序管理 (多工處理)

當你同時開啟多個程式(例如:串流音樂、撰寫論文以及執行計算)時,作業系統會透過處理程序管理 (process management) 來協調這些同時進行的任務。

處理程序 (process) 其實就是指目前正在執行的程式。作業系統利用多工處理 (multi-tasking) 讓所有程序看起來像是在同時執行,但實際上 CPU 是以極高的速度在這些程序之間快速切換。

處理程序狀態

一個處理程序通常處於以下三種基本狀態之一:

  1. 執行中 (Running): 處理程序目前正在 CPU 上執行指令。(每個 CPU 核心在任何瞬間只能有一個處理程序在真正執行)。
  2. 就緒 (Ready): 處理程序已準備好執行,但正在等待 CPU 可用。
  3. 封鎖 (Blocked): 處理程序無法繼續,因為它正在等待外部事件發生(例如:等待鍵盤輸入或從硬碟讀取資料)。

小技巧: 記住 R-R-B (Running, Ready, Blocked)。

排程 (Scheduling) 的必要性

為了管理哪個程序可以優先使用 CPU,作業系統會使用排程器 (scheduler)排程常式 (scheduling routines)。排程的目標通常是極大化輸送量 (throughput)、確保公平性以及減少回應時間。

你需要了解不同排程常式的功能與優點:

  • 循環排程 (Round Robin, RR): 每個處理程序在 CPU 上獲得一個固定的短時間片段(時間片 quantum)。如果時間片用完,該程序就會被移到佇列末端。
    • 優點: 對互動式使用者而言,具備極佳的公平性和回應時間。
  • 最短作業優先 (Shortest Job First, SJF): 預計執行時間最短的程序會被優先執行。
    • 優點: 極大化輸送量(能以最快速度完成最多工作)。
  • 先來先服務 (First Come First Served, FCFS): 先要求 CPU 的程序會優先獲得處理。
    • 優點: 易於實作;非常公平(沒有飢餓問題)。
  • 最短剩餘時間 (Shortest Remaining Time, SRT): SJF 的搶佔式版本。如果有新工作到達,且其總時間比目前執行中的剩餘時間短,新工作會接管 CPU。
    • 優點: 比 SJF 具有更好的輸送量。
OS 功能 3:核心與中斷

核心 (Kernel) 是作業系統的核心組件。當電腦開機時,它會被優先載入,並處理最關鍵的底層任務,例如管理記憶體和處理中斷。

核心充當中斷處理器 (interrupt handler)中斷 (interrupt) 是一種傳送給 CPU 的訊號,會暫時停止目前執行的處理程序,以便 CPU 處理高優先級事件(例如磁碟錯誤、I/O 完成或計時器訊號)。

  • 當中斷發生時,核心會儲存目前處理程序的狀態(使用暫存器,如 PC 和 ACC)。
  • 核心識別中斷類型。
  • 執行相應的中斷服務常式 (Interrupt Service Routine, ISR)
  • ISR 完成後,核心會恢復原始處理程序的狀態,讓程序從中斷處繼續執行。
OS 功能 4:虛擬記憶體、分頁與分段

虛擬記憶體 (Virtual Memory) 是一種技術,作業系統利用次級儲存裝置(硬碟)來模擬額外的 RAM,從而允許執行大於實體 RAM 容量的程式。

作業系統用來管理記憶體(特別是虛擬記憶體)的兩種主要方法是分頁 (Paging) 和分段 (Segmentation):


分頁 (Paging)
  • 概念: 主記憶體 (RAM) 被劃分為固定大小的區塊,稱為頁框 (page frames)。程式則被劃分為固定大小的區塊,稱為頁 (pages)
  • 當程式需要記憶體時,頁面會在硬碟和 RAM 之間進行交換。
分段 (Segmentation)
  • 概念: 程式被劃分為邏輯上、大小不一的區塊,稱為段 (segments)(例如:主程式碼段、資料段、副程式段)。
  • 段會在硬碟和 RAM 之間進行交換。
  • 差異: 頁面是實體且固定大小的;段則是邏輯且大小可變的。

磁碟顛簸 (Disk Thrashing)

這是一個關鍵術語!如果作業系統花費在 RAM 和硬碟之間交換頁/段的時間,多過於執行程式指令的時間,這種情況稱為磁碟顛簸 (disk thrashing)

  • 結果: 系統效能急劇下降,因為 CPU 不斷在等待較慢的磁碟存取。
  • 頁面如何替換: 若作業系統需要空間放入新頁面,它必須替換掉現有的頁面,通常會選擇最近最少使用的頁面(Least Recently Used, LRU),以避免將經常需要的頁面交換出去。
16.1 重點總結

A-Level 的重點在於多工處理與記憶體管理的「機制」。請記住三種程序狀態 (R-R-B) 以及分頁(固定、實體)與分段(變動、邏輯)之間的核心差異。

16.2 翻譯軟件

原始碼(由人類以高階語言如 Python 編寫)必須轉換為機器碼 (machine code)(二進制指令),CPU 才能執行。這正是翻譯軟件的工作。

回顧:組譯器、編譯器與直譯器

  • 組譯器 (Assembler):組合語言 (assembly language)(低階、人類可讀的指令)轉換為機器碼。
  • 編譯器 (Compiler): 在執行之前將整個高階程式轉換為機器碼。產生一個可執行檔。(AS Level 內容,但這是必備基礎)。
  • 直譯器 (Interpreter): 逐行翻譯並執行高階程式。它*不會*產生獨立的翻譯版本。

你知道嗎? 像 Java(控制台模式)等語言使用了混合方式:它們先被編譯成中間位元組碼 (bytecode),然後再由 Java 虛擬機 (JVM) 進行直譯。這就是為什麼有些程式被描述為部分編譯、部分直譯的原因。

編譯過程:四個階段 (A-Level 深度)

當程式進行編譯時,會經歷幾個不同的階段,以確保程式的正確性與效率。

階段 1:詞法分析 (Lexical Analysis) - 掃描器
  • 目的: 將原始碼拆解成有意義的單元,稱為標記 (tokens)
  • 移除註解和空白字元。
  • 識別關鍵字(如 IF, WHILE)、識別字(變數名稱)、常數和運算子。
  • 標記會儲存在符號表 (symbol table) 中。
  • 類比: 閱讀一句話並識別出每個詞彙,並以空格將它們分隔開來。
階段 2:語法分析 (Syntax Analysis) - 解析器
  • 目的: 根據語言的語法規則檢查程式結構。
  • 利用階段 1 產生的標記來建立剖析樹 (parse tree)(或抽象語法樹)。
  • 如果發現錯誤(例如缺少分號或括號),編譯器會停止並報告語法錯誤 (syntax error)
  • 類比: 檢查句子的語法結構是否正確(例如:「貓坐在墊子上」正確;「坐在貓墊子」則為語法錯誤)。
階段 3:程式碼生成 (Code Generation)
  • 目的: 若語法正確,編譯器會將剖析樹轉換為中間程式碼,最後轉換為目標機器碼(或組合語言)。
階段 4:最佳化 (Optimisation)
  • 目的: 檢查產生的機器碼,使其執行速度更快或佔用更少記憶體(即提升效率)。
  • 範例: 如果某個變數被賦值後從未被使用,最佳化器可能會刪除該行程式碼。

表達語言語法

為了進行語法分析,編譯器需要精確的規則來描述有效的程式長什麼樣子。這些規則就是語言的語法,並透過正式方法來表示:

巴科斯範式 (Backus-Naur Form, BNF) 記號法

BNF 是一種後設語言(用來描述另一種語言的語言),用於表達程式語言的語法。

  • 它使用如 ::=(定義為)、|(或)以及角括號 < >(用於非終端符號,即需要進一步定義的元素)。
  • 範例: <digit> ::= 0 | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9
語法圖 (Syntax Diagrams)

語法圖是語法規則的圖形表示。它們就像流程圖一樣,展示了建構語言有效結構(如有效的識別字或迴圈結構)時必須遵循的路徑。

  • 優點: 對人類而言,它們通常比 BNF 更易於閱讀和遵循。

逆波蘭表示法 (Reverse Polish Notation, RPN)

在評估數學運算式時,電腦傾向使用一種無需括號和運算子優先級(即 BODMAS/BIDMAS 規則)的方法。這種方法就是逆波蘭表示法 (RPN),也稱為後序表示法 (Postfix notation)。

在 RPN 中,運算子位於運算元(數字)之後。

  • 標準 (中序 Infix): \(10 + 5\)
  • RPN (後序 Postfix): \(10 \ 5 \ +\)

RPN 如何評估 (使用堆疊 Stack):

RPN 運算式是使用堆疊 (stack)(一種後進先出 LIFO 的資料結構)來進行評估。

  1. 從左到右掃描運算式。
  2. 如果項目是數字(運算元),將其壓入堆疊。
  3. 如果項目是運算子,從堆疊中彈出所需數量的運算元(通常為兩個),進行運算,並將結果壓回堆疊中。

範例演練: 評估 \(5 \ 3 \ + \ 2 \times\)

步驟 1: 壓入 5。堆疊:[5]
步驟 2: 壓入 3。堆疊:[5, 3]
步驟 3: 運算子 '+'。彈出 3 和 5。計算 \(5 + 3 = 8\)。壓入 8。堆疊:[8]
步驟 4: 壓入 2。堆疊:[8, 2]
步驟 5: 運算子 '\(\times\)'。彈出 2 和 8。計算 \(8 \times 2 = 16\)。壓入 16。堆疊:[16]
結果: 16

優點: 運算式完全按照閱讀順序進行評估,這簡化了編譯器內部計算所需的程式邏輯。

16.2 重點總結

記住編譯的順序(詞法分析 -> 語法分析 -> 程式碼生成 -> 最佳化)。理解 RPN 如何利用堆疊來評估運算式而無需括號,這對於電腦的高效處理至關重要。