Prefetching이란? CPU가 앞으로 사용할 데이터를 미리 가져오는 이유 쉽게 이해하기
Prefetching은 앞으로 필요할 데이터·Resource를 미리 가져와 대기 시간을 줄이는 기술입니다. Cache·Stride·Hardware Prefetch·웹 prefetch·Cache Pollution까지 초보 기준으로 정리합니다.
CPU는 빠르고 메모리 접근은 상대적으로 느릴 수 있습니다. 배열을 순서대로 읽을 때 지금 array[10]을 쓰면 곧 11·12·13이 필요할 가능성이 높습니다. 이처럼 앞으로 사용할 가능성이 높은 데이터나 명령어를 실제로 필요해지기 전에 미리 가져오는 기술을 Prefetching(프리페칭, 미리 가져오기)이라고 합니다. Prefetch = Pre(미리) + Fetch(가져오기)입니다.
점심마다 김치찌개가 많다 → 김치·두부·육수를 조리대에 미리 준비
Cache와 맞으면 Hit에 가깝게
개념적으로 Main Memory에서 미리 읽어 CPU Cache에 올려 둡니다. Prefetch 없이 A가 필요하면 Cache Miss → 느린 계층에서 가져오며 기다릴 수 있습니다. Prefetch가 맞으면 A를 쓰는 동안 B를 미리 요청해, B가 필요할 때는 Cache에 이미 있을 수 있습니다. 모든 Miss를 없애지는 않고, 미래 Miss가 나기 전에 가져와 사용 시점에는 Hit에 가깝게 만드는 것이 목표입니다.
Sequential · Stride · Pointer Chasing
주소를 연속으로 읽는 Sequential Access나, 100→164→228처럼 일정한 간격(Stride)은 예측하기 쉽습니다. Random Access는 다음 주소를 알기 어렵습니다. 배열은 메모리에 연속일 가능성이 높고, Linked List는 다음 주소가 현재 Node 안에 있어 Pointer Chasing이 됩니다. 데이터가 도착하기 전엔 다음 주소를 모르므로 Prefetch가 어렵고, 이전 글의 Dependency Chain과도 연결됩니다.
배열: [A][B][C][D] → 다음 칸 예상 쉬움 리스트: A →(주소)→ B →(주소)→ C → 도착 전엔 모름
Hardware · Software Prefetch
CPU가 접근 패턴을 보고 자동으로 가져오는 것이 Hardware Prefetcher입니다. 개발자·Compiler가 「조금 뒤 이 주소가 필요하니 미리」라고 힌트하는 것이 Software Prefetching입니다. 일반 JavaScript에서는 CPU Prefetch 명령을 거의 쓰지 않고, C/C++ 고성능 코드에서 Intrinsic 등으로 쓰는 경우가 있습니다. Hardware가 이미 잘하면 수동 Prefetch는 효과가 없거나, 틀리면 더 느려질 수 있습니다.
Useless Prefetch · Cache Pollution · Timing
가져왔는데 쓰지 않으면 Useless Prefetch입니다. 불필요 데이터가 Cache를 채우며 자주 쓰는 데이터를 밀어내면 Cache Pollution입니다. 정확도(Prediction Accuracy)와 시점(Timeliness)이 중요합니다. 너무 늦으면 도착 전에 필요하고, 너무 이르면 사용 전에 Cache에서 밀려납니다. 현재보다 얼마나 앞을 가져올지가 Prefetch Distance입니다. Cache Line 단위로 주변 바이트가 함께 오는 것도 「주변을 미리 쓴다」는 점에서 비슷한 효과를 줍니다.
Matrix · Tiling · OoO와의 차이
행 우선 저장이면 행 방향 순회는 연속 접근에 가깝고, 열 방향은 주소를 크게 건너뛸 수 있습니다. 같은 O(n²)라도 접근 패턴으로 속도가 달라질 수 있습니다. 큰 Matrix를 Cache에 맞는 작은 Tile로 나누는 Blocking / Tiling은 Working Set을 줄여 Miss·쓸모없는 Prefetch 배출을 줄입니다. Out-of-Order Execution은 「기다리는 동안 다른 명령」이고, Prefetching은 「기다리기 전에 데이터를 미리」입니다. 둘을 함께 쓰기도 합니다. Branch Prediction이 틀리면 잘못된 경로의 Speculative Prefetch가 낭비될 수 있습니다.
Bandwidth · Demand Load
Memory Bandwidth는 일정 시간에 CPU↔메모리로 얼마나 보낼 수 있는가입니다. Prefetch는 Bandwidth를 무한히 늘리지 않고, Latency를 숨기는 데 가깝습니다(택배 배송일은 같고 「내일 쓸 것을 오늘 주문」). 과도한 Prefetch는 실제 필요한 Demand Load와 경쟁해 Resource Contention을 만들 수 있습니다. Latency는 「하나 기다리는 시간」, Bandwidth는 「한꺼번에 얼마나」입니다.
웹 Prefetch · Preload · Lazy
원리만 같고 계층은 다릅니다. CPU Prefetch는 Memory→Cache, 웹은 네트워크 Resource를 미리 받습니다. <link rel="prefetch">는 다음 탐색용(낮은 우선순위), Preload는 현재 페이지에 곧 필요한 Resource(높은 중요도)에 가깝습니다. DNS Prefetch·Preconnect는 이름 조회·연결 준비를 앞당깁니다. 과도하면 데이터·Cache 낭비이고, 현재 CSS보다 Prefetch 이미지가 앞서면 잘못된 최적화입니다. Prefetch는 「미리」, Lazy Loading은 「늦게」 — 시점 최적화의 반대 방향입니다. Hover·무한 스크롤 Prefetch도 Timing·사용률을 봐야 합니다. CDN Edge를 미리 채우는 Cache Warming도 「요청 전에 가까이 준비」라는 넓은 아이디어입니다. 브라우저 캐시 전략과도 함께 봅니다. 주문·결제 같은 Write는 Prefetch 대상이 아닙니다.
정확한 Prefetch → 기다림 감소 과도한 Prefetch → 네트워크·Cache·Bandwidth 낭비
자주 묻는 질문
Prefetching이란?
앞으로 쓸 가능성이 높은 데이터·Resource를 필요해지기 전에 미리 가져와 대기 시간을 줄이는 기술입니다.
배열이 유리한 이유는?
순차·규칙적 Stride라 다음 주소를 예측하기 쉽기 때문입니다.
Linked List는?
Pointer Chasing으로 다음 주소가 현재 데이터에 묶여 Prefetch가 어렵습니다.
많이 할수록 좋은가?
아닙니다. Cache Pollution·Bandwidth 낭비가 날 수 있습니다.
OoO와 차이는?
OoO는 대기 중 다른 명령을, Prefetch는 데이터 자체를 미리 가져옵니다.
웹 Prefetch와 같나?
원리는 비슷하지만 CPU Memory↔Cache와 브라우저 네트워크는 다른 계층입니다.
SEO와 관련있나?
SEO 전용 기술은 아닙니다. 적절한 Loading이 체감 속도에 도움이 될 수는 있습니다.
정리
Prefetching = 필요할 것을 미리 가져와 사용 순간의 대기를 줄이는 기술입니다. Latency 자체를 없애기보다 다른 작업과 겹쳐 숨깁니다. 무엇을·언제·얼마나가 핵심이고, 틀리면 Cache·Bandwidth만 씁니다. Prefetch를 잘해도 CPU와 메모리 사이에 한 번에 실을 수 있는 양에는 한계가 있습니다. 이처럼 CPU와 메모리 사이에서 일정 시간 동안 전달할 수 있는 데이터의 한계를 Memory Bandwidth(메모리 대역폭)라고 합니다.