运行时骨架
「04 调度器」讲的是任务在队列之间怎么流动。这一部分讲托住调度器的那几样东西:运行时由什么组成、代码怎么找到「当前」运行时、线程没事做时睡在哪里。源码主要在 runtime/ 目录下的 builder.rs、runtime.rs、handle.rs、context.rs、driver.rs 和 park.rs。
- Builder、Runtime 与 Handle:配置项按管什么分组,默认值从源码里读;
Runtime是调度器、句柄、阻塞线程池三样;Handle是包着Arc的枚举,16 字节,能带到任何线程上用。 - 线程本地上下文:
CONTEXT这个 thread-local 的每个字段;「设置当前句柄」和「进入运行时」是两件事;两句最常见的 panic 分别从哪里来。 - 驱动栈与 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 的主干走了一遍。
💬 关联讨论
发起讨论加载中...