考點分析 / 中正 / 115

115 中正資工所硬體考點分析

115 年起不分組,題型全面改成申論。第 1 題一題 30 分要對同一組位址跑三種快取,第 7 題要證明讀寫自旋鎖的互斥性。

題型與配分

科目名稱:計算機系統,系所組別「資訊工程學系」(115 年起不再分甲乙組),第 4 節,全卷 100 分、3 頁、7 大題。

題號配分主題
130%同一組位址跑三種快取組態
25%主記憶體變大時快取容量要不要跟著變
35%深管線的時脈率反推
410%big.LITTLE 的平均功耗
510%I/O-bound 程序的排程與 MLFQ
610%Copy-on-Write 的 PTE 設定與頁錯誤辨別
730%證明讀寫自旋鎖的互斥性與並行性

115 年是中正硬體十年裡變動最大的一年:

  1. 系所組別從「資訊工程學系-甲組」變成「資訊工程學系」——115 年起不再分組(與中正數學同步)
  2. 題型從「單選+多選+填空」全面改回純申論,而且第 1 題與第 7 題各佔 30 分
  3. 首度出現「證明題」(第 7 題要證明自旋鎖的正確性)

OS 與計組的比重:計組 50%(第 1、2、3、4 題)、OS 50%(第 5、6、7 題)。

第 1 題:三種快取組態的命中失誤追蹤(30%)

32-bit 位元組定址、總容量 4 KB、區塊 16 bytes,比較三種組態(總容量與區塊大小相同、只有放置策略不同):(1) 直接對映、(2) 4-way 組相聯、(3) 全關聯。關聯式快取用 LRU,寫入採 write-back + write-allocate,快取初始為空。

十次存取(R = 讀、W = 寫): R 0x12345678、R 0x1234567C、W 0x12345670、R 0x12346678、R 0x12347678、W 0x12348678、R 0x12345674、R 0x12349678、R 0x1234667C、W 0x1234867C

要對三種組態各報出總命中數與失誤數。

  • 先算三種組態各自的 offset/index/tag 位元數,再把十個位址拆開
  • 這組位址是刻意挑過的:拆完 index 就會看出它們之間的關係,這正是題目要比較三種放置策略的用意
  • 同一個 16-byte 區塊內的存取要特別留意
  • write-allocate 的意思是寫入失誤也會把區塊搬進快取,寫入不能當成直接跳過

第 2 題:主記憶體變大時快取要不要變(5%)

主記憶體從 4 GB 增加到 16 GB 時,是否「必須」把快取從 4 KB 加大才能讓系統正確運作?(回答 Increase/Decrease/No Change Required)

關鍵字是「必須」與「正確運作」:題目問的是功能正確性,不是效能。要想清楚主記憶體變大會改變快取的哪個欄位。

第 3 題:深管線的時脈率反推(5%)

  • 電腦 A:5 級管線、CPI 1.0、2 GHz,程式跑 10 秒
  • 電腦 B:10 級管線、CPI 1.2,目標 6 秒,指令數相同

求 B 需要的時脈率。 考 CPU 效能方程式:先從 A 的資料求出指令數,再代入 B 的條件反推。

第 4 題:big.LITTLE 的平均功耗(10%)

  • LITTLE 核心 2 W、big 核心 8 W,非活躍時功耗可忽略,同時只有一個核心活躍
  • 程式全部在 LITTLE 核上跑要 10 秒,其中 30% 的執行時間是效能關鍵程式碼,big 核執行這部分快 4 倍

求把關鍵程式碼放到 big 核上跑時的平均功耗。

  • 考功率、能量、時間三者的關係:平均功耗 = 總能量 ÷ 總時間
  • 陷阱是分母:總時間會因為 big 核跑得快而改變,不能直接拿 10 秒當分母
  • 算完之後可以留意一下兩個比例(功耗倍數與速度倍數)之間的關係,那是這題想讓你看出來的東西

第 5 題:I/O-bound 程序的排程(10%)

  • a|為什麼讓 I/O-bound 程序盡早取得 CPU 對最大化 I/O 吞吐量至關重要。要從 CPU 與 I/O 裝置的重疊運作去論述
  • b|以 MLFQ 為例,說明它如何動態辨識 I/O-bound 程序並調整優先權。要講出 MLFQ 升降級的規則,以及這些規則為什麼剛好能把 I/O-bound 程序篩出來

