| RFC-0237:使用 ZX_CLOCK_UPDATED 發出時鐘更新信號 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 新增信號類型,在 Zircon 時鐘更新時傳送 |
| Gerrit 變更 | |
| 作者 | |
| 審查人員 | |
| 提交日期 (年-月-日) | 2023-09-26 |
| 審查日期 (年-月-日) | 2024-01-03 |
摘要
這項 RFC 建議在 Zircon 時鐘中導入新的時脈訊號 ZX_CLOCK_UPDATED,每次時鐘更新時都會閃爍。
提振精神
「時鐘」是「時鐘單調」參考時間軸的「一維仿射轉換」,定義「參考」時間 (即裝置的單調時鐘) 應如何轉換為時鐘輸出的「合成」時間。因此,世界標準時間時鐘會不斷調整轉換,套用至裝置單調時鐘的目前值時,會產生目前的世界標準時間。
Zircon 中的世界標準時間時鐘的仿射轉換只會由 Timekeeper 使用系統呼叫 zx_clock_update 更新,且任何時鐘使用者都可以使用系統呼叫 zx_clock_get_details 讀取。
如要讓 Starnix 上執行的 Linux 程式使用 vDSO 函式 clock_gettime 或 gettimeofday 計算世界標準時間,Starnix vDSO 必須能存取從單調時間到世界標準時間的最新時鐘轉換。目前 Starnix 核心會定期輪詢 Zircon UTC 時鐘的時鐘轉換,並使用 zx_clock_get_details,然後將這項轉換載入記憶體中的頁面,供 Starnix 核心和在 Starnix 上執行的 Linux 程式使用者空間共用,藉此提供這項存取權。
頻閃是信號的無限快速的斷言和取消斷言。也就是說,等待時脈訊號變更的觀察者可以偵測到選通脈衝,但沒有任何觀察者會讀取時脈訊號的值來判斷是否為斷言。導入 ZX_CLOCK_UPDATED 時鐘訊號後,時鐘更新時會閃爍,Starnix 核心就能收到 UTC 時鐘的更新通知,並從 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,每次更新時脈時,都會選通這個信號。
為了閃爍訊號,設計也涉及修改 Dispatcher::UpdateState,目前用於更新 Zircon 訊號。目前,函式會採用兩個輸入內容:set_mask 和 clear_mask,分別指定要設定 (判斷) 和清除 (取消判斷) 的信號。除了更新 set_mask 和 clear_mask 指定的信號,函式還會使用 NotifyObservers 函式,通知所有觀察器從非使用中轉換為使用中的信號。
修改內容是將預設為零的第三個輸入內容新增至 UpdateState,並命名為 strobe_mask。這會指定要閃爍的所有信號。指定要閃爍的信號不會變更值,但 NotifyObservers 呼叫會經過修改,也會通知所有觀察器 strobe_mask 指定的任何信號,讓觀察器得知信號已更新。
如要使用這項信號瞭解時鐘轉換的更新,避免使用者錯過更新,請勿使用 zx_object_wait_one 或 zx_object_wait_many 等待信號選通。如果使用者讀取目前的時鐘詳細資料,然後呼叫 zx_object_wait_one 等待時鐘更新,時鐘可能已在讀取目前的時鐘詳細資料和呼叫等待之間由 Zircon 更新,因此不會註冊這項更新。
請改用 zx_object_wait_async。讀取目前的轉換前,使用者應針對時鐘發布非同步等待。然後,使用者讀取時鐘詳細資料後,可以等待非同步等待發布的連接埠。這樣就不會錯過時鐘詳細資料的更新。
這項機制的結果是,如果在建立非同步等待和讀取時鐘詳細資料之間更新時鐘,即使讀取的時鐘轉換是最新狀態,在等待連接埠時也會立即喚醒。日後可進一步開發這項信號,避免發生這類錯誤喚醒。
實作
這項設計可以透過一個小型 CL 實作。CL 會定義新信號,並修改 UpdateState,加入新的 strobe_mask 輸入內容。
效能
Starnix 核心會使用這項新訊號,減少在 Starnix 上執行的 Linux 程式 UTC 時鐘發生錯誤的可能性。
目前 Starnix 是這項信號的唯一提議使用者,但未來可能會有其他使用者 (例如 C++ 執行階段的實作項目,以便支援 C++ 標準程式庫的功能,在 UTC 截止時間前封鎖執行緒)。使用 UpdateState 閃爍訊號的時間複雜度與訊號的觀察者數量成線性關係。也就是說,當 ZX_CLOCK_UPDATED 的觀察者數量變多時,就會發生效能問題。
回溯相容性
現有信號的行為不會有任何變更,因此預期不會發生回溯相容性問題。
安全性考量
預計這項提案不會對安全性造成影響。
隱私權注意事項
預計這項提案不會對隱私權造成影響。
測試
系統會新增測試,驗證設計中指定的行為。這些測試可確保時鐘使用者無法手動變更訊號、時鐘更新時會通知等待時鐘 ZX_CLOCK_UPDATED 訊號閃爍的觀察者,以及時鐘未更新時不會通知訊號觀察者 (也就是說,時鐘未更新時,系統絕不會判斷 ZX_CLOCK_UPDATED)。
說明文件
下列文件將更新,說明 ZX_CLOCK_UPDATED,以及使用者應遵循的方法時鐘,確保使用這項信號時不會錯過更新。
- /docs/concepts/kernel/time/utc/architecture.md
- /docs/concepts/kernel/time/utc/behavior.md
- /reference/kernel_objects/clock.md
- /reference/syscalls/clock_update.md
缺點和替代方案
缺點
如要瞭解信號觀察者數量增加時效能下降的問題,請參閱本文件的「效能」一節。如果時脈訊號的觀察者數量大幅增加,可能需要進一步作業,才能減輕這些效能問題。
替代方案
針對動機所提出的問題,替代解決方案是將 Zircon UTC 時鐘的時鐘詳細資料直接對應至 Starnix 核心。Starnix 核心隨後可將這段記憶體直接對應至 Linux 程序的空間。也就是說,Zircon 中時鐘物件的任何更新都會立即傳播至 Starnix 和 Linux 程序。這樣一來,就不需要導入新信號,而且可以完全消除時鐘更新傳播至 Starnix 的延遲,而不是減少延遲。不過,這需要對 Zircon 核心進行大幅變更。