ホームページ > 記事 > システムチュートリアル > ショック!タイマーには実はたくさんの機能があるのをご存知ですか?
データ通信プロセス中に、データ送信時間のフォーマット要件が発生します。したがって、アプリケーションの実際の要件に応じて異なるタイマーを選択するには、いくつかのアプリケーション タイマーの特性を考慮する必要があります。
タイマー記事参照
一般的に言えば、そうです
1. スリープ、ユースリープ、ナノスリープ
sleep() と nanosleep() はどちらもプロセスを一定期間スリープさせてから目覚めさせますが、その実装は完全に異なります。
Linux はシステムコール sleep() を提供しません。sleep() はライブラリ関数に実装されており、alarm() を呼び出してレポート時間を設定し、シグナル SIGALARM でプロセスを一時停止する sigsuspend() を呼び出します。第 2 レベルまでしか正確ではありません。
nanosleep() は、Linux のシステム コールです Linux タイマー精度。この呼び出しは、呼び出しプロセスをスリープさせ、time_list 構造体のタイマー キューに timer_list タイプのタイマーを追加します。 nanosleep() によって追加されたタイマーの実行関数は、現在のプロセスをウェイクアップする機能のみを完了します。システムは、特定のメカニズムを通じてこれらのキューを定期的に検出します (たとえば、システム コールを通じてコアにトラップされた後、コアからユーザー モードに戻る前に、現在のプロセスのタイム スライスが使い果たされているかどうかを確認する必要があります)。その場合は、schedule() 関数を呼び出して再スケジュールします。この関数でタイマー キューが検出され、この検出は、タイマーで指定されたタイミング時間を超えた場合にも行われます。呼び出しプロセスをウェイクアップするために実行されます。実際、システム タイム スライスが失われる可能性があるため、nanosleep() の精度はあまり高くありません。
alarm() は、タイマーを介して Red Flag Linux オペレーティング システムによっても実装されており、その精度は第 2 レベルまでしか正確ではありません。また、設定されるタイマー実行関数は、現在のプロセスに SIGALRM シグナルを送信することです。指定された時間。
2. セマフォ SIGALRM+alarm() を使用します
アラーム方法は非常に優れており、これらの方法の精度は 1 秒に達する可能性がありますが、1 秒を超える精度を達成することは困難です。 *nix システムのセマフォ機構を使用します。まず、セマフォ SIGALRM 処理関数を登録し、alarm() を呼び出し、タイミング幅を設定します。 コードは次のとおりです。
リーリー
3. RTCメカニズムを使用する
RTC メカニズムは、RTC ハードウェア /dev/rtc を読み取り、ioctl() を介して RTC 周波数を設定することにより、システム ハードウェアによって提供される RealTimeClock メカニズムを使用します。これらのメソッドは、
Linux タイマーの精度 を利用することでより便利です。システムハードウェアによって提供される RTC、精度は調整可能、特に高いコードは次のとおりです:
リーリー
この方法では、システムに RTC デバイス Linux ブート ディスク作成ツールが必要です。当社の 1860 には 2 つの RTC があり、電源管理モジュールの LC1160 内の RTC が使用されます。ドライバーでは RTC_IRQP_SET 制御ワードがサポートされません。ドライバーは後で追加する必要があります。
4、使用select()
能精确到1us,目前精确定时的最流行方案。通过使用select(),来设置定时器;原理借助select()方式的第5个参数,第一个参数设置为0,三个文件描述符集都设置为NULL,第5个参数为时间结构体,代码如下:
#include #include #include #include /*seconds: the seconds; mseconds: the micro seconds*/ void setTimer(int seconds, int mseconds) { struct timeval temp; temp.tv_sec = seconds; temp.tv_usec = mseconds * 1000; select(0, NULL, NULL, NULL, &temp); printf("timern"); return ; } int main() { int i; for(i = 0 ; i < 100; i++) setTimer(1, 0); return 0; }
结果是,每隔1s复印一次,复印100次。
select定时器是阻塞的,在等待时间到来之前哪些都不做。要定时可以考虑再开一个线程来做。
最终,下层应用程序的定时器的京都是内核决定的,这几个定时器的使用方式,尽管理论上可以精确到微妙,虽然,我分别在微妙级测试的时侯,偏差还是很大的,取决于,当时的cpu和进程的调度,等等。。。。
以上がショック!タイマーには実はたくさんの機能があるのをご存知ですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。