第 6 題:Copy-on-Write(10%)

  • a|fork() 完成後父子的 PTE 該如何設定。要講到頁框共享、權限位元與核心要額外記錄的資訊
  • b|子程序寫入共享頁觸發頁錯誤時,核心如何區分這是 COW 造成的還是非法存取。只答「檢查是不是 COW 頁」不夠具體,要說明核心是拿什麼資訊來比對的。提示方向:PTE 的權限不是核心唯一保存的權限資訊

第 7 題:讀寫自旋鎖的正確性證明(30%)

卷上給一段用原子操作實作的簡易讀寫自旋鎖:

#define MAXVAL 0x40000000
void init_spinlock(int* lock) { *lock = MAXVAL; }

void writer_lock(int* lock) {
    while (1) {
        int oldVal = atomic_sub(lock, MAXVAL);
        if (oldVal == MAXVAL) return;      // 成功取得
        else atomic_add(lock, MAXVAL);     // 失敗,回滾
    }
}
void reader_lock(int* lock) {
    while (1) {
        int oldVal = atomic_sub(lock, 1);
        if (oldVal > 0) return;            // 成功取得
        else atomic_add(lock, 1);          // 失敗,回滾
    }
}
void reader_unlock(int* lock)  { atomic_add(lock, 1); }
void writer_unlock(int* lock)  { atomic_add(lock, MAXVAL); }

(atomic_sub(addr, val) 原子地把 *addr 減去 val 並回傳「減之前」的舊值。)

  • a|證明寫者與讀者之間的互斥
  • b|證明多個讀者可以同時進入臨界區

證明的切入點是「鎖的值」代表什麼狀態:要先講清楚鎖的值在各種情況下(無人持有、有讀者持有、有寫者持有)分別是多少,再用 atomic_sub 回傳舊值的語意推導每個執行緒成功或失敗的條件。互斥要兩個方向都證(寫者持有時讀者進不來、讀者持有時寫者進不來)。MAXVAL 為什麼選這個數字也值得在答案裡說明。

這份考卷的難點

  1. 第 7 題是中正硬體十年唯一一次的「證明題」,而且佔 30 分。 要用原子操作的回傳值語意推導出互斥與並行兩個性質,而不是背誦。證明要有結構:定義狀態 → 列出成功條件 → 逐一推論,只寫直覺說明拿不到滿分。
  2. 第 1 題要對同一組位址跑三次完整追蹤。 位址是刻意設計過的,三種組態的結果差異就是這題要考的重點,追蹤時要小心 LRU 順序與同區塊命中。
  3. 第 4 題要分清「功率」與「能量」。 平均功耗與總能量是兩個不同的問法,混在一起就會算錯。
  4. 第 6(b) 題要講到具體的機制。 只答「檢查是不是 COW 頁」不夠,要說明核心是怎麼知道的。

準備建議

  • 115 年起中正不分組、題型改回純申論。116 年若延續,準備方向要從「刷選擇題」轉回「完整論述與推導」
  • 同一組位址跑多種快取組態(第 1 題)是中正的固定題型(111 年第 6 題、113 年第 4 題、115 年第 1 題連三年)
  • big.LITTLE 的能耗計算(第 4 題):能量 = 功率 × 時間,要分清平均功率與總能量
  • COW 的實作細節(第 6 題):fork 後頁表怎麼設、寫入時怎麼處理,要能講到核心資料結構的層次
  • 同步原語的正確性證明(第 7 題)是新題型。要練習用「原子操作的回傳值代表什麼狀態」來推導互斥與並行
  • MLFQ 的升降級規則(第 5 題)。中正在 108 年(Solaris 分派表)與 115 年(MLFQ 論述)各考一次
  • 中正十年無倒扣,所有題目都要作答

想看完整逐題詳解?

國立中正大學 108–115 全年度完整詳解共 222 頁,逐題推導。

購買 · NT$ 850 先看試閱

其他年度與考科