linuxタイムスタンプ単調増分時間(CLOCK_MONOTONIC_RAW)

2573 ワード

転載先
https://blog.csdn.net/zniahfag/article/details/53489970
https://www.jianshu.com/p/1861a844a2fb
https://www.cnblogs.com/memo-store/p/5658277.html
 
uint64_t ustime(void) {

   uint64_t ust=0;
//     struct timeval tv;
//    gettimeofday(&tv, NULL);
//    ust = ((uint64_t)tv.tv_sec)*1000000;
//    ust += (uint64_t)tv.tv_usec;

    struct timespec tp;

    if(syscall(SYS_clock_gettime, CLOCK_MONOTONIC_RAW, &tp)==0)
    {
        ust=(uint64_t)(tp.tv_sec*1000000);
        ust += (uint64_t)(tp.tv_nsec/1000);

    }


    return ust;
}

/* Return the  time in milliseconds */
uint64_t mstime(void) {
    return ustime()/1000;
}

CLOCK_MONOTONIC_RAWはgettimeofday(CLOCK_REALTIME)の代わりにmsタイムスタンプを取得する
 
Linuxカーネルでは、主にこのようないくつかの異なるタイプのクロック(clock)があることがわかります.
1 2 3 4 CLOCK_REALTIME CLOCK_MONOTONIC CLOCK_MONOTONIC_RAW CLOCK_BOOTTIME
1  CLOCK_REALTIMEは、wall time、すなわち実際の時間と理解できる.ユーザーは、コマンド(date)またはシステム呼び出しを使用して変更できます.NTPを使用すると、NTPによっても修正されます.システムがスリープしている場合でも動作します(システムが回復した場合、kernelは補償に行きます).
相対時間は、1970.1.1から現在の時間までです.システム時間を変更すると、取得した値が変更されます.システム時間を座標とします.文字通りwall time掛時計時間は、現実の時間を表し、変数xtimeによって記録される.システムが起動するたびに、CMOS上のRTC時間をxtimeに読み込みます.この値は「1970-01-01から経験した秒数、この秒で経験したナノ秒数」です.timer interruptが来るたびにxtimeを更新する必要があります.wall timeは必ずしも単調に増加するとは限らない.wall timeは現実の実際の時間を指すため、システムがネットワーク内のノード時間と同期する場合、またはシステム管理者がこのwall timeが現実の時間と一致しないと判断した場合、このwall timeを任意に変更する可能性がある.最も簡単な例は、ユーザ自身が任意にシステム時間を変更することができ、この変更された時間はwall time、すなわちxtimeであり、RTCに書き込まれて永続的に保存することもできる.
一部のアプリケーションでは、このwall timeが使用されている可能性があります.例えば、以前はvmware workstationを使っていたが、起動すると試用期間が過ぎたが、システムの時間を1年繰り上げて調整すれば、再起動してもヒントはない.これは起動時にgettimeofdayでwall timeを読み、期限切れかどうかを判断し、wall timeを変更すれば、騙すことができるからかもしれません.
 
2 CLOCK_MONTONICは、ある時点から現在までの単調な時間です.ユーザーはこの時間を変更できませんが、システムがスリープ(suspend)に入るとCLOCK_MONOTONICは増えません.(システム時間の変更は影響しません)
絶対時間に準じて、取得した時間はシステムが現在まで再起動した時間であり、システム時間の変更は影響しません.字面の意味:単調な時間は、システムの起動後に流れる時間を表し、変数jiffiesによって記録される.システムが起動するたびにjiffiesは0に初期化されます.timer interruptごとにjiffiesに1を追加します.すなわち、システムの起動後に流れるtick数を表します.jiffiesは時間が可逆的ではないため、単調に増加しているに違いない.
 
3 CLOCK_MONOTONIC_RAW、CLOCK_MONOTONICは似ていますが、違いはMONOTONIC_ですRAWはNTPの影響を受けません.CLOCK_MONOTONICがNTPの影響を受けるのは、NTPがCLOCKを修正するというわけではありません.MONOTONICは、それを不連続にするのではなく、NTPサーバとローカルのクロックハードウェアの間に問題がある場合、NTPはCLOCK_に影響します.MONOTONICの周波数ですが、MONOTONIC_RAWはその影響を受けません.
4 CLOCK_BOOTIME、CLOCK_とMONOTONICは似ていますが、suspendの場合も増加します.LWNのこの文章introduceを参考にすることができますhttps://lwn.net/Articles/420142/