計算機系統導覽練習題 (Practice - Computer Systems Tour)


Question 1 - Bits 與 Context [recall]

在一個系統中,磁碟上的檔案、記憶體中的程式、網路上傳輸的封包,本質上都是一串 bits。
那麼,系統靠什麼區分「同一串 bytes」到底是整數、浮點數、字串還是機器指令?


Question 2 - 編譯系統四階段 [recall]

在 Unix 上執行 gcc -o hello hello.c 後,hello.c 經過四個階段變成可執行檔。
請依序寫出四個階段的名稱、對應的程式,以及各階段的中間檔案副檔名。


Question 3 - Text File 與 Binary File [recall]

編譯過程中會產生 hello.ihello.shello.o 與最終的 hello
哪些是 text file、哪些是 binary file?text file 的定義是什麼?分界發生在哪個階段?


Question 4 - 硬體四大組件與 Word [recall]

一個典型系統的硬體組織由四大類元件構成。
請列出這四大類,並說明 bus 以什麼單位傳輸資料、現今常見的大小為何。


Question 5 - Program Counter [recall]

從按下電源到斷電,CPU 一直在做同一件事。
請說明 PC (program counter) 存放什麼,以及 CPU 反覆執行的基本循環。


Question 6 - OS 三大抽象 [recall]

OS 透過三個基本抽象達成「保護硬體」與「提供簡單一致機制」兩大目的。
請寫出 files、virtual memory、processes 各自抽象化了哪些硬體。


Question 7 - Context Switch 與 Kernel [recall]

單一 CPU 上,shell process 與 hello process 能「並行」執行,靠的是 OS 的 context switching。
(a) context 包含哪些狀態?(b) context switch 的三個步驟?(c) kernel 是一個 process 嗎?


Question 8 - Concurrency 與 Parallelism [recall]

CSAPP 對 concurrency 與 parallelism 給出了明確區分,並指出平行可在三個抽象層次上開發。
請說明兩者差異,並由高到低列出三個平行層次。


Question 9 - Amdahl's Law 基本計算 [application]

某系統中,一段程式佔整體執行時間的 60% (α = 0.6)。
(a) 若把這段程式加速 3 倍 (k = 3),整體 speedup 是多少?
(b) 若加速到無限快 (k → ∞),整體 speedup 上限是多少?


Question 10 - Amdahl's Law 反解 k [application]

系統某部分佔整體執行時間的 90% (α = 0.9)。
若目標是讓整體達到 4× 的 speedup,該部分需要被加速多少倍 (k)?


Question 11 - 判斷編譯階段 [application]

你有一個 C 檔案開頭如下,執行 gcc -o prog prog.c 時發生了一連串轉換:

#include <stdio.h>
#define MAX 100

(a) 上面兩行 directive 由哪個階段的哪個程式處理?處理方式是什麼?
(b) 若 linker 回報 undefined reference to 'printf',表示哪個檔案沒被正確合併?


Question 12 - 為何整體加速遠低於預期 [analysis]

工程師 A 花大量成本把系統中某模組加速了 10 倍 (k = 10),該模組原本佔整體執行時間 50% (α = 0.5),
但實測整體只快了約 1.8 倍,他懷疑量測有誤。
請用 Amdahl's Law 分析:量測合理嗎?若想讓整體達到 3×,繼續優化這個模組是否可行?


Question 13 - Web Server 該用 Threads 還是 Processes [analysis]

你要設計一個需要高並行 (concurrency) 的網路伺服器,每個連線的處理單元都必須讀寫同一份共享的快取資料結構。
從第 1 章對 process 與 thread 的描述分析:應選擇「多 process」還是「單一 process 內多 thread」?給出兩個依據。