Ephemerons

Ephemerons (에페메론)

약한 박스(weak box)를 일반화한 자료 구조인 에페메론에 대해 알아봐요. 값뿐 아니라 키(key)까지 함께 들고 있어서, 메모리 관리자가 키-값 쌍을 더 자유롭게 회수할 수 있게 도와줘요.

출처: Racket Reference

본문

16.2 Ephemerons

에페메론(ephemeron) [Hayes97]은 약한 박스의 일반화예요 (〔Weak Boxes〕 참고). 하나의 값을 담고 있을 뿐인 약한 박스와 달리, 에페메론은 두 값을 담습니다. 하나는 에페메론의 값(value)으로 간주되고, 다른 하나는 에페메론의 키(key)가 돼요. 약한 박스의 값처럼 에페메론의 값도 #f로 교체될 수 있는데, 값이 더 이상 도달 가능하지 않을 때가 아니라 키가 더 이상 도달 가능하지 않을 때(약한 참조를 통해서만 가능한 경우 제외) 교체돼요.

에페메론의 값이 유지되는 동안에는 그 참조가 비-약한(non-weak) 참조로 간주됩니다. 다만 값을 통한 키에 대한 참조는 특별히 취급되는데, 그 참조가 반드시 키의 도달 가능성(reachability)에 포함되지는 않아요. 약한 박스는 키와 값이 같은 에페메론의 특수화로 볼 수 있습니다.

에페메론의 특히 흔한 용도 중 하나는 약한 해시 테이블과 결합해, 값이 키를 참조하더라도 메모리 관리자가 키-값 쌍을 회수할 수 있는 매핑을 만드는 거예요 (〔Hash Tables〕과 make-ephemeron-hash 참고). 관련된 용도로는, 어떤 값이 impersonator인 값이 도달 가능한 동안 그 값에 대한 참조를 유지하는 게 있어요 (impersonator-ephemeron 참고).

보다 정확히 말하면,

  • 에페메론의 값은, 자동 메모리 관리자가 에페메론이나 키가 약한 참조를 통해서만 도달 가능함을 증명할 수 있을 때 #f로 교체되고 (〔Weak Boxes〕 참고),

  • 에페메론의 값에서 도달 가능한 어떤 것도 에페메론 키의 도달 가능성에 포함되지 않아요(같은 에페메론이든 다른 에페메론이든). 다만 같은 값이 비-약한 참조를 통해 도달 가능하거나, 값의 에페메론 키가 비-약한 참조를 통해 도달 가능한 경우는 예외예요 ([약한 참조에 대한 정보는 Weak Boxes 참고).

(make-ephemeron key v) → ephemeron?
key : any/c
v   : any/c

키가 key이고 값이 처음에는 v인 새 에페메론을 반환합니다.

(ephemeron-value ephemeron [gced-v retain-v]) → any/c
ephemeron : ephemeron?
gced-v    : any/c = #f
retain-v  : any/c = #f

ephemeron에 담긴 값을 반환합니다. 쓰레기 수집기가 ephemeron의 키가 약하게만 도달 가능함을 증명했다면 결과는 gced-v가 돼요 (기본값은 #f).

retain-v 인자는 에페메론의 값이 추출될 때까지 도달 가능한 것으로 유지됩니다. 예를 들어 ephemeron이 약한 eq? 기반 매핑을 통해 얻어졌고 ephemeronkey를 키로 생성되었을 때 유용해요. 그 경우 retain-vkey를 제공하면, 키가 그 외에는 도달 불가능하더라도 값이 추출될 만큼 오래 에페메론이 값을 유지하도록 보장됩니다.

버전 7.1.0.10의 package base에서 retain-v 인자가 추가되면서 변경됐어요.

(ephemeron? v) → boolean?
v : any/c

v가 에페메론이면 #t를, 그렇지 않으면 #f를 반환합니다.

더 알아보기