115 中正資工所硬體考點分析
115 年起不分組,題型全面改成申論。第 1 題一題 30 分要對同一組位址跑三種快取,第 7 題要證明讀寫自旋鎖的互斥性。
題型與配分
科目名稱:計算機系統,系所組別「資訊工程學系」(115 年起不再分甲乙組),第 4 節,全卷 100 分、3 頁、7 大題。
| 題號 | 配分 | 主題 |
|---|---|---|
| 1 | 30% | 同一組位址跑三種快取組態 |
| 2 | 5% | 主記憶體變大時快取容量要不要跟著變 |
| 3 | 5% | 深管線的時脈率反推 |
| 4 | 10% | big.LITTLE 的平均功耗 |
| 5 | 10% | I/O-bound 程序的排程與 MLFQ |
| 6 | 10% | Copy-on-Write 的 PTE 設定與頁錯誤辨別 |
| 7 | 30% | 證明讀寫自旋鎖的互斥性與並行性 |
115 年是中正硬體十年裡變動最大的一年:
- 系所組別從「資訊工程學系-甲組」變成「資訊工程學系」——115 年起不再分組(與中正數學同步)
- 題型從「單選+多選+填空」全面改回純申論,而且第 1 題與第 7 題各佔 30 分
- 首度出現「證明題」(第 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 為什麼選這個數字也值得在答案裡說明。
這份考卷的難點
- 第 7 題是中正硬體十年唯一一次的「證明題」,而且佔 30 分。 要用原子操作的回傳值語意推導出互斥與並行兩個性質,而不是背誦。證明要有結構:定義狀態 → 列出成功條件 → 逐一推論,只寫直覺說明拿不到滿分。
- 第 1 題要對同一組位址跑三次完整追蹤。 位址是刻意設計過的,三種組態的結果差異就是這題要考的重點,追蹤時要小心 LRU 順序與同區塊命中。
- 第 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 論述)各考一次
- 中正十年無倒扣,所有題目都要作答