110 台大資工所硬體考點分析
答案必須抄進卷首指定的表格、寫在表格外一律不計分。OS 段佔前 5 題 50 分,計結段的偽共享與 forwarding 訊號值最難。
題型與配分
科目:計算機結構與作業系統(B),題號 396、節次 2,全卷 100 分、6 頁、8 大題。試題隨卷繳回。
| 區段 | 題號 | 配分 | 主題 |
|---|---|---|---|
| 作業系統 | 1–5 | 50%(各 10 分) | OS 架構分層、程序記憶體佈局、排程、I/O 緩衝、信號 |
| 計算機結構 | 6–8 | 50%(20+25+5) | 快取一致性與偽共享、RISC-V 管線、綜合判斷 |
這一年的作答規定是台大硬體十年裡最嚴格的:
- 只有答案卷「非選擇題作答區」的第一頁計分,其餘全部視為草稿
- 必須把卷首的表格完整抄到第一頁,不在表格內的內容一律視為計算過程、不計分
- 表格裡有多格標著「此處不作答」——抄錯格位等於作廢
也就是說,這一年只填答案不寫過程,而且填錯位置就沒分。這與 106–109 的「只寫答案不給分」完全相反。
第 8 題明訂「全對才給分」,是全卷唯一有此規定的題目。
作業系統考點(1–5,50 分)
- 第 1 題(10%)|OS 架構分層:卷上給一張圖,四個虛線框 A(應用層)、B(系統服務層)、C(核心層)、D(硬體層)。要判斷:
- (a) 2%|MS-DOS(單體式)的記憶體管理服務在哪一層
- (b) 3%|Linux(分層式)的標準 I/O 函式庫在哪一層
- (c) 2%|容器(虛擬化)的排程服務在哪一層
- (d) 3%|Mach/QNX(微核心)的裝置驅動程式在哪一層
- 四小題對應四種 OS 架構,要清楚每種架構把服務放在使用者空間還是核心空間。(c) 的關鍵是容器與 VM 在「有沒有自己的核心」上的差別
- 第 2 題(10%)|程序的四種記憶體脈絡在圖上的位置:stack segment、text segment、未初始化資料段(BSS)、free space。圖上從
0xFFFFFFFF的環境變數與引數往下排。要背熟程序位址空間各區段由高到低的順序 - 第 3 題(10%)|五個程序、五種排程演算法,全部問「PID 5 的完成時間」。給 PID、優先權、到達時間、CPU burst、I/O burst(I/O 發生在不同裝置上,且總是在第一個時間單位之後才開始):
- (a) 2%|RR,量子 3
- (b) 2%|非搶占優先權(數字越小優先權越高)
- (c) 2%|搶占式 SJF
- (d) 2%|搶占式 LJF,且 PID 5 改成在 time 16 到達
- (e) 2%|搶占式 LJF,且 PID 5 的 CPU burst 改成 8
- 五個小問要畫五張甘特圖,而且每張的參數都不同。有 I/O burst 介入,程序會離開再回來,是全卷最耗時的一題。「I/O 在第一個時間單位之後才開始」這個條件很容易漏看
- 第 4 題(10%)|I/O 緩衝模型的效能比較:基準線是「無緩衝 I/O、4 KB 緩衝區、不做磁碟同步、用
write()」。五個小問各用 (A) 較小/(B) 較大/(C) 相近 回答: - (a) 無緩衝 + 4 KB +
fsync()的 clock time - (b) 無緩衝 + 8 KB +
fsync()的 User CPU time - (c) 緩衝 I/O、行緩衝、
puts()的 System CPU time - (d) 緩衝 I/O、全緩衝、
puts()的 User CPU time - (e) 緩衝 I/O、全緩衝、
puts()+fflush()+fsync()的 System CPU time - 核心觀念是分清 user time、system time、clock time 各自在量什麼:每一小題都要先想「這個改變影響的是函式庫層的工作、系統呼叫的次數,還是等待磁碟的時間」。這是 Stevens《APUE》的經典實驗
- 第 5 題(10%)|看信號處理程式碼回答五個小問(用
sigaction/sigprocmask/sigsuspend): - (a) 2%|程序第一次啟動後會停在哪一行
- (b) 2%|停住時收到 SIGUSR2 會怎樣——要回去看 waitmask 擋掉的是哪一個訊號
- (c) 2%|SIGUSR2 被捕捉時的信號遮罩是什麼——要想清楚
sigsuspend期間的遮罩是哪一個,以及處理常式執行時系統會額外加上什麼 - (d) 2%|SIGINT 被送出並捕捉後從哪一行恢復
- (e) 2%|把三個
sigaction()換成signal()之後,由 SIGINT 恢復後的遮罩是什麼——這一小問考的是signal()與sigaction()的語意差異
計算機結構考點(6–8,50 分)
- 第 6 題(20%)|SMP 的寫入無效化窺探式快取一致性與偽共享:每個處理器有 4 KiB 直接對映、實體定址、16 bytes/line 的 L1。三個整數陣列 A、B、C 連續擺放,A 起始於
0x0000A000。P0 與 P1 各跑for (i=4*Pn; i<4*(Pn+1); i++) C[i]=A[i]+B[i];: - (a) 5%|tag 陣列的總位元數。題目只問 tag 陣列,要不要計入 valid 位元要看題意並加以說明
- (b) 5%|提高關聯度能不能減少這段程式的失誤——要判斷 A、B、C 三個陣列在直接對映下會不會對映到同一組。陣列的起始位址與陣列大小是判斷依據
- (c) 5%|最壞情況會有幾次一致性失誤(c1)、其中幾次是偽共享(c2)。要算出每條 cache line 能放幾個 int,再看兩個處理器負責的索引範圍會不會落進同一條 line
- (d) 5%|改成 32 bytes/line(快取仍 4 KiB)之後的一致性失誤數(d1)與偽共享數(d2)。與 (c) 對照著做:line 變大之後,兩個處理器的資料分佈會怎麼變
- 第 7 題(25%)|RISC-V 五級管線,卷上給電路圖與各邏輯區塊的延遲(I-Mem 280 ps、Register File 180 ps、ALU 200 ps、Control Unit 50 ps…)與 R-type 指令格式,程式碼為
lw x10,100(x5)→add x2,x10,x2→add x2,x2,x4→sub x6,x2,x6: - (a) 10%|哪一級決定時脈週期。要把每一級實際經過的元件延遲加總再比大小,不能只看單一元件
- (b) 5%|第一道
lw在 MEM 級時,ID 級(b1)與 EX 級(b2)分別是哪一道指令(填指令編號)。先檢查lw與緊接的指令之間有沒有需要停頓的相依,停頓會讓後面的指令往後推 - (c) 5%|
sub(#4)在 EX 級時,ForwardA(c1)與 ForwardB(c2)該設什麼值。要知道 forwarding 單元的控制訊號編碼,並判斷兩個來源暫存器各自與前面哪一道指令相依、距離多少 - (d) 5%|
sub的四條控制訊號:RegWrite、MemtoReg、MemRead、MemWrite 各是多少。依 R-type 指令的行為逐一判斷 - 第 8 題(5%,全對才給分)|四個敘述哪些正確:
- (1) MIPS 值較高的處理器效能是不是一定較好
- (2) LRU 是不是已被證明為最佳置換策略——要想清楚「最佳」在置換演算法裡指的是哪一個
- (3) 向量指令對哪一類應用有益
- (4) SMT 如何提高 CPU 使用率——要能說出它與細粒度/粗粒度多執行緒的差別
這份考卷的難點
- 作答規定本身就是陷阱。 必須先花時間把卷首那張含「此處不作答」空格的表格完整抄到答案卷第一頁,抄錯位置或寫到第二頁一律不計分。這是台大硬體十年裡唯一一次只看答案、不看過程。
- 第 6(c)(d) 題的偽共享要真的算 cache line 邊界。 兩個小題用了不同的 cache line 大小,就是要讓你比較兩種情況下資料分佈的差異——偽共享出不出現,完全取決於這條邊界落在哪裡。這組對照是整題的設計核心。
- 第 3 題要畫五張不同參數的甘特圖,而且每個程序都有 I/O burst(會離開 CPU 再回到就緒佇列)。10 分卻要做五次完整模擬,時間成本極高。
- 第 5(e) 題的
signal()對sigaction():兩者在遮罩語意上的差異。這是 APUE 反覆強調但課堂上常被跳過的細節。
準備建議
- 進場先讀作答規定。 台大硬體十年裡,106–109 是「不寫過程只能拿部分分數」,110 年反過來變成「只有表格內的答案計分」。規則每年不同,看錯就全盤皆輸
- 偽共享(false sharing)是台大最愛的一致性考點:要練到能從陣列起始位址、cache line 大小、各處理器負責的索引範圍判斷哪幾條 line 被兩個核心同時寫入
- Forwarding 單元的控制訊號編碼要背(ForwardA/ForwardB 的三種值各代表從哪裡取資料)。113 年也考
- 程序記憶體佈局(第 2 題)是送分題,也常出現在其他學校
- APUE 的兩個經典實驗要讀:I/O 緩衝對 user/system CPU time 的影響(第 4 題)、sigsuspend 與信號遮罩的完整流程(第 5 題)。這兩題合計 20 分,而且課本以外幾乎找不到
- 「全對才給分」的第 8 題四個敘述都是課本正文等級,MIPS 指標與「最佳」置換演算法是兩個固定陷阱