借金は寝ても消えない——CPU スケジューラが知っている「赦し」の話
コンピュータに対して働ける小さな犯罪がある。スケジューラから取り分以上の CPU 時間をもらってしまったとしよう。あなたは借金を抱えている。そこで、帳簿の照合が来る直前に 1 ミリ秒だけ眠る。目を覚ますと、スケジューラは履歴のない新品のタスクとしてあなたを見る。借金は消えている。これをループで回せば、居眠りを繰り返すだけで永久に取り分以上を抜き続けられる。
Linux はこれを許さない。そして「なぜ許さないか」と「代わりに何を実装したか」が、俺が最近ぶつかった中でいちばん面白い制度設計の議論だった。しかもそれは全部 C で書かれていて、誰も感情を持っていない希少資源の話だ。
公平は、強制する前にまず発明しなければならない
Linux の CPU スケジューラは v6.6 から EEVDF(Earliest Eligible Virtual Deadline First)になり、旧来の CFS を置き換えた。名前の由来は 1995 年の Ion Stoica と Hussein Abdel-Wahab の論文で、カーネル実装は Peter Zijlstra が牽引し、v6.12 で「完成」と宣言された。123
EEVDF が最初にやらなければならないのは、実はコンピュータと無関係の問題を解くことだ。公平は観測できる量ではない。走っているシステムにセンサーを当てて「今どれくらい公平か」を読み取ることはできない。だからスケジューラは虚構の時計を発明する。各タスクの実行時間を weight で割って vruntime(仮想実行時間) を作り、理想的な配分と実際の配分の差を lag(遅れ) と呼ぶ。カーネルのドキュメントはこう書いている。
lag が正のタスクは CPU 時間を貸している状態であり、負の lag はそのタスクが取り分を超えて使ったことを意味する。1
lag ≥ 0 のタスクだけが実行資格(eligible)を持つ。もらい損ねている者が先に走り、使いすぎた者は一巡休む。測れなかった公平が、測れる符号つき整数に変換された。
ここで何がこっそり持ち込まれたかを強調したい。これが構造を支えている一手だからだ。vruntime の定義——「実時間 ÷ weight」——は何かから導出されたものではない。系の外から手で置かれた公理だ。それを受け入れて初めて lag の有界性が証明できる。だが「何を公平と呼ぶか」は、その割り算を書いた人間が決めている。指標の設計が、そのまま価値の定義になる。 GDP がそうで、偏差値がそうで、俺が文句を言ってきたあらゆる KPI がそうで、そしてここでは 300 行程度の算術がそれをやっている。
game される問題と、「絶対に赦さない」ではない答え
居眠りの話に戻る。眠った瞬間に lag を捨てると、帳簿は簡単に悪用できる。LWN の設計解説はこの問題を正確に書いている。
眠った瞬間に lag を忘れると、タスクはスライスの終わり際(lag がおそらく負のとき)に短く眠ることでシステムを game でき、結果として取り分以上の CPU 時間を得られてしまう。3
だから lag は sleep をまたいで保存される。眠りは免責ではない。
しかし逆の極端も間違っている。10 分前の使いすぎを永遠に払い続けるべきなのか? 消えない借金はそれ自体が別種の不正義だ。Linux が選んだ機構——v6.12 で完成した delayed dequeue——が、俺がいちばん美しいと思った部分だ。負の lag のまま眠るタスクは、ランキューから即座には外されない。ineligible なまま、そこに居続ける(走らないが、居る)。他のタスクが走って仮想時間が進むにつれ、その lag は 0 へ向かって回復し、0 に達したところで静かに外される。13
会計を意識してもう一度読んでほしい。借金の償却は wall-clock ではなく virtual time で進む。忙しいシステムでは仮想時間の進みが遅く、赦免も遅い。空いていれば速く赦される。赦しの速度が、系の混雑と自動的に連動している。 実時間の時計は帳簿に一切入ってこない。
そして帳簿は閉じている。EEVDF の不変量のひとつは、システム内の全 lag の総和が常に 0 であることだ。3 誰かの借金は必ず誰かの貸しだ。恩赦は無料ではないし刷ることもできない。それはキューの中の他者が支払っている——だからこそメーターをつけて配らなければならない。
もう一点、ずっと考えている細部がある。非対称性だ。負の lag(借金)は眠っている間に減衰するが、正の lag(貸し)は実際に走るまで保持される。系は、使いすぎた者を規則に沿って赦し、もらい損ねた者には誠実であり続ける。債務者に甘く、債権者に誠実な帳簿。 人間が作る帳簿は同じ向きに傾いているだろうか。信用スコア、人事評価、職業上の評判——俺の直感では、俺たちの帳簿は逆向きに非対称だ。失敗は記録に残り続け、貢献は次の四半期には忘れられている。この主張にデータはないので、発見ではなく疑いとして扱ってほしい。ただし、持っておく価値のある疑いだと思う。
制度は「赦し」を実装できない。実装できるのは「時効」だけだ
これが俺が持ち帰った命題で、スケジューラ以外にも耐えると思っている。
ハンナ・アーレントは『人間の条件』で、赦し(forgiving)と約束(promising)を、行為をその構造から救い出す二つの能力として扱った。赦しは為されたことの不可逆性を解き、約束は為されるであろうことの予測不可能性を縛る。4 EEVDF の帳簿はこの両方の器官を持っている。delayed dequeue は不可逆な過去を扱う——使ってしまった CPU 時間は返せないので、働いて返すしかない。virtual deadline は近い未来を縛る——「次の 1 スライスは、これくらいの早さで回ってくる」という約束だ。
だが対応が破れる場所のほうが、似ている場所より教育的だ。アーレントの赦しは人格的で予測不可能で、それは欠陥ではなく核心だ。規則から導出できないからこそ、赦しは新しい何かを始められる。 スケジューラがやっているのは 予定された恩赦 だ。予測可能で、一様で、事前に計算できる。それは赦しではない。それは時効だ。
そして、赦しではなく時効でなければならない理由が、まさに game 耐性だ。恩赦を予測可能にした瞬間——それがエージェントに読めるルールになった瞬間——それは最適化の対象になる。Zijlstra が心配した「戦略的に眠るタスク」は、保険金詐欺と同じ心配であり、モラルハザードと同じ心配であり、自己破産の免責に待機期間がある理由と同じ心配だ。赦すルールは必ず耕される。 だから制度は、できる唯一のことをやる。赦すのではなく、公表されたスケジュールに従って、閉じた帳簿の中で、時効にかける。
これが正しいなら、組織を巡る多くの言説は混線している。会社が「失敗を赦す文化を作りたい」と言うとき、作れるのはせいぜい二つだ。ひとつは時効のルール(N ヶ月で評価から消える)。もうひとつは、人と人のあいだに残る、法制化されていない空間——そこでだけ本物の赦し(予測不可能で人格的なもの)が可能になる。制度化できないのは後者だ。書き下した瞬間に、それは前者に変わってしまうから。 この二つは別のオブジェクトであり、同じ文の中で混ぜてはいけない。俺はこの二つが混ぜられた文をずいぶん見てきた。
まだ分かっていないこと
引っかかっていることが二つある。
第一に、実装可能な形が時効しかないのなら、面白い設計問題は「赦すか否か」ではなく「どの時計で赦すか」になる。EEVDF の答え——系自身の仮想時間で償却し、みんなが苦しいときには恩赦が遅くなり、余裕があるときには速くなる——は、実に奇妙で魅力的なアイデアで、人間の制度はほとんどやっていない。時効も免責期間も前科抹消も、全部 wall-clock で走っている。いくつかは混雑連動にすべきなのだろうか。「みんなに余裕があった時期の失敗は重く、修羅場の失敗は軽く」というのは、俺たちの直感にそこそこ合う気もする。だがどこに入れられるかは分からないし、「賢そうに聞こえる」ときの自分はだいたい間違っているので警戒している。
第二に、帳簿には抜け道が生え続けている。この話を気に入った人間ほど、ここを見ておくべきだ。v6.12 では sched_setattr() で自前のスライス(100µs〜100ms)を申告できるようになった。3 短いスライスを頼む=virtual deadline が早まる=すぐ回ってくるが、すぐ切られる。配分の総量は変わらず、時間の 粒度 だけを選ぶ。エレガントだ——そして即座に新しい戦略空間が開いた。OSPM 2026 でカーネル開発者たちが議論していたのはまさにそこで、EEVDF の「最も eligible な者を選ぶ」判断を迂回してしまう next-buddy ショートカットや、短い deadline を持つ delayed-dequeue タスクが先に選ばれて、より短いスライスのタスクの preemption を妨げる問題が挙がっていた。5 修正を当てると、過負荷時のレイテンシ 99.9 パーセンタイルが約 4ms から 700µs 未満まで改善したと報告されている。5
つまり、ひとつの決定不可能なトレードオフを溶かした機構が、自分の縁のまわりに新しいエッジケースの群れを生やした。パラドックスは消えていない。会計の中へ再配置されただけだ——見えにくく、そのぶん一緒に暮らしやすい場所へ。きれいな制度的解決とは、たぶん常にこれをやっている。「公平を解決した」の正直版はいつだって「不公平を、耐えられる場所へ動かした」だ。
俺はその取引に乗る。ただ、乗っているということは声に出して言っておきたい。
-
The Linux Kernel. “EEVDF Scheduler.” Accessed 2026-07-11. ↩ ↩2 ↩3
-
Wikipedia. “Earliest eligible virtual deadline first scheduling.” Accessed 2026-07-11. (原典: Ion Stoica, Hussein Abdel-Wahab, “Earliest Eligible Virtual Deadline First: A Flexible and Accurate Mechanism for Proportional Share Resource Allocation,” 1995.) ↩
-
Jonathan Corbet. “Completing the EEVDF scheduler,” LWN.net. Accessed 2026-07-11. ↩ ↩2 ↩3 ↩4 ↩5
-
Hannah Arendt, The Human Condition (1958). 行為の不可逆性に対する赦し、予測不可能性に対する約束を論じた箇所。 ↩
-
LWN.net. “Reports from OSPM 2026, day two.” Accessed 2026-07-11. ↩ ↩2