开发者用 Rust 写用户态 Linux 调度器,称比时间还快
来源标题:Userland Linux scheduler in Rust – faster than time
一名开发者用 Rust 实现了一个用户态 Linux 调度器,声称能让纯 CPU 计算程序以“负时间”完成。其思路是在用户态更高效地调度成千上万个纯计算任务,替代内核调度器在满负载下的上下文切换开销。原文用 time -v 展示单次运行耗时 61 秒、约 218 次非自愿上下文切换。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
想象你有一个只做纯 CPU 计算、没有任何 IO 的程序:int main() { time_t start = time(NULL); do_heavy_cpu_calculations(); printf("已完成,用时 %.0f 秒\n", difftime(time(NULL), start)); 你同时运行数千个这样的程序;所有核心都 100% 忙碌。纯 CPU 运算,资源利用率 100%,但问题依然存在——我们能让它跑得更快吗?我们能否用 Rust 创建一个新的用户态调度器,让任务运行得更高效?事实上,让我们做一个效率高到程序能在负时间内完成的新调度器。什么是调度器? 什么是内核调度器?它像 Google Calendar,但粒度更细?让我们运行一个应用:$ time -v ./app 已完成,用时 61 秒 用户时间(秒):61.07 系统时间(秒):0.01 此任务占用的 CPU 百分比:99% 实际耗时(挂钟时间):1:01.30 自愿上下文切换:1 非自愿上下文切换:218 一次运行花了一分钟;这是用户态的纯 CPU 计算。系统时间是操作系统的工作。什么是上下文切换?操作系统不希望一个进程永远独占 CPU 核心,所以即使你的应用是个 while true {} 忙循环,操作系统调度器也会不时停止它,把核心交给另一个任务。这里我们切换了 218 次,平均每 330 毫秒一次。让我们同时运行 10 个应用:$ parallel -j 9 ./app ::: {1..9} >/dev/null & time -v ./app 已完成,用时 356 秒 用户时间(秒):62.96 系统时间(秒):0.06 此任务占用的 CPU 百分比:20% 实际耗时(挂钟时间):5:56.85 自愿上下文切换:1 非自愿上下文切换:36525 这里我们看到操作系统调度器在其鼎盛时期的工作——用户(我)请求了大量任务,远超可用资源能处理的数量。每个 CPU 核心(当前 VM 有 2 个)一次只能执行一件事,但光标仍在移动,音乐仍在播放。调度器不断在任务间切换,营造出许多事情在并行工作的假象。注意系统时间更大了——调度器做了更多工作,但调度器到底是什么?并没有一个运行中的调度器进程来监督所有运行中的任务并向其他任务发号施令。那它是如何工作的?操作系统无法自行运行。运行任何内核功能都需要与其他运行中的进程相同的 CPU——不是操作系统告诉它要运行什么,而是每个 CPU 核心在任务间切换,这些任务包括用户态应用和内核功能,比如调度逻辑。令人难以置信的是,内核调度器本身也是被调度的。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。