1

複数の小さなファイルを読み込んで、それらを 5 秒の長さの 1 つのファイルに出力しています。入力ファイルがいつ入ってくるか、それらの大きさ、それぞれに含まれる時間の長さなどを制御できません。5秒間隔で生成されたすべてのファイルのすべてのデータを含む完全なファイルを5秒ごとに出力したいと思います。これを準ストリーミングの方法で動作させ、ファイルをバッファリングせず、5 秒後に出力を作成するようにしたいと考えています。

このような状況では、入力ファイルが存在しない場合に、新しい値のポールにスリープおよびウェイクアップして対処する必要があります。ただし、5 秒のマークに達したときにスリープ/ポーリングも停止する必要があるため、新しい 5 秒のブロックを出力します。これは、5 秒が経過して結果を出力する準備ができているかどうかを知るために、時計との比較を行う必要があることを意味します。

これらの壁時計チェックのそれぞれが、それに伴うすべての費用を伴う OS へのシステム コールになるかどうか疑問に思っています。可能であれば、あまり労力をかけずに、ウォール クロックを取得するための CPU 呼び出しを最小限に抑えたいと思います (主に CPU を節約するために、非常に迅速なポーリングを行います。数十のアプリケーションのそれぞれに対する一定の CPU 呼び出しは、実際には一部を消費する可能性があります)。 CPU)。私が好むのは、CPUサイクルから離れて動作し、内部タイマーの再同期のために時々OSを呼び出すだけのシステムです。さて、このプログラムでは、わざわざ複雑なことを実装する価値はありませんが、不思議に思いました。C++ 言語には、私が説明したこと、CPU 時間の操作、ウォール クロックとの断続的な同期を行うメソッドが既に作成されていますか? それとも、時間を取得しようとするたびに常にシステム コールを実行しますか?

ありがとう

4

2 に答える 2

2

はい、基本的にオペレーティングシステムは、プロセスの実時間を取得するための機能を提供します。

もちろん、オペレーティングシステムも本質的にプログラムであり、C ++で記述できるため、ハードウェアから直接時刻を照会する必要があります。それは確かに可能ですが、ハードウェアに直接アクセスするための特権が必要です。最近のオペレーティングシステムでは、これは通常は不可能です。そのため、オペレーティングシステム自体(十分な特権を持っています)がこの仕事を行い、いわゆる「ユーザースペース」プログラムの実時間を取得するためのインターフェイスを提供します。

于 2012-06-18T18:42:11.173 に答える
0

それはプラットフォームに依存する質問です。あなたが話している Linux syscall はgettimeofday()であり、オーバーヘッドが非常に低くなるように特別に作成されています。一部のマシンでは、20ns 程度です。これがどのように行われるかについての詳細は次のとおりです。

gettimeofday と同等の高速化

基本的なトリックは、すべての OS サービスがコンテキスト スイッチを必要とするわけではないということです。この場合、Linux は完全にユーザー空間にとどまりながら、現在の時刻を高解像度で提供できます。ボトルネックを作成したことを証明できない限り、C ライブラリが正しいことを行うと信頼してください。

于 2012-06-18T19:49:37.257 に答える