Also as “ARC: A Self-Tuning, Low Overhead Replacement Cache” by the same authors. In Proceedings of 2nd USENIX Conference on File and Storage Technologies (FAST), pp.115–130, San Francisco CA, Mar 31–Apr 2 2003.

This is the paper that proposed Adaptive Replacement Cache (ARC) as a caching algorithm.

ARC implements with two LRU (lease recently used) queues \(L_1\) and \(L_2\). Where \(L_1\) is storing objects that seen only once and \(L_2\) is storing objects that referenced at least twice. Supposedly, the union of these two LRU queues, which each holds at most \(c\) items, can provide a better cache than a single LRU queue because it solves the temporal locality problem. But then the total amount of memory is \(2c\).

ARC therefore assumes \(L_1=T_1+B_1\) and \(L_2=T_2+B_2\) which the union of \(L_1\) and \(L_2\) is called the directory (with size limit of \(2c\) and \(L_1\) is no bigger than \(c\)) and the union of \(T_1\) and \(T_2\) is the cache (with size limit of \(c\)). Only the items in cache is stored in memory. Directory indexes the ID of the objects only. The maximum size of the caches \(T_1\) and \(T_2\) are \(p\) and \(c-p\) respectively, where \(p\) is adaptive.

When an object is referenced, it is put into the cache, using the following algorithm:

- If cache hit in \(T_1+T_2\): Move the item to MRU position of \(T_2\)
- If directory hit in \(B_1\), then
*p*is too small. So load the object into MRU position of \(T_2\) and set \(p=\min(c, p+\max(\lvert B_2\rvert/\lvert B_1\rvert),1))\) - If directory hit in \(B_2\), then
*p*is too big. So load the object into MRU position of \(T_2\) and set \(p=\min(c, p-\max(\lvert B_1\rvert/\lvert B_2\rvert),1))\) - If directory miss, do not adjust
*p*but replace items in the directory/cache as follows- If \(\lvert L_1\rvert=c\), delete the LRU of \(L_1\) (which is also the LRU of \(B_1\))
- If \(\lvert L_1\rvert<c\), delete the LRU of \(L_2\) (which is also the LRU of \(B_2\))
- Then load the item into the MRU position of \(T_1\)

In the above algorithm, we will move an item from \(T\) to \(B\) if necessary so that the size constraint imposed by the parameter \(p\) is honoured.

## Bibliographic data

```
@article{
title = "Outperforming LRU with an Adaptive Replacement Cache Algorithm",
author = "Nimrod Megiddo and Dharmendra S. Modha",
affiliation = "IBM Almaden Research Center",
journal = "IEEE Computer Magazine",
pages = "58--65",
month = "April",
year = "2004",
}
```