RFC-0142:zx_thread_legacy_yield

RFC-0142:zx_thread_legacy_yield
狀態已接受
領域
  • 核心
說明

加入用於產生收益的特殊 syscall。

毛皮變化
作者
審查人員
提交日期 (年-月-日)2021-11-29
審查日期 (年-月-日)2021-10-13

摘要

建議您新增 syscall zx_thread_legacy_yield ,以 將 CPU 產生到其他等待執行緒的呼叫執行緒。此外, 當期限為 zx_nanosleep 時,我們會移除 zx_nanosleep 的特殊案例 等於零。系統呼叫名稱中的 legacy 存在做為指示 並使用更合適的機制來達成 行為

提振精神

zx_nanosleep 的行為與處理期限的方式不同 也就是其他系統呼叫,若期限早於目前時間, 就會立即傳回結果。目前這個特殊案例中設定了期限值 零代表收益

此外,您無法在執行階段判斷 「 」設為零,或計算結果這會導致 簡化 zx_nanosleep 的運作方式,讓開發人員減少特殊情況 任何需要注意的事項您可以手動將期限設為 0,以便 執行緒會產生,但結果也可能為 0 下次醒來 (表示現在繼續)。

相關人員

誰會負責確認 RFC 是否已獲接受?(這個部分為選填,但 encouraged.)

講師:

FEC 任命的人員,透過 RFC 處理此 RFC 上傳資料集之後,您可以運用 AutoML 自動完成部分資料準備工作

審查者:

諮詢:

社交:設計最初是在設計文件中討論,

設計

本提案包含下列 Zircon syscall API 變更:

  1. 新增 zx_thread_legacy_yield
  2. 簡化 zx_nanosleep

其中 zx_thread_legacy_yield 定義為:

/// Yields cpu to another waiting thread.
/// `options`: Reserved for future extension. Must be zero.
/// @blocking
zx_status_t zx_thread_legacy_yield(uint32_t options);

在使用者空間應用程式上呼叫 zx_thread_legacy_yield 時, 呼叫執行緒會產生 CPU。options 參數可以是 來介紹提示

options 等於零的情況下呼叫 zx_thread_legacy_yield 為 保證會傳回 ZX_OK

當呼叫 zx_nanosleep 時,其期限大於 等單調時鐘,呼叫執行緒會進入休眠狀態,直到期限為止 (加號)。另一方面,如果期限 值等於或早於單調時鐘中的時間,則會傳回 立即生效但如果期限為零,就會導致呼叫執行緒 產生的收益導入「zx_thread_legacy_yield」後,目標是移除 處理零時差的特殊處理方式

此外,syscalls_zx_nanosleep_zero_duration 核心計數器必須 而會移除,同時導入 syscalls_zx_thread_legacy_yield 計數器。

實作

zx_nanosleep(0) 有 2 個呼叫網站(提供 sched_yield),以及 7 個樹狀結構內呼叫站。 也就是將工作劃分成四個 CL 。

  1. 導入新的 syscall zx_thread_legacy_yield
  2. 將樹狀結構內使用者遷移至 zx_thread_legacy_yield
  3. 從樹狀結構使用者移出。
  4. 移除 zx_nanosleep 的收益超載。

CL (1) 會提供說明文件、語言繫結更新,CL (4) 將 同時也更新說明文件(1) 和 (2) 可合併為單一 CL 但將實作與遷移作業區隔開來看起來是較為乾淨的途徑。

成效

對效能沒有任何已知影響,只有 zx_nanosleep 路徑,因為已移除分支版本。

回溯相容性

zx_nanosleep(0) 的使用者不限於 Stem 存放區。

安全性考量

現有程式碼和新程式碼的行為都完全相同 因為 zx_nanosleep(0) (現在) 等於 zx_thread_legacy_yield(0)。 為避免發生任何安全性問題,zx_nanosleep 會 直到「zx_nanosleep(0)」的所有用途完成遷移為止 至 zx_thread_legacy_yield(0)

隱私權注意事項

此提案對隱私權沒有任何影響。

測試

zx_thread_legacy_yield 的性質使得測試難以穩定可靠, 的 至少我們可以驗證傳回代碼是否符合預期。

說明文件

我們將為 zx_thread_legacy_yield 和 更新 zx_nanosleep 的項目,移除提及「0」的期限 有特殊的案例

缺點、替代方案和未知

最大的缺點在於 zx_thread_legacy_yield 是吸引人的等待模式,但 sched_yield 已經提供這項機制。這些疑慮可緩解 提供了適當的說明文件和最佳做法由於 這類系統呼叫都是驅動程式,因此你應仔細確認任何其他用途。

另一個考慮的替代方案是將魔法值變更為 其他來源 (例如 INT_MIN)。這確實是算出計算的期限 並留下特殊案例使用這個替代方案 所以需要相同的努力 新增 syscall最大缺點是 「zx_nanosleep」的期限處理方式與 也會因應期限,例如 zx_object_wait .

既有藝術品和參考資料

  • zx_nanosleep 使用 0 做為特殊值,表示「yield」。問題 其實有程式碼能有效計算期限 運算 0,但本例中的意圖並非產出,反之則相反: 執行下一個陳述式「now」。

  • 包含 yield 的程式碼通常表示發生錯誤。 可惜的是,在硬體缺乏硬體的情況下,這個情況並不常見 或適當信號模式