3

私は方法を理解しようとしています

int getrusage(int who, struct rusage* usage)

私のプログラムの実行時間を計算するために機能します。
たぶん 10 回は man ページを読み直しましたが、それでもわかりません。Web で何かを見つけようとしましたが、この機能に関するマニュアル ページしか見つかりませんでした。
不明な点は、rusage 構造体の内部に何が格納されているかです。man ページはあまり明確ではありません。そのため、デバッガーで実行して内部の内容を直接確認しようとしましたが、特に 2 つの構造体がどのように機能するか、まだわかりません。 - timeval ru_utime と timeval ru_stime - 動作します。
それらの内部にあるものは、ある時は 0、ある時は 2000 など、異なる値を想定しています。

メモリの割り当てと解放を継続的に行う for ループを含む単純なプログラムを実行しました。ストップウォッチを使って実際に何時間かかるかを確認したところ、5.23秒かかりました。しかし、これらの構造体に見られるのはまったく無関係のようです:

ループ前:
ru_utime = { tv_sec = 0, tv_usec = 1000}, ru_stime = { tv_sec = 0, tv_usec = 1000}
ループ後:
ru_utime = { tv_sec = 4, tv_usec = 677000}, ru_stime = { tv_sec = 0, tv_usec = 2000}

だから、誰か私にこれを説明するか、これが説明されている良いリンクを教えてもらえますか?
とても感謝しています。

4

1 に答える 1

4

関心のある 2 つのサブ構造体は、次のように記述されています。

ru_utime これは、timeval 構造体 (秒とマイクロ秒) で表された、ユーザー モードでの実行に費やされた合計時間です。

ru_stime これはカーネル モードでの実行に費やされた合計時間で、timeval 構造体 (秒とマイクロ秒) で表されます。

メモリ全体を破壊しないようにするために、システムにはカーネル モードとユーザー モードと呼ばれる 2 つの "特権レベル" があります。これを迅速かつ単純にするために、ユーザー モードはすべてのメモリを認識できず、I/O デバイスと通信できず、実際には数の処理しかできません。より複雑なこと (メモリ ページの割り当て、ファイルシステムの読み取り/書き込み、画面への出力など) については、代わりに、これらすべてにアクセスできるカーネルに実行を依頼する必要があります。これは、「システム コール」と呼ばれるメカニズムによって行われます。さらに読むために、この wiki 記事を読んでください: http://en.wikipedia.org/wiki/System_call

大まかに言えば、ru_utime構造体はプログラムが実際の計算に費やした時間をru_stime返し、構造体はプログラムがディスク アクセスや画面への出力などを行う際にカーネルからの応答を待っていた時間を返します。

于 2014-12-21T01:47:42.113 に答える