# 台大 104 硬體
###### tags: `NTU` `104` `硬體`
1.
A. 不知道
B. 幾個需要考慮的因素:
- context-switch 成本會大幅增加
- system call、interrupt handling 的成本會大幅增加
- 成本、耗電、存取時間
C. 使用函式的程序會受益,理由如下:
在呼叫函式時,callee 為了避免上一層的函式資料被動到,得將暫存器裡的資料存到 stack 裡。問題來了,有些暫存器裡的資料,其實已經用不到了(dead)。存起來只是在浪費時間。
好,那我反過來,讓 caller 去存總可以了吧?問題又來了,caller 也不知道 callee 會用到哪些暫存器,到頭來還是一樣的問題。
解決辦法就是把暫存器分成 caller-saved 和 callee-saved,然後將優先放在 caller-saved register。使用 caller-saved register 不需要事先把原本在裡面的資料存到 stack 去(因為那是上一層函式的工作),而且因為大部份的資料生命週期短,在呼叫其它函式時,未必需要將其保存起來。
以上。
D. 因為 floating point 的計算很慢,在進行浮點數運算時,也會希望能進行其它的整數運算。暫存器全部混在一起,就達不到這個目的了。
2.
A. $1015\times 2^{20}$
B. 0.9375
C. lui
D. "?p"
E. "?p"
:::info
~~究研示顯,endianess 影不響 C string 在記體憶的放擺順序~~
:::
F. a = $2^{127}$, b = $2^{127}$, c = $-2^{127}$
(a+b)+c 會爆掉,a+(b+c) 會 = $2^{127}$
3.
A. backward-taken-forward-not-taken / 2-bit dynamic branch prediction
B.
- C++ 裡有個東西叫 virtual function,存取virtual function 時需要去 vtable 找到該 function 的位置、load 進暫存器裡,然後用 indirect branch 跳過去
- 函式在 return 時,也是用 indirect branch
- 第二個應該更常遇到吧,畢竟不是每種語言都有 virtual function 或類似的機制
C. 像以 vtable 的例子,在地址被 load 進來之前,你什麼也不知道。~~是要預測個洨~~
4.
A. 16
B. 因為 miss-penaly 都一樣所以我猜是...32...吧
5.
A. ??
B. 很難,因為最後要寫入 x[i][j] 時一定會有 cache coherency miss。
6. 只要速度夠快、讓把 process 送進 waiting queue 的成本比等待的成本高,採用 polling 的方法就很合理(想想 spinlock v.s. semaphore)
7.
A. CPU 大部份的時間都花在 context-switch,真正做功的時間比例降低,turnaround time 自然就會被拉長
B. 如此一來資料就不用在快取間搬來搬去的
8.
9.
A. 用 4GB 的記憶體邊打 GTAV 邊開 twitch 直播邊開一堆股票看盤軟體邊開一堆 chrome 分頁在 ptt 上發廢文。
B. 可以,暫止某些 process、降低 multiprogramming degree,可以讓 thrashing 情況改善
C. working-set model 會監測每個 process 的 working-set size,確保整體的記憶體用量不會超標。
D. working-set model 不會讓那些要求過多的 process 執行,理論上是能徹底防止 thrashing?
E. disk I/O 會被佔用,導致其它的 virtual machine disk I/O 效能下降。
10.
A. system-call 成本降低,原本要分很多次的 write,用一個 writev 就可以解決了。像是瀏覽器要發送大量封包時,就可以用 writev 一次寫入多個封包
B. 資料結構跟 API 要設計好,要不然用起來會很麻煩。