

Linuxのソースコードから見れば、１分間、５分間と１５分間の平均負荷量（load average）を取るように（例えば、`cat
/proc/loadavg`）、`fs/proc/loadavg.c`で`get_avenrun()`は呼び出される【※１】のが分かっています。そして、`kernal/sched/loadavg.c`にある`get_avenrun()`のソースコード【※２】を見れば、単に`avenrun[i]`が１つ目の引数に代入されるのが分かっています。定期的にこの関数を呼び出すのは`/proc/loadavg`を更新できないわけです。

`kernal/sched/loadavg.c`には、グローバル変数の`unsigned long avenrun[3]`を書き込む関数は２つしかないです。

  * `static void calc_global_nohz(void)`
  * `void calc_global_load(unsigned long ticks)`

どのインターナルのプロセス或いはスレッドが上記の関数を定期的に呼び出しますか、或いは、別の方法で`avenrun[3]`が定期的に更新できますか。

また、その２つの関数の区別は何でしょうか。

※１
<https://github.com/torvalds/linux/blob/345671ea0f9258f410eb057b9ced9cefbbe5dc78/fs/proc/loadavg.c#L17>

※２
<https://github.com/torvalds/linux/blob/345671ea0f9258f410eb057b9ced9cefbbe5dc78/kernel/sched/loadavg.c#L73>


CC BY-SA 4.0
2018-12-06T13:10:36.027
50982
2021-12-16T09:02:30.283
30643
question
linux
Linuxでは、「/proc/loadavg」はどのように定期的に更新されていますか


Linuxカーネルのことはよくわからないので適当ですが、リンク先の`calc_global_load()`のコメントに以下のように掛かれているので、タイマー割り込ではないでしょうか。

>
[code]

>     /*
>      * calc_load - update the avenrun load estimates 10 ticks after the
>      * CPUs have updated calc_load_tasks.
>      *
>      * Called from the global timer code.
>      */
>  
[/code]

で、`calc_global_nohz()`は名前からするとTicklessでの処理ではないでしょうか。


CC BY-SA 4.0
2018-12-07T15:26:34.730
51013
2020-05-01T09:14:12.670
2020-05-01T09:14:12.670
32986
4010
50982
answer