| 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 中,arg1 保留给 ZX_HANDLE_INVALID)。
实现可以在一次更改中完成,请参阅此处。
性能
标准内核基准将针对相应更改运行。
工效学设计
此项更改允许客户端在进程中创建所有线程时使用标准线程库,从而提高客户端的人体工程学性能。
安全注意事项
进程之间的句柄转移保持不变,并且在进程中的第一个线程启动后调用 zx_process_start 会导致错误。
文档
zx_process_start 和 zx_thread_start 的文档将更新以反映新的语义。