2

こんにちは、OS クラスのプロジェクトに取り組んでいるときに、ちょっとした問題が発生しています。getrusage() を使用して、作成中のプログラムのユーザー モードとカーネル モードの両方で費やされた時間を判断するように指示されました。問題は、CPU とカーネルの使用率がゼロであることが常に通知されることです。関数を調べると、man ページには、rusage 構造体の一部のメンバーが Linux の特定のバージョンでサポートされていない場合、ゼロに設定されていることが記載されています。基本的に、関数の呼び出しとそのパラメーターへのアクセスが正しいかどうかを誰かが教えてくれるかどうか疑問に思っていました(したがって、私が問題であるかどうか、またはそれらの機能がカーネルでサポートされていないかどうかを判断できます)。

コード

struct rusage usage;
struct rusage *p = &usage;

getrusage(RUSAGE_SELF, p);

printf("time in user mode = %ld\ntime in kernel mode = %ld\n", p->ru_utime.tv_sec, p->ru_stime.tv_sec);
4

1 に答える 1

5

struct rusageメンバーru_utimeru_stimeはどちらもタイプstruct timevalで、次のようになります。

struct timeval {
    time_t      tv_sec;     /* seconds */
    suseconds_t tv_usec;    /* microseconds */
};

tv_sec経過秒数をtv_usec示し、残りのマイクロ秒数を示します。したがって、timeval 全体を出力したい場合は、両方を出力する必要があります。

メンバーを出力しているだけなのでtv_sec、プログラムが 0 秒以上経過するほど長く実行されていないと思われます。他の値も出力する必要があります:

printf("time in user mode = %ld.%06ld ", 
     p->ru_utime.tv_sec, p->ru_utime.tv_usec);
printf("time in kernel mode = %ld.%06ld\n", 
     p->ru_stime.tv_sec, p->ru_stime.tv_usec);

構造を印刷する他の方法についてリンクした質問を見ることができます。timeval

于 2012-04-16T02:40:24.553 に答える