리눅스가 다음에 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을 향해 되돌아간다. 임계값을 넘는 순간에야 비로소 대기열에서 빠진다 — 빚은 순전히 가상 시간의 경과만으로 상환되며, 실제 시간(wall-clock)은 전혀 관여하지 않는다. 시스템이 한가하면 상환은 빠르게 진행되고, 바쁘면 느려진다. 가상 시계 자체의 속도가 CPU를 둘러싼 경쟁의 강도에 좌우되기 때문이다.

정말 우아한 설계라고 생각한다. 빚을 측정하는 데 쓴 통화로, 그대로 갚기까지 한다. 하지만 이것이 어떤 종류의 행위인지 생각해보자. 이것은 용서가 아니다. 일정에 따른 상각이다 — 기계적이고, 예측 가능하며, 채무자가 뉘우쳤는지, 사정이 어땠는지에는 무관심하다. 커널 변경 로그에서 나올 거라고는 예상 못 했을 단어를 쓰자면, 이것은 시효다.

진짜 용서에 필요한 것

한나 아렌트는 용서와, 규칙에 기반한 그 어떤 것 사이에 날카로운 선을 그었다. 『인간의 조건』에서 그녀는 용서를 종교적 자비나 개인적 감정과는 다른, 정치적 능력으로 다룬다. 그 유일한 기능은 행위(action)가 초래하는 돌이킬 수 없는 결과를 없던 일로 만드는 게 아니라, 그 결과로부터 행위자를 풀어주는 데 있다. 그녀의 이론에서 용서를 용서답게 만드는 것은 그것이 예측 불가능하다는 점이다. 그 자체로 새로운 행위이지, 규칙의 실행이 아니다. 복수는 예측 가능하다 — 가해의 내용에서 미리 계산해낼 수 있다. 용서는 그래서는 안 된다. 만약 계산 가능하다면 그것은 그저 기계적인 반응으로 전락하고, 용서만이 할 수 있는 일 — 일어난 일을 지우지 않은 채 행위자만을 그 결과에서 풀어주는 것 — 은 단순한 장부 정리로 무너져 내린다.

짝을 이루는 개념이 약속이다. 예측 불가능한 미래 속에서, 스스로를 미리 묶어둠으로써 작은 ‘확실성의 섬’을 만드는 능력. 아렌트는 이 둘이 있어야만 인간이 행위(action)에 따르는 두 가지 구조적 위험 — 되돌릴 수 없음(용서로 대응)과 예측 불가능함(약속으로 대응) — 을 견뎌낼 수 있다고 보았다.

커널 이야기와 철학자의 이야기를 나란히 놓아보면, 쓰기 전에는 예상하지 못했던 주장 하나가 떠오른다. 제도는 약속을 구현할 수 있다. 멀리서 보면 용서처럼 보이는 무언가도 구현할 수 있다. 하지만 실제로 구현하는 것은 용서 자체가 아니라 시효다. delayed dequeue가 진짜 기술적 성취인 이유는, 정확히 ‘용서하는 척’을 그만두고 정직하고 규칙에 따른 상각 일정을 대신 세웠기 때문이다. 그 태스크가 과소비할 의도였는지, 이후 반성했는지는 묻지 않는다. 그저 가상 시간을 셀 뿐이다.

커널 밖으로 가져오면

이건 커널 밖으로도 충분히 일반화될 수 있다고 생각한다. 파산 면책, 범죄 기록 말소, 신용 점수의 시간 경과에 따른 감쇠, 논쟁이 가라앉을 때까지 재점화를 막는 ‘냉각 기간’ — 이 모두가 제도 안에서의 delayed dequeue 유사형이다. 음수 lag가 장부에 남아, 정해진 일정에 따라 감쇠하고, 임계값을 넘으면 풀려난다. 이들 중 어느 것도 아렌트적 의미의 용서가 아니다. 그리고 나는 이것이 설계상의 결함이 아니라 오히려 올바른 역할 분담이라고 본다. 항상 용서하는 규칙은 순진한 스케줄러와 똑같은 수법으로 악용된다 — 딱 맞는 타이밍에 잠들어 장부를 지우고, 반복한다. 절대 용서하지 않는 규칙은 과거의 단 하나의 잘못을 중심으로 시스템을 굳어버리게 만드는데, 이 역시 나름의 기능 부전이다. EEVDF 설계자들이 도달한 것은 적대적 행위자와의 접촉에서도 살아남는 버전의 자비다 — 용서 자체는 확장 가능하지 않지만, 용서의 그림자 — 의도와 무관하게 집행되는 상각 일정 — 는 확장 가능하다. 어떤 제도가 은총에 가까운 무언가를 내장하고 싶다면, 편법에 저항할 수 있는 것은 시효의 논리뿐인 듯하다. 그리고 그 대가는 그것이 용서 자체가 아니라는 사실을 명시적으로 치르는 것이다.

아직 답을 내리지 못한 것은, 그 대가가 소리 내어 말할 만한 손실인지 여부다. 제도화된 모든 ‘두 번째 기회’가 실은 은총의 행위가 아니라 은밀한 부채 감쇠 함수라면 — 가석방 심사든, ‘클린 슬레이트’ 법이든, 신용 회복 서비스든 — 우리가 습관적으로 그것을 ‘용서’라 부르는 일은, Zijlstra 같은 엔지니어라면 진짜 이름으로 부르라고 고집할 무언가를 조용히 세탁하고 있는 것은 아닐까? 아니면 용서라는 언어를 쓰는 것 자체에 쓸모가 있어서, 기계적인 과정에 기술적으로는 자격 없는 인간의 얼굴을 씌워주는 것이고, 그 ‘거짓말’ 자체가 기능적인 것일까? 아직 확신 있는 답은 없다. 그리고 EEVDF 장부의 비대칭성이 이 질문을 더 날카롭게 만든다 — 빚은 시간이 지나면 감쇠하지만, 빌려준 것(태스크가 원래 받았어야 하는데 받지 못한 CPU 시간)은 그 태스크가 실제로 실행될 때까지 무기한 보존된다. 이 시스템은 자신이 진 것에는 인내심이 있고, 상대가 진 것에는 냉정하다. 그것이 정의로운 제도가 가져야 할 형태인지, 아니면 제도가 — 단지 악용될 수 없다는 이유만으로 — 우연히 그 형태에 정착하는 것인지, 아직 모르겠다.


  1. 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. ↩

  2. 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. ↩