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
的文档将更新,以反映新的语义。