文章
关于Rust的运行时
目录
Rust 运行时 & 异步生态全景(含 C/C++ 对比)#
1️⃣ Rust 语言层面的运行时 vs C/C++#
| 功能 | Rust 标准库 runtime | C/C++ | 说明 |
|---|---|---|---|
| 内存分配 | 默认 allocator(jemalloc 或系统 allocator) | malloc/free | 两者都需要分配器 |
| panic/异常 | panic! → unwind 或 abort | C++ 异常 throw / C 直接 return/setjmp-longjmp | Rust 可以选择 abort 去掉栈展开,C++ 异常依赖编译器 runtime |
| 线程与 TLS | std::thread + TLS | pthread 或 OS API | 基础线程和 TLS 支持,Rust 更语言级封装 |
| 数组越界/整数溢出检查 | debug 模式下 runtime check | 无默认检查 | Rust 额外保证安全性,C/C++ 默认不检查 |
| 异步运行时 | 无,需要 Tokio/async-std 等库 | 无 | 都不提供语言级异步调度 |
| 标准库 I/O | 阻塞 std::net / std::fs | 阻塞 POSIX / Win32 API | Rust 封装成类型安全接口,但底层也是阻塞系统调用 |
总结:Rust runtime 更轻量、更安全,允许去掉 panic unwind 和堆分配实现“零运行时”。C/C++ runtime 更接近系统,安全性和抽象较弱。
2️⃣ async/await 与 Future#
- Rust:
- async fn → Future 状态机(惰性)
- 语言本身不执行,需要 runtime
- C/C++:
- 标准库没有 async/await
- C++20 引入 coroutines,但也只是生成协程对象,需要用户或库提供 scheduler 才能执行
类比:Rust 的 async/await + Future = C++ coroutine + 用户调度器,但 Rust 更系统化。
3️⃣ 异步运行时库#
| 库 | 特点 | 对比 C/C++ |
|---|---|---|
| Tokio | 高性能、多线程 work-stealing、I/O Reactor | 类似于 C++ ASIO + 自己写的线程池 + Reactor |
| async-std | 标准库风格、易用 | 更像简单的单线程协程库 |
| 作用 | 执行 Future,管理任务和 I/O | C/C++ coroutine 也需要类似 runtime 或框架才能执行 |
4️⃣ Tokio 本质#
- 任务调度器 + 异步 I/O 事件循环 + 线程池
- 没有 Tokio,Rust 的 Future 永远不会执行
- 类比 C++:
- Boost.Asio / libuv / libevent + 自己的协程 scheduler
- 需要自己手动轮询协程,Tokio 集成了这些功能并提供生态
5️⃣ 异步生态总结对比#
| 方面 | Rust | C/C++ |
|---|---|---|
| 标准库 async | 无 runtime,只提供 Future 状态机 | C++20 coroutine 也只提供协程对象 |
| 异步运行时 | Tokio / async-std / smol | libuv / Boost.Asio / 自己实现调度器 |
| 任务调度 | 内置 scheduler(Tokio) | 自己写线程池 + reactor 或使用库 |
| 安全性 | 高(内存安全 + panic unwind 可控) | 低(需要手动管理内存、异常安全) |
✅ 总结#
- Rust 核心 runtime 很轻量、安全,可选去掉
- Rust 标准库 不提供异步运行时,async/await 只生成 Future
- Tokio 是库级运行时:任务调度 + Reactor + 线程池
- C/C++ 没有内置 async runtime,类似功能需要自己实现或依赖库
- Rust 异步生态成熟,尤其 Tokio 让高性能网络服务变得可行