| RFC-0187:允許程序中的第一個執行緒以 zx_thread_start 啟動 | |
|---|---|
| 狀態 | 已接受 |
| 區域 |
|
| 說明 | 目前程序中的第一個執行緒必須以 zx_process_start 啟動。這項 RFC 建議允許使用 zx_thread_start 啟動第一個執行緒。 |
| Gerrit 變更 | |
| 作者 | |
| 審查人員 | |
| 提交日期 (年-月-日) | 2022-08-04 |
| 審查日期 (年-月-日) | 2022-09-31 |
摘要
這項 RFC 建議允許使用 zx_thread_start 啟動程序中的第一個執行緒,而不變更控制代碼轉移的語意。
提振精神
目前,程序中的第一個執行緒必須使用 zx_process_start 啟動,後續執行緒則必須使用 zx_thread_start 啟動。這兩種系統呼叫方式有兩項差異:
zx_process_start需要程序和執行緒的控制代碼才能啟動,而zx_thread_start只需要執行緒的控制代碼。zx_process_start允許呼叫端將控制代碼轉移至已啟動的程序。
如果用戶端未使用 zx_thread_start 明確啟動執行緒 (例如使用標準執行緒程式庫),這項限制可能會導致需要進行大量因應措施。
以 Starnix 為例,該程式碼使用 Rust 的 std::thread 建立及啟動新執行緒。Starnix 在程序中建立第一個執行緒時,無法告知基礎程式庫「建立但不啟動」執行緒,也無法告知程式庫使用 zx_process_start 而不是 zx_thread_start。
本 RFC 建議允許用戶端在程序生命週期內,對所有執行緒使用 zx_thread_start,而非強制用戶端解決這類問題。
請注意,這項作業不需要變更處理程序之間控制代碼的轉移語意。zx_process_start仍是將帳號代碼轉移至新程序的唯一方法。
利害關係人
誰會受到這項 RFC 是否通過的影響?(這個部分為選填,但建議填寫)。
協助人員:davemoore@google.com
審查者:
- abarth@google.com
- cpu@google.com
- mcgrathr@google.com
- travisg@google.com
已諮詢:
社交:
過去一年來,我們已與核心團隊的各個成員討論這項異動。
設計
這項 RFC 不會要求變更介面,只會變更在程序中第一個執行緒上呼叫 zx_thread_start 的語意。
實作
這項變更允許使用 zx_thread_start(thread, thread_entry, stack, arg1, arg2) 在程序中啟動任何執行緒。呼叫 zx_thread_start 等同於呼叫 zx_process_start(process, thread, entry, stack, ZX_HANDLE_INVALID, arg2)。
唯一的差別在於 zx_thread_start 不需要明確的程序控制代碼,且允許呼叫端設定 arg1 (保留給 zx_process_start 中的 ZX_HANDLE_INVALID)。
您可以在單一變更中完成實作,詳情請參閱這篇文章。
效能
系統會對變更執行標準核心基準測試。
人體工學
這項異動可讓用戶端在程序中建立所有執行緒時,使用標準執行緒程式庫,進而提升人體工學。
安全性考量
程序間的控制代碼轉移方式維持不變,且在程序中的第一個執行緒啟動後呼叫 zx_process_start 會導致錯誤。
說明文件
zx_process_start 和 zx_thread_start 的說明文件將更新,以反映新的語意。