سیاستهای حافظهی نهان (LRU، FIFO، دورترین در آینده)
سه حافظهی نهان با یک اندازه به یک دنبالهی درخواست جواب میدهند و تعداد خطاها مقایسه میشود؛ «دورترین در آینده» بهینه است ولی باید آینده را بداند.
حافظهی نهان (cache) کوچک و سریع است و فقط k عضو جا میگیرد. درخواستی که در آن نباشد یک خطا (miss) است: عضو باید آورده شود و اگر حافظه پر است، یکی بیرون برود. کدام؟
- زمان:
O(n·k) (furthest-in-future: O(n²·k) here) - حافظه:
O(k) - CLRS، بخش ۱۵.۴
- CLRS، بخش ۲۷.۳
حافظهی ۳ خانهای و ۱۲ درخواست؛ خطاها: LRU ۱۰، FIFO ۹ و بهینه ۷.
def caching(R, k):# Three caches of size k serve the same requests: LRU, FIFO and furthest-in-future (the offline optimum).reqs = R[0]lru = [] # least recently used firstfifo = [] # oldest firstopt = []hits = [0, 0, 0]misses = [0, 0, 0]rows = [] # for the picture: each request and the three caches after itfor t in range(len(reqs)):x = reqs[t]if x in lru:hits[0] = hits[0] + 1lru.remove(x)lru.append(x)else:misses[0] = misses[0] + 1if len(lru) == k:y = lru.pop(0)lru.append(x)if x in fifo:hits[1] = hits[1] + 1else:misses[1] = misses[1] + 1if len(fifo) == k:y = fifo.pop(0)fifo.append(x)if x in opt:hits[2] = hits[2] + 1else:misses[2] = misses[2] + 1if len(opt) == k:y = furthest(reqs, t, opt)opt.remove(y)opt.append(x)rows.append([x, list(lru), list(fifo), list(opt)])return missesdef furthest(reqs, t, cache):# The cached item whose next request is furthest away (or never comes).best = cache[0]best_next = -1for y in cache:nxt = len(reqs)for s in range(len(reqs) - 1, t, -1):if reqs[s] == y:nxt = sif nxt > best_next:best = ybest_next = nxtreturn best
شروع اجرا
جدول هنوز خالی است.
متغیرهای محلی
نارنجی = در همین گام عوض شد
R list
Call stack
- caching()خط 1
توضیح
مسئله
حافظهی نهان (cache) کوچک و سریع است و فقط k عضو جا میگیرد. درخواستی که در آن نباشد یک خطا (miss) است: عضو باید آورده شود و اگر حافظه پر است، یکی بیرون برود. کدام؟
- LRU: عضوی که مدت بیشتری از آخرین استفادهاش گذشته.
- FIFO: عضوی که زودتر از همه وارد شده.
- دورترین در آینده (Belady): عضوی که درخواست بعدیاش از همه دیرتر است.
چرا «دورترین در آینده» بهینه است
با یک استدلال جابهجایی (فصل الگوریتمهای حریصانه در CLRS) میشود نشان داد هر برنامهی بهینه را میتوان قدم به قدم به همین انتخاب حریصانه تبدیل کرد بی آنکه خطاها بیشتر شوند. ولی این سیاست آفلاین است: باید آینده را بداند.
سیاستهای آنلاین
LRU و FIFO آینده را نمیدانند. هر دو k-رقابتیاند: خطاهایشان حداکثر حدود k برابر بهینه است، و هیچ الگوریتم قطعی آنلاینی بهتر از این نمیتواند (CLRS فصل ۲۷).
ورودی
R درخواستها و k اندازهی حافظه است.