Jiffiesカウンタは、サイズが4バイトの符号なし整数を返します。カウンタが最大値に達すると、カウンタは再び0から再スタートします。私は期間を得るために古い値で最新の値を減算します。では、古い値が最大値で、新しい値が0より大きい場合に間違った継続時間が得られるようなケースについてはどうすればよいでしょうか?Jiffiesカウンタオーバーフローケース+ Linux
答えて
あなたは何もする必要はありません。正しい長さを持ちます(4バイトの符号なし整数を使用してすべての計算を行う限り)。固定幅バイナリ算術として実装された整数値の魔法です。
ここでは、8ビットの符号なし整数を使用する例を示します。オーバーフローがあっても、その差はまだ有効です。
236 - 221 = 11101100 - 11011101 = 11101100 + 00100011 = 00001111 = 15
251 - 236 = 11111011 - 11101100 = 11111011 + 00010100 = 00001111 = 15
10 - 251 = 00001010 - 11111011 = 00001010 + 00000101 = 00001111 = 15
25 - 10 = 00011001 - 00001010 = 00011001 + 11110110 = 00001111 = 15
...
期間は小さいない場合、それは最大値の半分よりも大きくすることができるときに、単一の問題、すなわち、カウンタの最大値に比べてきます。
このアドバイスは、あなたの2つのイベントaとb、実際にbの前に起こり、それらの間の距離が2 ^(32-1)未満の場合にのみ正しいアドバイスです。あなたが(b-a)を計算すると、正しい答えが得られます。より小さい符号なしの値を、符号なしのより大きな値(時間順序を定義する考え方)から引くと、必要な答えの否定が得られます。
したがって、新しい循環比較操作も考慮する必要があります(Linuxのtime_after、time_beforeなどを参照してください)。
ラップアラウンドカウンタは、符号付きまたは符号なしの数値とまったく同じではないため、符号付きと符号なしの比較はどちらも間違っています。
a=250, b=20 #8-bit sequence number a was created before b
a=120, b=130 #8-bit sequence number a was created before b
同じビット数の符号付き値と符号なし値の主な違いは、比較演算子の実装です。負または負の値を1または0で拡張すると、より多くのビットを持つ値に代入すると、符号付きと符号なしが重要になります。この比較は、第1および第2の値との間の実際の距離限り、働く
LT_CIRCULAR_32(250,5) == True //like signed?
LT_CIRCULAR_32(0,11) == True
LT_CIRCULAR_32(127,138) == True //like unsigned?
を常に未満2 ^(32-1さ:
はラップアラウンドの数字のために設計されたよりも少ないの新しい定義を考えてみましょう)。円が256の位置にあり、カウンターaとbが時計回りに進むと想像してください。 aが2 ^(8-1)より小さいbに到達できる場合は、 "a < b"となります。これは、ラッピングを考慮に入れたものであり、符号付きでも符号なしでもありません。time_afterはそれがどのように見えるのかという理由からです。 bとaのキャストは、符号の拡張が一貫していることを別個に保証する。値を署名してゼロよりも小さいかどうかをチェックすることは、上位ビットをテストするためのトリックです。
私は今、jiffies(ie:-300 jiffies)でこの問題を抱えている開発者の取引を見ていて、TCPシーケンス番号と他の同様のカウンターで見ています。だから、2の賛辞はそれのすべてを処理していません。
- 1. InfluxDBでのJiffiesの割合
- 2. msecからjiffiesへの変換
- 3. jiffiesはどのくらいの頻度で更新されますか?
- 4. 1秒あたりのチック数とjiffies。違いはなんですか?
- 5. 私は速すぎてjiffiesをカウントできませんか?
- 6. jiffiesをvirtプラグインのパーセンテージに変換する方法
- 7. Linuxカーネルモジュールのtimer_listを使用するとシステムがクラッシュする
- 8. LinuxカーネルでTCPのRTTを測定する
- 9. jiffiesがseq-lockで保護されているが、アトミック操作を直接使用しない理由
- 10. Linuxシステム上のLinuxシステム
- 11. は、LinuxターミナルでのLinux
- 12. Linux。
- 13. LinuxからのC++関数のエクスポート/インポートダイナミックライブラリ/ Linuxコンソールアプリケーション| Visual Studio Linux Project
- 14. ユーザが提供した時刻に毎日Linuxカーネルモジュールのタスクをスケジュールする
- 15. Linux/MIPSおよびLinux/PowerPCのScala
- 16. どのLinux OSにLinuxカーネル2.6.32
- 17. Linuxデバイスドライバ3コードのコンパイルエラーとLinuxヘッダーファイル
- 18. LinuxからLinux GUIへのリモート
- 19. Linuxカーネルテキストシンボル
- 20. Linuxゼロコピー
- 21. Linuxバッチリネームファイル
- 22. は、Linux
- 23. Linuxファイルディスクリプタログ
- 24. のLinux:
- 25. のLinux
- 26. のlinux
- 27. は、Linux
- 28. Linuxカーネルモジュール
- 29. のlinux
- 30. Linuxは
こんにちは。私は2つの変数old_time、new_timeがあることを、response.Considerに感謝します。継続的なwhileループでは、if((new_time-old_time)== 15)、つまり15秒のように監視されますが、オーバーフローが発生した場合、その特定の期間が間に合わなくなります。このシナリオを処理するケースはありますか? – Joy
いいえ、あなたはそれが間違っていません。それは私の答えのポイントです。オーバーフローの場合でも、 'new_time-old_time'の結果は15になります。 –