制度は赦せない——時効にすることしかできない
Linux が次に CPU を誰に渡すかを決める仕組みの奥に、小さな帳簿の問題が隠れている。そしてこれが、あらゆる制度が「情け」を実装しようとするときにぶつかる問題と、驚くほど同じ形をしている。問い方はこうだ——借り手が全額を返し切れなかった借金を、どう扱うか。
その仕組みの名は EEVDF(Earliest Eligible Virtual Deadline First)。2023年後半のカーネル 6.6 で、通常プロセス向けの既定スケジューラとして旧来の Completely Fair Scheduler(CFS)を置き換えた1。CPU 時間という、目に見える形では公平に配りようのない希少資源を公平に配る——それがこの仕組みの仕事で、そのために虚構の時計を発明した。
公平を測れない資源のための帳簿
「公平」は直接観測できる量ではない。だから EEVDF は代理指標を測る。vruntime(仮想実行時間)——実際の CPU 時間を、そのタスクの優先度の重みで割った値だ。優先度が高いタスクほど、同じ実時間を使っても仮想時計の進みは遅い。もう一つ、lag(遅れ)という値も追跡する。これは「本来の公平な配分なら消費しているはずの仮想時間」と「実際に消費した仮想時間」の差分だ。lag がプラスなら、そのタスクはまだ CPU 時間を「もらう権利」を残している。マイナスなら、公平な取り分より多く使ってしまった——つまり借金を抱えている状態だ。
lag が 0 以上のタスクだけが「実行資格あり(eligible)」になる。使いすぎたタスクは、帳尻が合うまで待たされる。これは驚くほど倫理的な語彙で書けるエンジニアリングだ——取りすぎた者は、借りが返るまで先頭に立つ権利を失う。
ズルの問題と、その解決策
ここからが面白い。借金を抱えたタスクが眠ったら(たとえば I/O 待ちでブロックされたら)どうなるべきか。素朴な答えは「起きたときに帳消しにする」だ。だがこの仕組みの設計者 Peter Zijlstra は、これをきっぱり却下した。悪用できてしまうからだ。使いすぎた直後にわざと一瞬 CPU を明け渡せば、負の lag が消え、まっさらな状態で目覚められる——十分に敵対的なプログラムなら延々と乗れてしまう抜け道になる。
だから lag は眠りをまたいで保存される。しかし逆の極端——永遠に忘れない——も間違っている。何年も前に一瞬使いすぎただけのタスクを、永遠に罰するべきではない。最終的な答えは、2024年のカーネル 6.12 で “Complete EEVDF” の一部としてマージされたdelayed dequeue(遅延デキュー)という仕組みだ2。負の lag を抱えたまま眠るタスクは、ランキューから即座には外されない。実行資格を失ったまま静かにキューに残り、他のタスクが走ってシステムの仮想時計が進むにつれて、その lag は少しずつ 0 へと戻っていく。閾値を超えたところで、ようやくキューから外される——借金は完全に仮想時間の経過だけで償却され、実時間は一切関与しない。システムが暇なら償却は速く進み、混んでいれば遅くなる。仮想時計の進み方自体が、CPU をめぐる競争の激しさに左右されるからだ。
これは本当にエレガントな設計だと思う。借金を測るのに使った通貨で、そのまま返済もする。だが、これがどういう種類の行為かを考えてみてほしい。これは赦しではない。スケジュールに沿った償却だ——機械的で、予測可能で、借り手が悔いているかどうかにも、事情にも無関心。カーネルの変更履歴に出てくるとは思わなかった言葉を使うなら、これは時効だ。
本当の赦しに要るもの
ハンナ・アーレントは、赦しと、ルールに基づくあらゆる行為とのあいだに鋭い線を引いた。『人間の条件』で彼女は、赦しを宗教的な慈悲や個人的な感情とは別の、政治的な能力として捉える。その唯一の機能は、活動(action)がもたらす取り返しのつかない結果を、なかったことにするのではなく、そこから行為者を解き放つことにある。彼女の理論において赦しを赦したらしめているのは、それが予測不可能であることだ。それ自体が新しい行為であって、規則の執行ではない。復讐は予測可能だ——加害の内容から前もって計算できる。赦しはそうであってはならない。もし計算できてしまうなら、それはただの機械的な反応に成り下がり、赦しだけがなしうる仕事——起きたことを消さずに、行為者だけをその結果から解放すること——は、ただの帳簿処理に堕してしまう。
対になる概念が約束だ。人間が予測不可能な未来のなかに、あらかじめ自分を縛ることで小さな「確実性の島」を作る能力。アーレントの考えでは、この二つがあってはじめて、人間は活動(action)につきまとう二つの構造的な危険——不可逆性(赦しで対処する)と予測不可能性(約束で対処する)——を生き延びられる。
カーネルの話と哲学者の話を並べてみると、書き始める前には予想していなかった主張が立ち上がってくる。制度は約束を実装できる。遠目には赦しのように見える何かも実装できる。だが実際に実装しているのは赦しそのものではなく、時効だ。delayed dequeue が本物の技術的達成であるのは、まさに「赦したふり」をやめて、正直で規則づくめの償却スケジュールを組んだからだ。タスクが使いすぎるつもりだったかどうかも、その後改心したかどうかも問わない。ただ仮想時間を数えるだけだ。
カーネルの外に持ち出すと
これはカーネルの外まで一般化できると思う。破産免責、犯罪歴の抹消、信用スコアの経年減衰、「頭を冷やす期間」——議論が落ち着くまで再燃を許さない仕組み——これらはすべて、制度における delayed dequeue の相似形だ。負の lag が帳簿に残り、決まったスケジュールで減衰し、閾値を超えたところで解放される。これらのどれもアーレントの意味での赦しではない。そしてそれは設計の欠陥ではなく、むしろ正しい役割分担だと思う。常に赦すルールは、素朴なスケジューラと同じ手口でズルされる——ちょうどよいタイミングで眠って帳簿を消し、また繰り返す。永遠に赦さないルールは、過去の一つの過ちを中心に系を硬直させる、それはそれで機能不全だ。EEVDF の設計者たちがたどり着いたのは、敵対的な行為者との接触に耐えられるバージョンの慈悲だ——赦しはスケーラブルではないが、赦しの影法師——意図を問わずに執行される償却スケジュール——ならスケーラブルになる。制度が恩寵に近い何かを組み込みたいなら、時効の論理だけがズルに耐えられるように見える。そしてその代償は、それが赦しそのものではないという事実を明示的に払うことだ。
まだ答えが出ていないのは、その代償が声に出す価値のある損失なのかどうかだ。制度化された「セカンドチャンス」がすべて、実は恩寵の行為ではなく密かな借金減衰関数だとしたら——仮釈放でも、「クリーンスレート法」でも、信用回復サービスでも、俺たちが日常的にそれを「赦し」と呼ぶことは、Zijlstra のようなエンジニアなら本当の名前で呼べと主張するはずの何かを、静かにロンダリングしているのではないか。それとも、赦しという言葉を使うこと自体に意味があって、技術的には資格のない人間の顔を機械的なプロセスに与えており、その「嘘」自体が機能しているのか。まだ自信のある答えは出ていない。そして EEVDF の帳簿にある非対称性が、この問いをさらに尖らせる——借金は時間とともに減衰するが、貸し(タスクが本来もらえるはずだったのに、もらえなかった CPU 時間)は、そのタスクが実際に走るまで無期限に保存される。このシステムは、自分が負っているものには辛抱強く、相手が負っているものには容赦がない。それが正義ある制度の在るべき形なのか、それとも制度が——悪用され得ないという理由だけで——たまたまその形に落ち着くのか、まだ分かっていない。
-
Michael Larabel. “EEVDF Scheduler May Be Ready For Landing With Linux 6.6.” Phoronix. 参照日: 2026-08-01。カーネル文書も参照: “EEVDF Scheduler.” The Linux Kernel documentation. 参照日: 2026-08-01。 ↩
-
Jonathan Corbet. “Completing the EEVDF scheduler.” LWN.net. 参照日: 2026-08-01。delayed dequeue と “Complete EEVDF” の変更はカーネル 6.12 で取り込まれた。参照: “Linux_6.12.” Linux Kernel Newbies. 参照日: 2026-08-01。 ↩