GNU/Linux >> Linux の 問題 >  >> Linux

Linux では、稼働時間はいつからカウントされますか?

私のシステムでは、/proc/uptime から稼働時間を取得します :

$ strace -eopen uptime
open("/etc/ld.so.cache", O_RDONLY|O_CLOEXEC) = 3
open("/lib/libproc-3.2.8.so", O_RDONLY|O_CLOEXEC) = 3
open("/lib/x86_64-linux-gnu/libc.so.6", O_RDONLY|O_CLOEXEC) = 3
open("/proc/version", O_RDONLY)         = 3
open("/sys/devices/system/cpu/online", O_RDONLY|O_CLOEXEC) = 3
open("/etc/localtime", O_RDONLY|O_CLOEXEC) = 3
open("/proc/uptime", O_RDONLY)          = 3
open("/var/run/utmp", O_RDONLY|O_CLOEXEC) = 4
open("/proc/loadavg", O_RDONLY)         = 4
 10:52:38 up 3 days, 23:38,  4 users,  load average: 0.00, 0.02, 0.05

proc マンページから:

   /proc/uptime
          This file contains two numbers: the uptime of the system
          (seconds), and the amount of time spent in idle process
          (seconds).

proc ファイルシステムには、疑似ファイルのセットが含まれています。これらは実際のファイルではなく、ファイルのように見えますが、カーネルによって直接提供される値が含まれています。 /proc/uptime などのファイルを読み取るたびに 、その内容はオンザフライで再生成されます。 proc ファイルシステムは、カーネルへのインターフェースです。

ファイル fs/proc/uptime.c の Linux カーネル ソース コード内 49 行目に関数呼び出しがあります:

proc_create("uptime", 0, NULL, &uptime_proc_fops);

これにより、uptime という名前の proc ファイルシステム エントリが作成されます。 (procfs は通常 /proc の下にマウントされます )、関数をそれに関連付けます。これは、その疑似ファイルに対する有効なファイル操作とそれらに関連付けられた関数を定義します。アップタイムの場合は read() です と open() オペレーション。ただし、関数をさかのぼると、ここでアップタイムが計算されます。

内部的には、(他の値に加えて) システムのアップタイムを定期的に更新するタイマー割り込みがあります。タイマー割り込みが刻む間隔は、プリプロセッサ マクロ HZ によって定義されます。 、その正確な値はカーネル構成ファイルで定義され、コンパイル時に適用されます。

頻度 HZ と組み合わせたアイドル時間と CPU サイクル数 (1 秒あたりのサイクル数) は、最後の起動からの数 (秒) で計算できます。

あなたの質問に答えるには:「稼働時間」はいつからカウントされますか?

稼働時間はカーネルの内部値であり、サイクルごとに刻々と変化するため、カーネルが初期化されたときにカウントを開始します。つまり、最初のサイクルが終了したときです。何かがマウントされる前であっても、ブートローダーがカーネル イメージに制御を渡した直後。


私の知る限り、uptime /proc/uptime を使用 システム稼働時間を計算します。ソース コード uptime.c でより明確に確認できます。

  FILE *fp;

  fp = fopen ("/proc/uptime", "r");
  if (fp != NULL)
    {
      char buf[BUFSIZ];
      char *b = fgets (buf, BUFSIZ, fp);
      if (b == buf)
        {
          char *end_ptr;
          double upsecs = c_strtod (buf, &end_ptr);
          if (buf != end_ptr)
            uptime = (0 <= upsecs && upsecs < TYPE_MAXIMUM (time_t)
                      ? upsecs : -1);
        }

      fclose (fp);
    }

標準の UNIX システム (元のソース * に基づく) では、uptime /var/adm/utmpx を読み取ります 再起動エントリの最後の時刻をチェックします。

言い換えれば、これは who -b でも取得した日付を取得しています それからの時間を計算します。

*) uptime w へのリンクです プログラムであり、1980 年頃に BSD によって導入されました。


Linux
  1. Linux – GrubコマンドラインからWindowsパーティションを起動する方法は?

  2. Linux – Alpine Linuxにパッケージをインストールするときにプロンプ​​トが表示される自動はい?

  3. Linux – Arch Linux:Chrooting時にPacmanが機能しませんか?

  1. Linux – Linuxからブートローダーを実行する方法は?

  2. Linux カーネルの copy_from_user は内部でどのように機能しますか?

  3. Linux サービスが自動起動しないようにするにはどうすればよいですか?

  1. AURからパッケージをインストールするときにコンパイルプロセスを高速化する方法

  2. パイプコマンドを実行するときにLinuxユーティリティは賢いですか?

  3. 開発時に Linux マシンからの外部アクセスなしをシミュレートすることは可能ですか?