2019-10-25 금요일, 트위터에 남겼던 글을 토대로 작성.

화장실 바닥 타일의 물때를 깨끗하게 닦고 쉬고 있다. 번거로운 일이다. 자동으로 매일 조금씩 물때가 사라지게 할 수 없을까? 시간마다 방향제를 분사하는 기구를 응용해서, 주기적으로 물때 제거 용액을 바닥에 자동 분사하게 해볼까? 이 방법은 다음과 같은 문제가 있을 것이다.

  • 전역에 분사하기 어렵다.
  • 항상 용액 냄새가 나게 된다. 건강에 좋지 않을 것이다.

GC 문제라고 생각해보자. 자동 GC라면 기계가 되었던 사람이 되었건 항상 누군가가 대기하여 threshold를 감지하고 일정 영역을 청소할 준비를 해놔야 한다. '처리율(throughput)'과 '짧은 일시 정지 시간'이 상충한다는 GC의 상식을 떠올려본다. 일시 정지 시간 최소화(자주 하는 청소 시간의 최소화)가 중요하다면 자주자주 짧게 짧게 청소해야 한다. 그러나 처리율 최대화(총 일상생활 시간의 최대화)가 중요하다면 쓰레기가 잔뜩 쌓이고 더 쌓일 수 없을 때를 기다려 대청소를 하는 것이 효율적이다.

대청소는 엄청 힘들지만, 자주 청소하는 것보다 오버헤드가 적으므로 총 청소 시간은 짧다. 하지만 그렇다고 효율만 생각해 물때가 온 화장실을 덮도록 놔둘 순 없다. 더럽기 때문이다.

물때로 돌아가서 생각해 보자. 청소의 기준이 되는 threshold가 어느 정도여야 가장 비용(시간)을 아낄 수 있을까? 처리율 최대화의 관점에서 생각해보면 화장실이 물때로 가득할 때이다. 하지만 그러긴 싫다. 그리고 싫은 것이 기준이 된다면 물때의 양이 주관적으로 거슬릴 때 청소하는 것이 효율적이다.

이렇게 되면 주관적으로 더러움에 크게 신경 쓰지 않는 사람일수록 \(\text{청소 시간} \over \text{청소 시간} + \text{청소하지 않는 시간}\)이 0으로 수렴할 것이므로 위생 관념이 약한 사람일수록 청소의 효율이 높아진다.

이렇게 놓고 생각해보니 내가 원하는 것이 청소의 효율이 아니라는 것을 알겠다. 나는 화장실에 들어갔을 때 항상 물때가 threshold 미만이기를 바라며, 대청소를 오래 하기를 바라지 않는다. 즉 내게 필요한 것은 일시 정지 시간 최소화다.

Java의 G1 같은 경우 영역을 나누어 동시 작업으로 어플리케이션 스레드와 GC 스레드가 같이 작업을 한다. 즉 일상생활에 청소가 녹아 있는 것이다. 그런데 컴퓨터가 아니라 리얼월드에서는 이걸 어떻게 해야 할까? 샤워하다가 발로 바닥에 세제를 묻히고 문질러줘야 할까?

그렇지 않다. 여기서 취할 수 있는 가장 그럴싸한 방법은 매일 샤워할 때마다 타일 하나씩을 닦는 것이다. 물때가 가장 많은 타일을 선택하는 것이 적절하다.

이렇게 하면 매우 짧은 일시 정지(청소) 시간으로 화장실 전체의 물때가 threshold에 도달하는 것을 예방할 수 있다. 동시에 대청소를 최대한 유예하게 된다.

즉 매일 가장 더러워 보이는 타일 하나를 닦는 습관이 필요하다는 결론. 오늘부터 해야겠다.