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 變更:
- 新增
zx_thread_legacy_yield
- 簡化
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 。
- 導入新的 syscall
zx_thread_legacy_yield
。 - 將樹狀結構內使用者遷移至
zx_thread_legacy_yield
。 - 從樹狀結構使用者移出。
- 移除
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
的程式碼通常表示發生錯誤。 可惜的是,在硬體缺乏硬體的情況下,這個情況並不常見 或適當信號模式