Homonym Problem: 가상 주소 캐시의 프로세스 간 충돌
Homonym Problem이 가상 주소 기반 캐시에서 발생하는 원인과 Cache Purging, PID Tag, 물리 주소 태그의 선택 기준을 정리한다.
2026-08-14 · 최초 발행 2025-12-28
같은 가상 주소가 같은 데이터를 뜻하지 않을 때
가상 메모리 환경에서는 프로세스마다 독립된 주소 공간을 사용한다. 따라서 서로 다른 프로세스가 같은 가상 주소를 쓰더라도, 실제로 참조하는 물리 메모리는 다를 수 있다.
문제는 가상 주소를 기준으로 캐시를 찾는 경우다. 컨텍스트 스위칭으로 실행 프로세스와 페이지 테이블이 바뀌어도 캐시에 남은 항목은 즉시 바뀌지 않는다. 새 프로세스가 이전 프로세스와 같은 가상 주소를 요청하면, 캐시는 서로 다른 물리 메모리에 해당하는 기존 데이터를 히트로 판단할 수 있다. 이 현상이 Homonym Problem이다.
이 문제는 프로세스 간 데이터 격리를 무너뜨릴 수 있으며, 잘못된 데이터 참조와 재현하기 어려운 간헐적 오류로 이어진다.
컨텍스트 스위칭 뒤 일어나는 충돌
P1이 가상 주소 100번지에 값 2000을 기록했다고 가정한다. 캐시에는 (가상주소: 100, 데이터: 2000)이 저장되고, 이 주소는 예를 들어 물리 주소 5000번지에 대응한다.
이후 CPU 스케줄러가 P2로 전환하면 페이지 테이블은 P2의 것으로 교체된다. 그러나 캐시에는 P1의 항목이 남아 있다. P2가 가상 주소 100번지를 읽을 때 캐시 히트가 발생하면, P1이 쓴 값 2000이 반환된다. P2의 가상 주소 100번지는 물리 주소 7000번지를 가리켜야 하므로 이는 잘못된 참조다.
캐시가 단순히 주소 비트만으로 데이터를 식별할 수 없다는 점이 이 문제의 핵심이다.
캐시를 비워 경계를 다시 만든다
Cache Purging은 컨텍스트 스위칭 때 캐시 전체를 무효화하는 방식이다. 새 프로세스를 실행하기 전에 모든 캐시 엔트리를 제거하므로 Homonym Problem을 완전히 막을 수 있고, 별도 하드웨어 구조도 필요하지 않다.
대신 유효한 데이터까지 함께 제거된다. 전환 직후에는 콜드 스타트가 발생하며, 컨텍스트 스위칭이 잦을수록 오버헤드와 캐시 활용도 저하가 커진다.
단순성이 우선인 임베디드 시스템, 프로세스 전환이 드문 환경, 추가 하드웨어 로직을 두기 어려운 조건에서 선택할 수 있다.
프로세스 식별자를 캐시 키에 더하는 방법
PID Tag 방식은 캐시 엔트리를 (PID, 가상주소, 데이터) 형태로 저장한다. 검색할 때 현재 프로세스의 PID와 캐시 엔트리의 PID가 모두 일치해야 히트로 처리하므로, 같은 가상 주소라도 다른 프로세스의 데이터와 구분된다.
컨텍스트 스위칭 뒤에도 캐시를 유지할 수 있고, 특정 프로세스의 엔트리만 선택적으로 무효화할 수도 있다. 여러 프로세스가 오가는 멀티태스킹 환경에서는 캐시 재사용 측면에서 유리하다.
그 대가로 PID 비트만큼 저장 공간이 늘고, 검색 경로에는 PID 비교 로직이 추가된다. PID를 재사용할 때 충돌을 피할 처리도 필요하다.
프로세스 전환이 빈번한 멀티태스킹 OS, 프로세스 수가 제한되어 PID 필드 크기를 관리할 수 있는 환경, 예측 가능한 성능이 필요한 실시간 시스템에 적합하다.
물리 주소의 유일성으로 구분하기
Physical Address Tag는 가상 주소를 물리 주소로 변환한 뒤 캐시를 검색한다. 물리 주소는 시스템 전체에서 유일하므로, 같은 가상 주소가 다른 프로세스에서 다른 물리 메모리를 가리키는 Homonym Problem을 원천적으로 차단한다.
주소 변환 비용은 TLB를 활용해 줄인다. TLB 히트에서는 변환 결과를 바로 사용하지만, TLB 미스에서는 페이지 테이블 조회가 필요하다. 이 때문에 TLB와의 연동 로직 및 초기 지연을 고려해야 한다.
공유 메모리를 자주 사용하는 환경에서는 여러 프로세스가 같은 물리 메모리를 공유할 때 캐시를 재사용할 수 있다. TLB 히트율이 높은 고성능 서버와, 프로세스 수가 많아 PID Tag가 비효율적인 대규모 시스템도 이 방식을 고려할 수 있다.
선택지별 성능과 복잡도
| 방안 | 컨텍스트 스위칭 오버헤드 | 캐시 히트율 | 메모리 접근 속도 |
|---|---|---|---|
| Cache Purging | 높음 (캐시 전체 비우기) | 낮음 (항상 콜드 스타트) | 느림 |
| PID Tag | 낮음 (캐시 유지) | 높음 (다중 프로세스 캐시 공존) | 빠름 |
| Physical Address Tag | 중간 (TLB 의존) | 중간 (공유 메모리 시 유리) | 중간 (TLB 오버헤드) |
하드웨어 관점에서 Cache Purging은 기존 캐시와 플러시 신호만 있으면 되어 가장 단순하다. PID Tag는 PID 저장 공간과 비교 로직이 필요해 중간 수준의 복잡도를 갖는다. Physical Address Tag는 TLB 통합과 주소 변환 파이프라인까지 고려해야 하므로 가장 복잡하다.
계층별로 태그 전략을 나누는 현대 프로세서
현대 프로세서는 한 가지 방식만 고정하기보다 캐시 계층별 목표에 따라 방식을 조합한다. L1 캐시는 속도를 우선해 PID Tag 또는 가상 주소를 사용할 수 있고, L2/L3 캐시는 일관성을 우선해 Physical Address Tag를 사용한다. 주소 변환 부담은 대형 TLB로 줄인다.
ARM의 ASID(Address Space Identifier), x86-64의 CR3 레지스터 확장인 PCID(Process-Context Identifier), 프로세스 태그를 넣는 Tagged TLB도 이 문제를 다루는 기술이다.
Homonym Problem의 대응 방식은 단순성, 멀티태스킹 효율, 주소 일관성 사이의 선택이다. 캐시 구조와 운영체제의 프로세스 전환 특성에 맞춰 이 경계를 설계해야 한다.