LRU هنگام کمبودِ ظرفیت،قلمی را حذف میکند که دسترسیاش از همه قدیمیتر است. این با حذفِ قلمی که زودتر وارد شده،یعنی FIFO،فرق دارد؛ خواندنِ موفق در LRU ترتیب را عوض میکند. تمرین این صفحه یک کشِ کوچک را واقعاً اجرا میکند و نشان میدهد LRU حتی در یک مثال کوتاه هم لزوماً hit بیشتری از FIFO ندارد.
پنج درخواست،دو جایگاه
ظرفیت دو قلم و درخواستها به ترتیب A،B،A،C،B هستند. مقدارهای نمونه،حرف کوچکِ همان کلیدند و هیچ فایل یا API خوانده نمیشود. در LRU،دو درخواست اول miss هستند؛ خواندنِ A موفق است و آن را تازهترین میکند. ورودِ C سپس B را حذف میکند،نه A را.
درخواست آخرِ B دوباره miss است. مجموع hitهای LRU در این trace یک است. FIFO با خواندن A ترتیب ورود را تغییر نمیدهد؛ ورود C،قلمِ A را حذف میکند و B برای درخواستِ آخر باقی میماند. پس FIFO در همین داده دو hit دارد. این شاهد،تضمینِ برتری همیشگیِ هیچکدام نیست.
قدیمیترین دسترسی را کجا ببینیم؟
کد از OrderedDict استفاده میکند و ترتیبِ چپ به راست،قدیمیترین تا تازهترین است. در hit،کلید با move_to_end به انتهای راست میرود. در miss،مقدار نمونه وارد میشود و اگر تعداد از ظرفیت گذشت،popitem(last=False) قلمِ سمت چپ را برمیدارد. داده و ترتیب هر دو بخشی از وضعیتاند.
دفترِ هر درخواست،hit یاmiss،مقدارِ خواندهشده،کلیدِ حذفشده و ترتیبِ جدید را دارد. فقط گزارشِ اندازهٔ کش کافی نیست؛ دو کشِ دوعضوی ممکن است اقلامِ برابر ولی ترتیبِ متفاوت و تصمیم حذفِ بعدیِ متفاوت داشته باشند.
Noneِ ذخیرهشده miss نیست
وجودِ کلید با in بررسی میشود،نه با اینکه مقدارش None هست یا نه. در آزمونِ جدا،A با مقدار None وB با۲ ذخیره میشوند. خواندنِ A یک hit واقعی با مقدار None است؛ مقدارِ جایگزینِ «would be miss» استفاده نمیشود. APIای که نبود وNone را یکی بگیرد،میتواند بیدلیل دوباره محاسبه کند.
نوشتنِ دوبارهٔ B با مقدار۹ هم جدا اجرا میشود. در قراردادِ LRU این فایل،overwrite آن را تازهترین میکند؛ پس از خواندن A و سپس نوشتن B،ترتیب A،B است. این سیاست را باید اعلام کرد؛ صرفِ تغییرِ مقدار در یک dict معمولی الزاماً همین جابهجایی نیست.
ظرفیت صفر را مخفیانه یک نکنیم
ظرفیت صفر در این نمونه یعنی نتیجه به فراخواننده داده میشود،اما چیزی در کش نمیماند. ظرفیت یک فقط آخرین قلمِ نگهداشتهشده را دارد. ظرفیت بولین،منفی،بیش از۸ و غیرصحیح در آزمونها رد شدهاند. این اعداد سقف تمریناند،نه محدودیت ذاتیِ روش یا محصولی واقعی.
برای کنترل مستقل،یک مدلِ سادهٔ فهرستی نوشتهایم: hit،کلید را از محل قبلی برمیدارد و انتهای فهرست میگذارد؛ miss مجاز نیز وارد و عضوِ اضافه از ابتدا حذف میشود. تمام رشتههای A،B،C با طول صفر تا۶ و ظرفیتهای۰،۱،۲،۳،یعنی۴۳۷۲حالت،از نظر hitها و ترتیبِ نهایی با این oracle برابرند.
حذف ظرفیت با نامعتبرشدن فرق دارد
LRU دربارهٔ انتخاب قربانیِ ظرفیت است؛ خودش نمیگوید یک جواب هنوز تازه،مجاز یا متعلق به همان کاربر است. TTL،نسخهٔ داده،مجوز دسترسی و منبعِ پاسخ،قراردادهای جدا میخواهند. همچنین این کد تضمینِ thread-safe،کش توزیعشده،ماندگاری یا مصرفِ RAMِ واقعی نمیدهد.
ابطالِ کش پاسخ مرزِ داده و مجوز را توضیح میدهد؛ KV cache هم نگهداشتن K وV داخلِ محاسبهٔ مدل است. اینجا فقط ترتیبِ دسترسی و حذفِ ظرفیت در حافظهٔ کوچکِ آموزشی اجرا میشود. برای ادامه به مبانی هوش مصنوعی بروید؛ نوع کشِ داخلی یا نسبتِ کاهشِ هزینهٔ اپرا از این تمرین نتیجه نمیشود.
فایل تمرین و منبع
کد مستقلِ تمرین و کنترلها؛ Python · ورودیها و تمام خروجی واقعیِ همین تمرین؛ JSON
منابع در 2026-11-04 خوانده شدند؛ این تاریخ، تاریخ انتشار منبع نیست. مثالها و فایلهای این راهنما آموزشی و ساختهٔ تحریریهاند.