Rust in Everything
基于 tokio 1.54.1

运行时骨架

「04 调度器」讲的是任务在队列之间怎么流动。这一部分讲托住调度器的那几样东西:运行时由什么组成、代码怎么找到「当前」运行时、线程没事做时睡在哪里。源码主要在 runtime/ 目录下的 builder.rs、runtime.rs、handle.rs、context.rs、driver.rs 和 park.rs。

  1. Builder、Runtime 与 Handle:配置项按管什么分组,默认值从源码里读;Runtime 是调度器、句柄、阻塞线程池三样;Handle 是包着 Arc 的枚举,16 字节,能带到任何线程上用。
  2. 线程本地上下文:CONTEXT 这个 thread-local 的每个字段;「设置当前句柄」和「进入运行时」是两件事;两句最常见的 panic 分别从哪里来。
  3. 驱动栈与 park:时间 → 进程 → 信号 → IO 一层包一层;没开 IO 时最底层换成条件变量;叫醒一个睡着的线程走的是哪条路。
flowchart TB
  builder[Builder] -->|build| rt[Runtime]
  rt --> sched[Scheduler]
  rt --> handle["Handle:Arc"]
  rt --> pool[阻塞线程池]
  handle --> drvh[驱动句柄]
  handle --> spawner[阻塞池入口]
  sched -.持有.-> driver[驱动栈]
  ctx[线程本地 CONTEXT] -.记着.-> handle
  driver -->|park| os["mio Poll 或条件变量"]

读这一部分之前,最好先看过「从 #[tokio::main] 开始」,那里已经把 build() 和 block_on 的主干走了一遍。

💬 关联讨论

发起讨论
加载中...