RFC-0237:使用 ZX_CLOCK_UPDATED 更新 Signalling Clock

RFC-0237:使用 ZX_CLOCK_UPDATED 更新 Signalling Clock
狀態已接受
領域
  • 核心
說明

新增一種信號類型,以在 Zircon 時鐘更新時傳送

更小鳥
作者
審查人員
提交日期 (年月分)2023-09-26
審查日期 (年-月-日)2024-01-03

摘要

這個 RFC 建議將新的時鐘信號 ZX_CLOCK_UPDATED 導入 Zircon 於錶面,每次更新時都會閃爍。

提振精神

「時鐘」時鐘單色參考時間軸的單維度咖啡因轉換,可定義如何依據時鐘應將「參照」時間 (即裝置的單聲道時鐘) 轉譯為「合成」時間輸出內容。因此,世界標準時間時鐘會不斷調整,套用至裝置單聲道時鐘目前的值時,會產生目前的世界標準時間。

Zircon 中世界標準時間 UTC 時鐘的虛假轉換只會使用系統呼叫 zx_clock_update 更新,而且任何時鐘使用者都能使用 Syscall zx_clock_get_details 讀取。

為了在 Starnix 上執行的 Linux 程式使用 vDSO 函式 clock_gettimegettimeofday 計算世界標準時間,Starnix vDSO 必須能存取從單聲道統一到世界標準時間的最新時鐘轉換。目前 Starnix 核心能透過定期輪詢時鐘轉換的 Zircon UTC 時鐘來提供這項存取權,方法是使用 zx_clock_get_details,然後將這項轉換載入至 Starnix kernel 所共用記憶體中的頁面,並在 Starnix 上執行的 Linux 程式的使用者空間。

頻譜是一種能無限快速的斷言與斷言訊號。這表示等待時鐘訊號變更的觀察器可以偵測到閃爍情形,但任何觀察器都不會讀取要斷言的時鐘信號值。藉由導入 ZX_CLOCK_UPDATED,時鐘會在時鐘更新時閃爍,而 Starnix 核心會收到世界標準時間更新的通知,並從 Zircon 取得最新轉換,然後在這些通知之後更新 Linux 程式使用的時鐘轉換。這樣可以減少 Zircon 中的時鐘轉換變更,以及當 Linux 程式計算世界標準時間時,使用這個新轉換作業之間的潛在延遲時間。

相關人員

誰有權規範這份 RFC?(本節為選用,但建議提供)。

講師:

  • cpu@google.com

審查者:

  • abarth@google.com
  • maniscalco@google.com
  • johngro@google.com

諮詢時間:

  • mariagl@google.com
  • fdurso@google.com
  • qsr@google.com

社會化:

與上列的所有審查者和顧問討論。有一份設計文件,以及所有相關人員的非正式意見回饋。

本文件中的資訊已納入相關的 RFC 中。

設計

Zircon 時鐘含有一個信號:ZX_CLOCK_STARTED,系統會在時鐘開始時斷言。設計會新增時鐘信號 ZX_CLOCK_UPDATED,每次時鐘更新時,這個信號都會經過模糊處理。

為了防止訊號遭到干擾,設計也涉及修改目前用於更新 Zircon 信號的 Dispatcher::UpdateState。該函式目前採用兩個輸入內容:set_maskclear_mask,分別指定要設定 (斷言) 和明確 (斷言) 的信號。除了更新 set_maskclear_mask 指定的信號之外,函式也會使用 NotifyObservers 函式,針對從閒置轉為使用中狀態的信號通知所有觀察器。

修改內容就是新增第三個輸入 (預設為零),並命名為 strobe_maskUpdateState這會指定所有要閃爍的訊號。指定至頻譜的信號不會改變值,但 NotifyObservers 呼叫會修改為一併通知所有觀察器 (strobe_mask 指定的任何信號),讓觀察者知道信號有更新。

為了使用這個信號接收時鐘轉換通知,且方式可避免使用者缺少更新,使用者不得使用 zx_object_wait_onezx_object_wait_many 等待訊號閃爍。如果使用者讀取目前的時鐘詳細資料,然後呼叫 zx_object_wait_one 以等待時鐘更新,則時鐘可能在讀取目前時鐘詳細資料和等待時間之間,已由 Zircon 更新,因此系統不會註冊這項更新。

請改用 zx_object_wait_async。使用者應先發布與時鐘的非同步等待時間,再讀取目前的轉換。然後,使用者閱讀時鐘詳細資料後,即可等待已張貼非同步等待訊息的通訊埠。這可防止錯過時鐘詳細資料的更新。

這個機制的成果是,如果時鐘在非同步等待建立與讀取時鐘詳細資料之間更新,則在等待通訊埠等待時,即使讀取的時鐘轉換是最新版本,還是會在等待通訊埠時立即喚醒。未來工作可以發展這項信號,移除這類錯誤喚醒的可能性。

實作

這項設計可在一個小型 CL 中實作。CL 會定義新的信號,並修改 UpdateState 以加入新的 strobe_mask 輸入內容。

效能

Starnix 核心將使用這個新的信號,以減少在 Starnix 上執行 Linux 程式 UTC 時長的問題。

目前,Starnix 是唯一建議接收這項信號的使用者,但未來可能還有其他使用者 (例如實作 C++ 執行階段,以便支援 C++ 標準程式庫在世界標準時間前封鎖執行緒的能力)。根據信號的觀察器數量,使用 UpdateState 觀察信號的時間複雜性是線性的。這表示當 ZX_CLOCK_UPDATED 的觀察器數量變大時,就會發生效能問題。

回溯相容性

任何現有信號的行為沒有任何變更,因此預計不會發生回溯相容性問題。

安全性考量

這項提案不會因為任何安全性而受到任何影響。

隱私權注意事項

這項提案不會因隱私權而受到任何影響。

測試

系統會新增測試,用來驗證設計中指定的行為。這項測試可確保時鐘的使用者無法手動變更訊號,在時鐘更新時,所有等待時鐘 ZX_CLOCK_UPDATED 訊號的觀察器都會收到通知,而訊號觀察器在沒有時鐘更新時也不會收到通知 (即沒有時鐘更新時,ZX_CLOCK_UPDATED 一律不會宣告)。

說明文件

以下文件將更新以說明 ZX_CLOCK_UPDATED,而使用者應遵循的方法時鐘,在使用這個信號時不會錯過任何更新。

缺點和替代方案

缺點

信號的觀察器數量增加時,效能降低的問題請參閱本文件的「效能」一節。如果時鐘信號的觀測器數量增加到較大的數值,則可能需要採取進一步措施來減輕這些效能問題。

替代選項

該動機所引起的另一個問題解決方案,是直接將 Zircon UTC 時鐘的時鐘詳細資料直接對應至 Starnix 核心。接著,Starnix 核心可以將這個記憶體直接對應至 Linux 程序的空間。這表示 Zircon 中時鐘物件的任何更新都會立即套用到 Starnix 和 Linux 程序。這樣就不必導入新的信號,不會縮短推送至 Starnix 的時鐘更新延遲時間,但這樣可以完全消除此延遲時間。但這需要大幅變更 Zircon 核心。