# 2025q1 Homework3 (kxo)
contributed by < `HeatCrab` >
{%hackmd NrmQUGbRQWemgwPfhzXj6g %}
## 開發環境
```shell
$ gcc --version
gcc (Ubuntu 13.3.0-6ubuntu2~24.04) 13.3.0
$ lscpu
Architecture: x86_64
CPU op-mode(s): 32-bit, 64-bit
Byte Order: Little Endian
Address sizes: 39 bits physical, 48 bits virtual
CPU(s): 12
On-line CPU(s) list: 0-11
Thread(s) per core: 2
Core(s) per socket: 6
Socket(s): 1
NUMA node(s): 1
Vendor ID: GenuineIntel
CPU family: 6
Model: 151
Model name: 12th Gen Intel(R) Core(TM) i5-12400
Stepping: 5
CPU MHz: 800.000 (根據 CPU(s) scaling MHz: 18% 和 max/min 推算)
CPU max MHz: 4400.0000
CPU min MHz: 800.0000
BogoMIPS: 4992.00
Virtualization: VT-x
L1d cache: 288 KiB
L1i cache: 192 KiB
L2 cache: 7.5 MiB
L3 cache: 18 MiB
NUMA node0 CPU(s): 0-11
```
在作業三的 [Load Average](https://hackmd.io/@sysprog/linux2025-kxo/%2F%40sysprog%2Flinux2025-kxo-a#Load-Average) 說明中提到 Linux 核心計算 load average 的公式是使用指數平滑運算([Exponential smoothing](https://en.wikipedia.org/wiki/Exponential_smoothing))推導而成的。指數平滑運算公式的公式定義如下:$$
S_t = \alpha \times X_t + (1 - \alpha) \times S_{t-1}, where \ 0 < α < 1
$$
但是在作業說明中使用的是:$$
S_t = \alpha \times X_{t-1} + (1 - \alpha) \times S_{t-1}, where \ 0 < α < 1
$$
可以發現兩者在定義實際值 $X$ 的時間點不同,兩個都可以使用,但若是要推導到 Linux 核心使用的公式的話,應該要使用 $X_t$ 而非 $X_{t-1}$ 。原因如下:
Linux 核心在 `include/linux/sched/loadavg.h` 中使用的公式:
```c
newload = load * exp + active * (FIXED_1 - exp);
```
`active` 這個變數根據定義是 =='RUNNABLE + TASK_UNINTERRUPTIBLE' Process 總數==,也就是 `calc_load_tasks` 這個全域變數。所以 `active` 是 `newload` 當下時間點的實際值,應該要是 $X_t$ 而非 $X_{t-1}$ ?
此外,從原本的指數平滑公式推導至 Linux 核心使用的 load averge 公式,我有些疑惑。原本的 $\alpha$ 在指數平滑公式代表的是平滑因子,依據泰勒展開後得到近似值是:$$
\alpha \approx \frac{\Delta T}{\tau}
$$ 可是 Linux 核心使用的 `exp` 變數是 $e^{-\frac{\text{interval}}{\text{window}}}$ ,又因為他是定點數,也可以說 $exp = \alpha \ \times \ FIXED\_1$ 。
那問題就來了,原本的指數平滑公式, $X_t$ 是直接乘上 $\alpha$ ,而 $S_{t-1}$ 則是乘上 $(1-\alpha)$ ,我的理解是 $\alpha$ 在此處是代表一個權重,如果 $\alpha$ 的值越靠近 $1$ ,則 $S_t$ 受到 $X_t$ 值的影響越大,反之, $\alpha$ 越靠近 $0$ 則 $S_{t-1}$ 的影響較大。相較於原本的指數平滑公式,Linux 核心使用的公式不是直觀的直接使用原本的指數平滑公式而來的,而是調整了一下 `load` $(S_{t-1})$ 與 `active` $(X_t)$ 的乘數對像。但是同理來說,如果 `exp` 的值越靠近 $FIXED\_1$ ,則 `load` 對於 `newload` 的影響就越大,反之 `active` 對於 `newload` 的影響就越大?是這樣子想的嗎?
如果真是這樣,那我會覺得說為什麼要畫蛇添足改變原本的指數平滑公式中定義的乘數對象?
是因為 `load` 才是 `newload` 變數影響的主因,所以讓他直接乘上 `exp` ,而不是如同原本的指數平滑公式一樣直接讓 `active` 乘上 `exp` 呢?或是有其他的原因嗎?
:::danger
後續探討呢?
:::