Linuxユーティリティが現在時刻を取得するためにシステムコールを使用しないのはなぜですか?

Linuxユーティリティが現在時刻を取得するためにシステムコールを使用しないのはなぜですか?

私たちのゲストVMが「やるべきこと」kvm-clockドライバを使わない理由を本当に知りたいです。彼らはRHEL 7.2、glibc-2.17、kern 3.10.0を実行しています。などのdateプログラムは、perl -e 'print time'システムコールを行わずに現在の時刻を取得します。これはstraceとltraceとして識別され、gdbsyscallを使用してrtdscp

これはglibcの作者の最適化の試みですか?この機能を無効にし、glibc呼び出しにシステム呼び出しを強制する方法はありますか(LD_PRELOADハッキングがありません)。

修正する2016年10月14日:

最新の内容を確認しました。POSIXドラフト、答えの一部は明らかです。 CPUにクロックを要求する方法がありますが、GNU glibcは誤ってユーザーにこの実装を強制します。解決策は、システムコールを直接呼び出すことです。 (シェン)

_POSIX_CPUTIMEが定義されている場合、実装は与えられたプロセスのCPUタイムクロックを表すclock_getcpuclockid()を呼び出して得られたクロックID値をサポートする必要があります。実装では、クロックの1つが呼び出されたときに呼び出しプロセスのCPUタイムクロックを表す特別なclockid_t値CLOCK_PROCESS_CPUTIME_IDもサポートする必要があります。()またはタイマー_()機能。

clock_idユーザーが「に設定するとCLOCK_REALTIMEシステムコールを使用する必要がある」という概念に反対する実際の主張はありますか?

ベストアンサー1

システムコールが発生しない理由は、一部のLinuxシステムコール(特におよび時間に関連する呼び出しgettimeofday(2)time(2)が転送されるためだと思います。仮想DSOには、一部のシステムコールの最適化された実装が含まれています。

「vDSO」(Virtual Dynamic Shared Object)は、カーネルによってすべてのユーザ空間アプリケーションのアドレス空間に自動的にマッピングされる小さな共有ライブラリです。

カーネルが提供するシステムコールの中には、ユーザー空間コードで頻繁に使用されるため、これらの呼び出しは全体的なパフォーマンスに影響を与える可能性があります。これは、ユーザー空間を終了してカーネルに入ることによって発生する呼び出し頻度とコンテキスト切り替えオーバーヘッドによるものです。

マニュアルでは、必要な情報がメモリに配置され、プロセスが直接アクセスできると言われています(現在の時間は最終的に秘密ではありません)。私は具体的な実装を知らず、CPUタイムスタンプカウンタの役割だけを推測できます。

したがって、実際に最適化するのはglibcではなくカーネルです。設定でvdso=0無効にできます。カーネルコマンドライン、コンパイルできる必要があります。ただし、glibc側で(少なくともライブラリにパッチを適用せずに)無効にできるかどうかはわかりません。

これに関する他の多くの情報とソースがあります。SEに関する質問


あなたの質問で次のように言われました。

最新のPOSIXドラフトをレビューした後、答えの一部は明らかになりました。 CPUからクロックを要求する方法がありますが、GNU glibcは誤ってユーザーにこの実装を強制します。

かなり大胆な声明だと思います。少なくともユーザーに害を及ぼさない限り、ユーザーに何かをするように「不正に強要」したという証拠はありません。現在のシステムで実行されているほぼすべてのLinuxプロセスは、vDSOを使用して実装されています。つまり、vDSOが正常に動作しない場合、人々は非常に大きな苦情を聞くでしょう。受け取った時間も正しいと言いましたね。

マニュアルで提供された引用は、次の通貨をサポートするclock_gettime必要があると述べているようです。clock_getcpuclockidCLOCK_REALTIME、またはの行動とは何の関係もありません。gettimeofday

おすすめ記事