世界標準時間的行為

本頁面概略說明 Fuchsia 時區的 UTC 時鐘行為。如要進一步瞭解世界標準時間,請參閱世界標準時間總覽,以及時間總覽,進一步瞭解 Fuchsia 提供的其他測試。

世界標準時間 (UTC) 由發布至元件的核心時鐘物件提供。除非程序在啟動後將控制代碼傳遞至時鐘,否則程序無法讀取世界標準時間。由元件管理服務啟動的所有元件都會收到時鐘的控制代碼。

Timekeeper 能與即時時鐘 (RTC) 或一般可透過網路存取的外部來源進行同步,藉此設定並維持世界標準時間。

與其他作業系統的差異

Fuchsia 的世界標準時間時間與大多數其他作業系統的時間不同,因此會強制執行回溯時間。輪詢時間會設為建構作業中包含的最新修訂版本時間,並以「已知」的時間為準。即使某些時間來源回報的時間較早, Fuchsia 一律回報的時間不會早於回溯時間。這個回溯停止功能是防止有心人士操縱裝置時間的攻擊。舉例來說,攻擊者可能會利用這類攻擊強制裝置接受過期的 TLS 憑證。

在世界標準時間 (UTC) 首次同步處理之前,Fuchsia 唯一可用的世界標準時間時間預估值就是返回時間。回溯時間本身並不可靠,因為從修訂時間到裝置啟動之間可能已經歷任意時間。為了傳達此不確定性,在第一次同步處理之前,系統可能不會執行 UTC 時鐘,而且是從固定的輪詢時間開始執行。是否可在未同步處理時執行 UTC 時鐘,這是每個 Fuchsia 產品必須根據特定產品的需求設定的參數。

簡單來說,福奇亞的 UTC 時鐘有下列狀態。UTC 時鐘會在固定狀態開始,以某些執行狀態結束。

狀態 說明 時鐘行為
固定 時間未曾同步處理且不可靠 時間固定為「BackStop」。
執行中,未同步處理 時間尚未同步處理 執行時間,從返回停止。此時,Fuchsia 的世界標準時間時鐘運作方式與其他作業系統的時鐘類似。進入這個狀態時,系統會宣告 ZX_CLOCK_STARTED 信號。
執行中、已同步 時間至少已同步一次 目前計時中。在此狀態下,世界標準時間時鐘讀數正在追蹤外部時間來源。進入此狀態時,系統會宣告 ZX_USER_SIGNAL_0

屬性

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

  • 回溯時間 - 建立時鐘的回溯時間設為建構作業中最後修訂的時間。時鐘一律不會回報早於返回停止的時間。
  • UTC 時鐘並非單調或連續的。由於 UTC 時間必須從外部來源同步,時間維護工具發現 UTC 時間的預估時間比外部來源早早,因此可能會向前跳轉時間。

在計時器首次同步處理時間之前,裝置上可用的世界標準時間 (UTC) 最佳預估時間就是回溯時間。因此,請務必留意,在這個狀態下,系統可能會回報世界標準時間 (UTC) 時出現極大的錯誤。

不過,無論讀取作業是否對應實際的 UTC 時間戳記,時鐘「可能」仍會執行。請參閱上方的時鐘行為,在 UTC 時鐘控點上觀察適當事件,決定 UTC 時鐘狀態。

計時工具會在時間同步後,設定世界標準時間時鐘。這可能會導致時鐘讀數突然跳出。從此開始,計時器將持續調整時鐘頻率,讓它的執行速度稍微快或更慢,或者將時鐘跳轉至新時間,繼續更新時鐘。雖然準確率會因產品和時間同步方法而異,但通常在實際執行時,時鐘會在實際時間的幾百毫秒內。請注意,即使有 RTC 和/或網路可用,系統可能永遠無法同步處理 UTC 時鐘,因為必須從可忽略的通訊協定擷取這種時間。

可觀測的行為

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

  • 世界標準時間的執行時間可能比單調時間快或慢上數百個部分 (ppm)。之所以會這樣,是因為計時器會慢慢調整時鐘速度,以補償運躍器錯誤或修正小錯誤。
  • UTC 時間可能會向前或向後跳轉不受限的時間長度。如果計時器需要修正,導致發生大型錯誤,就會發生這種情況。首次同步處理時,預期跳轉會相當大。後續的跳轉和向後跳轉情形應極為罕見,原因通常是時間來源錯誤。
  • 可能無法執行世界標準時間。這可能會在第一次同步處理之前發生。

處理未同步狀態的策略

在裝置啟動後不久啟動的元件,或是需要在任何網路可用之前執行的元件,都應發生 UTC 時鐘尚未與 UTC 實際進行同步的情況。在極少數情況下,如果時間同步處理失敗,之後啟動的元件也會顯示未同步的時鐘。以下是一些策略範例:

  • 忽略未同步處理的狀態,並讀取世界標準時間。 這種做法適合不使用世界標準時間 (UTC) 時間嚴格 (例如產生用於偵錯的時間戳記) 的情況。如果已知有元件,必須等到時間同步處理後才會執行。這項策略的缺點是,畫面上可能會顯示所有時間相同的連續時間戳記。

  • 等到世界標準時間時間完成同步作業,再讀取時鐘。這項策略非常適合採用世界標準時間的準確度等方面的挑戰,例如使用世界標準時間來驗證憑證。請注意,由於 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 查看詳細資料,例如時鐘的錯誤繫結。以世界標準時間為準,錯誤範圍定義為 95% 信賴區間的一半。換句話說,如果在隨機選擇的 Fuchsia 裝置上隨機選取時間,則 UTC 的實際值有 95% 的機率介於 reported_utc - error_boundreported_utc + error_bound 之間。在系統有 error_bound 的預估值之前,error_bound 會設為 ZX_CLOCK_UNKNOWN_ERROR。在某些情況下,如果 Fuchsia 裝置執行異常工作負載或有瑕疵硬體,則實際 UTC 時間可能會超出 error_bound 定義的範圍。如要進一步瞭解錯誤繫結的計算方式,請參閱「時鐘錯誤如何繫結?」一節。如果您需要 UTC 時鐘的其他詳細資料,請參閱核心時鐘參考資料,瞭解透過 zx_clock_get_details 提供的詳細資料清單。

請注意,元件會提供唯讀控制代碼,但無法使用提供的控制代碼修改時鐘。

如要瞭解特定語言的繫結和範例,請參閱「語言支援」一文。