---
# System prepended metadata

title: 清大 108 硬體
tags: ['108', 硬體, NTHU]

---

# 清大 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$