世界標準時間的行為

本頁面概述 Fuchsia 上 UTC 時鐘的行為。如要進一步瞭解世界標準時間,請參閱「世界標準時間總覽」一文;如要瞭解 Fuchsia 提供的其他時鐘,請參閱「時間總覽」一文。

世界標準時間是由分發至元件的核心時鐘物件提供。除非在啟動時傳遞時鐘的句柄,否則程序無法讀取世界標準時間。所有由元件管理服務工具啟動的元件都會收到時鐘的句柄。

Timekeeper 會根據即時鐘 (RTC) 或一般可透過網路存取的外部來源,設定及維護世界標準時間時鐘。

與其他作業系統的差異

Fuchsia 上的世界標準時間與大多數其他作業系統上的時間不同,因為它會強制執行備用時間。回溯時間會設為建構作業中最新的提交時間,並做為「已知」時間。即使某些時間來源回報的時間較早,Fuchsia 也不會回報比回溯時間更早的時間。這項備用機制可限制攻擊者操控裝置時間的攻擊。舉例來說,這類攻擊可用於強制裝置接受已過期的 TLS 憑證。

在世界標準時間首次同步之前,Fuchsia 唯一可用的預估世界標準時間就是備用時間。因為從提交時間到裝置啟動之間可能會經過任何時間,因此單獨使用備援時間無法準確估算時間。為了傳達這種不確定性,在第一次同步之前,世界標準時間時鐘可能不會運作,如果運作,則會從固定的備用時間開始。每個 Fuchsia 產品都必須根據特定產品需求設定參數,以決定 UTC 時鐘是否可以在未同步的情況下運作。

總而言之,Fuchsia 上的 UTC 時鐘有下列狀態。UTC 時鐘會在固定狀態下開始,並在某些執行狀態下結束。

狀態 說明 時鐘行為
固定 時間從未同步,因此不準確 時間固定在後台。
正在執行,未同步 未同步處理時間 時間開始計時,從後援投手開始。在這個狀態下,Fuchsia 上的 UTC 時鐘的運作方式與其他作業系統上的時鐘類似。進入這個狀態時,系統會提出 ZX_CLOCK_STARTED 訊號。
正在執行,已同步 時間至少已同步過一次 時間所剩不多。在這個狀態下,世界標準時間時鐘會追蹤外部時間來源。進入這個狀態時,系統會斷言 ZX_USER_SIGNAL_0

屬性

UTC 時鐘一律會顯示下列屬性:

  • 截止時間:建立時鐘時,截止時間會設為建構作業的最後一次提交時間。時鐘絕不會回報比後備計時器更早的時間。
  • 世界標準時間時鐘並非單調或連續。由於世界標準時間必須與外部來源同步,如果 Timekeeper 發現其預估的世界標準時間比外部來源落後太多,可能會將時間往回跳。

在 Timekeeper 首次同步處理時間之前,裝置上可用的最佳世界標準時間預估值就是備用時間。因此,請務必注意,在這個狀態下,世界標準時間可能會以任意大型誤差回報。

不過,無論讀數是否與實際世界標準時間時間戳記相符,時鐘可能會持續運作。請參閱上述時鐘行為,藉由觀察世界標準時間時鐘句柄的適當事件,判斷世界標準時間時鐘狀態。

Timekeeper 同步處理時間後,就會設定世界標準時間。這可能會導致時鐘讀數突然跳躍。從這個時間點開始,Timekeeper 會繼續更新時鐘,方法是調整時鐘頻率,讓時鐘運作速度稍快或稍慢,或是讓時鐘跳到新的時間。雖然不同產品和時間同步方法的準確度不同,但在運作時,時鐘通常會比實際世界標準時間快上幾百毫秒。請注意,即使有 RTC、網路或兩者皆可使用,UTC 時鐘也可能無法同步,因為必須透過有誤的通訊協定,從有誤的來源擷取。

可觀察行為

由於上述屬性,您可能會觀察到下列行為:

  • 世界標準時間的運作速度可能比單調時間快或慢幾百萬分之一 (ppm)。這是因為 Timekeeper 會將時鐘的速度調慢或調快,以補償振盪器錯誤或修正小錯誤。
  • UTC 時間可能會向前或向後跳躍無限的時間長度。如果 Timekeeper 需要修正大型錯誤,就會發生這種情況。首次同步時間時,系統會跳到較晚的時間。後續的向前和向後跳躍應極為罕見,通常是因為時間來源發生錯誤。
  • 可能未執行世界標準時間。這可能發生在首次同步處理之前。

處理非同步狀態的策略

在裝置啟動後立即啟動的元件,或在任何網路可用前就需要執行的元件,都可能會遇到世界標準時間時鐘尚未與實際世界標準時間同步的情況。在極少數情況下,時間同步處理作業永遠不會成功,稍後啟動的元件也會看到未同步的時間。以下是一些策略範例:

  • 忽略未同步的狀態,並讀取世界標準時間。這項策略適用於世界標準時間不一定需要精確的情況,例如為了偵錯而產生時間戳記。在已知元件必須等到時間同步後才會執行的情況下,這也是適當的做法。這項策略的缺點是,您可能會看到連續的時間戳記,全部都回報相同的時間。

  • 請等待 UTC 時間同步後再讀取時鐘。這項策略適用於世界標準時間準確度至關重要的情況,例如使用世界標準時間驗證憑證。請注意,這不一定是最佳策略,因為世界標準時間可能永遠不會同步。

檢查時鐘屬性

您可以先取得 zircon 時鐘物件的句柄,然後將句柄傳遞至適當的系統呼叫,以便檢查時鐘屬性。舉例來說,如果您需要在讀取時鐘前確認時間是否已同步,這項功能就非常實用。對於 TLS 憑證驗證等應用程式而言,這一點尤其重要,因為驗證到期日需要一些相當準確的時間。

您可以使用 <zircon/utc.h> 中提供的 zx_utc_reference_get 方法,擷取提供給執行階段的世界標準時間時鐘的句柄。

時鐘運作時,系統會提出 ZX_CLOCK_STARTED 信號。系統會在時鐘首次同步時,斷言 SIGNAL_UTC_CLOCK_SYNCHRONIZED (或等同於 ZX_SIGNAL_USER_0)。

您可以使用下列任一方式檢查或等待任一信號:

您可以使用 zx_clock_get_details 查看時鐘的誤差範圍等詳細資訊。對於 UTC 時鐘,錯誤邊界定義為 95% 信賴區間的一半。換句話說,如果隨機選取時間,並隨機選取 Fuchsia 裝置,世界標準時間的實際值有 95% 以上的機率介於 reported_utc - error_boundreported_utc + error_bound 之間。在系統估算出 error_bound 之前,error_bound 會設為 ZX_CLOCK_UNKNOWN_ERROR。在某些情況下,如果 Fuchsia 裝置執行異常工作負載或硬體有瑕疵,實際的 UTC 時間可能會落在 error_bound 定義的範圍之外。如要進一步瞭解如何計算錯誤邊界,請參閱「如何限制時鐘誤差?」一節。如需世界標準時間時鐘的其他詳細資料,請參閱核心時鐘參考資料,瞭解透過 zx_clock_get_details 提供的詳細資料清單。

請注意,元件會提供唯讀句柄,且無法使用提供的句柄修改時鐘。

如需語言專屬繫結和範例,請參閱語言支援