You already know the KV cache — every token a model generates stores its keys and values so the next one is cheap. But that cache is enormous and grows unpredictably. This is how a serving engine manages it the way an operating system manages memory: fixed pages to stop waste, and shared prefixes to reuse work across requests.
A request's cache grows one token at a time, and you can't know in advance how long it will get. The naive fix — reserve the maximum up front — leaves most of the memory empty and unusable.
Operating systems beat fragmentation decades ago with virtual memory: chop memory into fixed pages and let a page table scatter them anywhere. PagedAttention does exactly this to the KV cache.
Many requests start with the same tokens — a long system prompt, a few-shot example, a chat history everyone shares. Caching that prefix once, for all of them, is RadixAttention.
Paging and prefix-sharing squeeze more requests into the cache — but every number in it still takes real bytes. Next, quantization: shrinking the weights and the cache from 16 bits down to 8 or 4, and what that costs in accuracy.