# 清大 108 硬體 ###### tags: `NTHU` `108` `硬體` 1. a. - 從 exception vector 讀取 exception handler 的位址並跳過去 - 保存 General Purpose Register 裡的資料到 stack - 讀取 system call number,查表,然後呼叫對應的 system call - 執行完畢後,將 General Purpose Register 從 stack 讀取回來 - 執行 exception return b. 可以將 system call number 放在暫存器中,或是編進指令裡。RISC-V 採用前者,AArch64 採用後者。 c. system call 是 user 與 kernel 溝通的介面,本質上並不是函式,所以不能用 call/return 2. a. preemptive SJF b. nonpreemptive FCFS / preemptive FCFS 3. a. ``` semaphore L(1); acquire(L) { wait(L); } release(L) { signal(L); } ``` b. ``` semaphore x(0); P1 | P2 ------------|------------ ... |... S1 |wait(x); signal(x); |S2 ``` 4. a. 有 internal 沒 external b. segmentation,優缺點剛好反過來 5. [Coroutine demonstration with setjmp/longjmp (STM32)](https://moosh.im/2020/07/coroutine-demonstration-with-setjmp-longjmp-stm32/) 6. ... 7. a. `result` 可能會被同時存取,發生 race condition b. ```c= void update(int value) { // ... int sum = 0; #pragma omp parallel for shared(result) for (i = 0; i < 1000; i++) { sum += (2 * value * value + 5) * i; } #pragma omp critial result += sum; } ``` 8. - Amdahl's law: 效能的增長,受限於可被加速的部份。 - 根據 Amdahl's law,在改善系統效能時,應該從最大可被加速的部份下手。 9. parameter = $5^2\times 3\times 100=7500$ FP MUL = $7500\times 200\times 200=3\times 10^8$ 而 FP MUL 佔 80%,所以總計算量為 $\frac{3\times 10^8}{0.8}=\frac{3}{8}\times 10^9$ 而 CPO 為 $1\times 0.8+0.8\times 0.15+0.75\times 0.05=0.9575$ total time = $0.9575\times \frac{3}{8}\times 10^9\times \frac{1}{2\times 10^9}=\frac{2.8275}{16}$ :::info 數字好醜...哪裡出錯了? ::: 10. 11. a. ```c= int a[n]; // n is a constant int *p = a; while (p != a + n) { *p = *(p + 1); p++; } ``` b. 3...? 12. ... 13. a. 64KiB b. $\frac{}{}$ data 有 64 bytes,tag 有 48 bits = 6 bytes,還有 valid bit 跟 dirty bit,所以 ratio 為 $\frac{(64+6)\times 8 + 2}{64\times 8}=\frac{281}{256}$ c. smaller 14. a. base: 1 指令:1 * 0.004 * 128=0.512 read: 1 * 0.23 * 0.02 * 128 = 0.5888 write: 1 * 0.12 * 0.02 * 128 = 0.3072 write-through: 1 * 0.12 * 1 = 0.12 加總為 2.528 b. 2 15. a. $\frac{630}{30+\frac{600}{15}}=9$ b. load 被分成 $\frac{120}{2}$ 和 $\frac{480}{13}$,速度會取決於最慢的那個,也就是 $\frac{120}{2}=60$,所以 speed up 為 $\frac{630}{30+60}=7$