Keyboard shortcuts

Press or to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

[インデックス 18669] ファイルの概要

このコミットは、GoランタイムがDragonFly BSD上でタイマーのために使用するクロックの種類を変更するものです。具体的には、CLOCK_REALTIME(リアルタイムクロック)からCLOCK_MONOTONIC(単調増加クロック)への切り替えが行われました。これにより、システム時刻の変更に影響されない、より信頼性の高いタイマー動作が実現されます。

コミット

b4dc91e386d2da269b597808564443bc46fc8bc1

GitHub上でのコミットページへのリンク

https://github.com/golang/go/commit/b4dc91e386d2da269b597808564443bc46fc8bc1

元コミット内容

commit b4dc91e386d2da269b597808564443bc46fc8bc1
Author: Shenghou Ma <minux.ma@gmail.com>
Date:   Wed Feb 26 23:15:34 2014 -0500

    runtime: use monotonic clock for timers on dragonfly.
    Update #6007
    
    LGTM=bradfitz
    R=golang-codereviews, bradfitz
    CC=golang-codereviews
    https://golang.org/cl/69040045
---
 src/pkg/runtime/sys_dragonfly_386.s   | 4 ++--
 src/pkg/runtime/sys_dragonfly_amd64.s | 4 ++--
 2 files changed, 4 insertions(+), 4 deletions(-)

diff --git a/src/pkg/runtime/sys_dragonfly_386.s b/src/pkg/runtime/sys_dragonfly_386.s
index 9085ded6fd..20e6999668 100644
--- a/src/pkg/runtime/sys_dragonfly_386.s
+++ b/src/pkg/runtime/sys_dragonfly_386.s
@@ -155,7 +155,7 @@ TEXT runtime·setitimer(SB), NOSPLIT, $-4
 TEXT time·now(SB), NOSPLIT, $32
  MOVL $232, AX
  LEAL 12(SP), BX
- MOVL $0, 4(SP)
+ MOVL $0, 4(SP) // CLOCK_REALTIME
  MOVL BX, 8(SP)
  INT $0x80
  MOVL 12(SP), AX // sec
@@ -172,7 +172,7 @@ TEXT time·now(SB), NOSPLIT, $32
 TEXT runtime·nanotime(SB), NOSPLIT, $32
  MOVL $232, AX
  LEAL 12(SP), BX
- MOVL $0, 4(SP)
+ MOVL $4, 4(SP) // CLOCK_MONOTONIC
  MOVL BX, 8(SP)
  INT $0x80
  MOVL 12(SP), AX // sec
diff --git a/src/pkg/runtime/sys_dragonfly_amd64.s b/src/pkg/runtime/sys_dragonfly_amd64.s
index 2fa97f2074..d70d2e80cd 100644
--- a/src/pkg/runtime/sys_dragonfly_amd64.s
+++ b/src/pkg/runtime/sys_dragonfly_amd64.s
@@ -125,7 +125,7 @@ TEXT runtime·setitimer(SB), NOSPLIT, $-8
 // func now() (sec int64, nsec int32)
 TEXT time·now(SB), NOSPLIT, $32
  MOVL $232, AX
- MOVQ $0, DI
+ MOVQ $0, DI  // CLOCK_REALTIME
  LEAQ 8(SP), SI
  SYSCALL
  MOVQ 8(SP), AX // sec
@@ -138,7 +138,7 @@ TEXT time·now(SB), NOSPLIT, $32
 
 TEXT runtime·nanotime(SB), NOSPLIT, $32
  MOVL $232, AX
- MOVQ $0, DI
+ MOVQ $4, DI  // CLOCK_MONOTONIC
  LEAQ 8(SP), SI
  SYSCALL
  MOVQ 8(SP), AX // sec

変更の背景

このコミットは、GoランタイムがDragonFly BSD上でタイマーを扱う際に発生していた問題に対処するために行われました。具体的には、Issue #6007で報告された問題に関連しています。

Goのタイマーは、指定された時間が経過した後にイベントをトリガーするために使用されます。しかし、CLOCK_REALTIMEを使用していると、システム時刻が手動で変更されたり、NTP(Network Time Protocol)によって調整されたりすると、タイマーの動作に予期せぬ影響を与える可能性がありました。例えば、システム時刻が過去に巻き戻された場合、タイマーが設定された時間よりも早く、あるいは遅く発火する、あるいは全く発火しないといった不整合が生じる可能性があります。

このような問題を回避し、タイマーの信頼性と正確性を向上させるために、システム時刻の変更に影響されない単調増加クロックであるCLOCK_MONOTONICを使用するように変更されました。

前提知識の解説

このコミットを理解するためには、オペレーティングシステムにおける2つの主要なシステムクロック、CLOCK_REALTIMECLOCK_MONOTONICについて理解しておく必要があります。

CLOCK_REALTIME (リアルタイムクロック)

  • 定義: CLOCK_REALTIMEは、システムが現在認識している「壁時計」時間、つまり私たちが普段時計で見るような実際の時刻を表します。これは、エポック(1970年1月1日00:00:00 UTC)からの秒数とナノ秒数で時間を測定します。
  • 調整可能性: このクロックは調整可能です。ユーザーが手動で変更したり、NTPサービスによって自動的に調整されたりすることがあります。
  • 挙動: NTPや手動での時刻変更が行われると、CLOCK_REALTIMEもそれに合わせて進んだり戻ったりします。これにより、時間の連続性が失われ、不連続なジャンプが発生する可能性があります。例えば、夏時間(DST)の変更時には、壁時計の時間がジャンプすることがあります。
  • 用途: CLOCK_REALTIMEは、イベントにタイムスタンプを付けたり、ユーザーに現在の時刻を表示したり、実際の時刻を反映する必要があるアプリケーションに適しています。

CLOCK_MONOTONIC (単調増加クロック)

  • 定義: CLOCK_MONOTONICは、過去の不特定の固定点(通常はシステムの起動時)からの絶対経過時間を測定します。このクロックは、いかなるプロセスによっても設定することはできません。
  • 調整可能性: CLOCK_REALTIMEとは異なり、CLOCK_MONOTONICは手動のシステム時刻変更やNTP調整の影響を受けません。常に単調に増加し、決して後退することはありません。NTPによってクロックのレートが調整されることはありますが、クロックがジャンプすることはありません。
  • 挙動: このクロックは、システム時刻の変更に関わらず、安定した信頼性の高い時間参照を提供し、時間間隔が常に一貫して測定されることを保証します。
  • 用途: CLOCK_MONOTONICは、コードの実行時間のベンチマークやタスクのスケジューリングなど、イベント間の経過時間や時間差を計算する場合に推奨されます。一貫した測定が重要な場合に特に有用です。

まとめ

| 特徴 | CLOCK_REALTIME