حافظه نهان سی‌پی‌یو
ترجمه آدرس

بیشتر پردازنده‌های دارای کاربرد عمومی نوعی حافظه مجازی را پیاده‌سازی می‌کنند. به‌طور خلاصه، یا هر برنامه ای که روی دستگاه در حال اجرا است فضای آدرس ساده شده خود را که حاوی کد و داده مخصوص آن است، می‌بیند یا اینکه، همه برنامه‌ها در یک فضای آدرس مجازی مشترک اجرا می‌شوند. یک برنامه با محاسبه، مقایسه، خواندن و نوشتن در آدرس‌های فضای آدرس مجازی خود، به جای آدرس‌های فضای آدرس فیزیکی، اجرا می‌شود و بدین گونه، برنامه‌ها ساده‌تر می‌شوند و در نتیجه نوشتن آنها آسان‌تر است.
در حافظه مجازی، پردازنده موظف است تا آدرس‌های مجازی تولید شده توسط برنامه را به آدرس‌های فیزیکی حافظه اصلی ترجمه کند. بخشی از پردازنده که این ترجمه را انجام می‌دهد به عنوان واحد مدیریت حافظه (MMU) شناخته می‌شود. مسیر سریع از طریق MMU می‌تواند ترجمه‌هایی را که در کش ترجمه آدرس (Translation lookaside buffer) ذخیره شده‌اند، انجام دهد. TLB نوعی کش برای نگاشت‌ها از جدول صفحهٔ سیستم عامل، جدول سگمان یا هر دو است.
با هدف بحث حاضر، سه ویژگی مهم در ترجمه آدرس وجود دارد:
تأخیر (latency): بعد از اینکه آدرس مجازی از طریق تولیدکننده آدرس موجود شد، آدرس فیزیکی بعد از مدتی، شاید چند چرخه، توسط MMU در دسترس قرار می‌گیرد.
مستعار (Aliasing): چندین آدرس مجازی می‌توانند در یک آدرس فیزیکی نگاشت شوند. اکثر پردازنده‌ها تضمین می‌کنند که تمام به روزرسانی‌های این آدرس فیزیکی به ترتیب موجود در برنامه انجام می‌شود. برای ارائه این ضمانت ، پردازنده باید اطمینان حاصل کند که فقط یک نسخه از آدرس فیزیکی در هر زمان مشخص در حافظه پنهان قرار دارد.
دانه‌دانه بودن (granularity): فضای آدرس مجازی به صفحات تقسیم می‌شود. به عنوان مثال، یک فضای آدرس مجازی ۴ گیبی بایتی ممکن است در ۱۰۴۸۵۷۶ صفحه با اندازه ۴ خیلی بایت تقسیم شود، که هر یک از آنها می‌تواند به‌طور مستقل نگاشت شود. ممکن است اندازه‌های متعددی از صفحه پشتیبانی شود.
برخی از سیستم‌های حافظه مجازی اولیه بسیار کند بودند زیرا نیاز به دسترسی به جدول صفحه (در حافظه اصلی) قبل از دسترسی برنامه‌نویسی شده به حافظه اصلی داشتند.
بدون داشتن حافظه نهان، این امر به‌طور مؤثر سرعت دسترسی به حافظه را به نصف کاهش می‌دهد. اولین حافظه نهان سخت‌افزاری مورد استفاده در سیستم رایانه ای در واقع حافظه نهان داده یا دستورالعمل نبود، بلکه TLB بود.
بر اساس اینکه اندیس یا برچسب با آدرس فیزیکی یا مجازی مطابقت دارد، حافظه پنهان را می‌توان به چهار نوع تقسیم کرد:
کش از نوع فیزیکی فهرست شده و فیزیکی برچسب گذاری شده (Physically indexed, physically tagged) از آدرس فیزیکی هم برای اندیس و هم برای برچسب استفاده می‌کنند. اگرچه این کار ساده است و از مشکلات نام مستعار جلوگیری می‌کند، اما کند است، زیرا قبل از جستجوی آدرس در حافظه کش، باید آدرس فیزیکی را جستجو کرد (که می‌تواند شامل خطای TLB و دسترسی به حافظه اصلی باشد).
کش از نوع مجازی فهرست شده و مجازی برچسب گذاری شده (Virtually indexed, virtually tagged) از آدرس مجازی هم برای فهرست و هم برای برچسب استفاده می‌کند. این طرح کش می‌تواند به جستجوی سریعتر منجر شود، زیرا در ابتدا برای تعیین آدرس فیزیکی یک آدرس مجازی داده شده نیازی به مراجعه به MMU نیست. با این حال، VIVT از مشکلات نام مستعار رنج می‌برد، جایی که چندین آدرس مجازی مختلف ممکن است به یک آدرس فیزیکی ارجاع کنند. نتیجه این است که این آدرس‌ها علی‌رغم ارجاع به یک حافظه یکسان، جداگانه کش می‌شوند و باعث ایجاد مشکلات یکپارچگی می‌شوند. اگرچه راه حل‌هایی برای این مشکل وجود دارد اما آنها برای پروتکل‌های یکپارچگی استاندارد کارایی ندارند. مشکل دیگر تشابه ظاهری (homonyms) است، جایی که یک آدرس مجازی به چندین آدرس فیزیکی مختلف نگاشت می‌شود. تشخیص این نگاشت‌ها صرفاً با مشاهده اندیس مجازی بتنهایی امکان‌پذیر نیست، گرچه راه حل‌های بالقوه عبارتند از: شستشوی حافظه پنهان پس از تعویضی زمینه، الزام کردن فضاهای آدرس به ناهمپوشانی، برچسب زدن آدرس مجازی با شناسه فضای آدرس (address space ID). علاوه بر این، یک مشکل وجود دارد که نگاشت‌های مجازی به فیزیکی می‌توانند تغییر کنند، که به شستشوی خطوط کش نیاز دارد، زیرا VAها دیگر معتبر نیستند. اگر برچسب‌ها از آدرس‌های فیزیکی (VIPT) استفاده کنند، همه این مشکلات حذف می‌شوند.
کش از نوع مجازی فهرست شده، و فیزیکی برچسب گذاری شده (VIPT) از آدرس مجازی برای فهرست بندی و آدرس فیزیکی موجود برای برچسب استفاده می‌کند. مزیت آن نسبت به PIPT تأخیر کمتر است، زیرا می‌توان به‌طور همزمان با ترجمه TLB، خط‌کش را جستجو کرد، اما تا زمانی که آدرس فیزیکی در دسترس نباشد، برچسب قابل مقایسه نیست. مزیت نسبت به VIVT این است که از آنجا که برچسب آدرس فیزیکی دارد، حافظه پنهان می‌تواند مشابهات را تشخیص دهد. از نظر تئوری، VIPT نیاز به بیت بیشتری برای برچسب دارد زیرا برخی از بیت‌های اندیس می‌توانند بین آدرس‌های مجازی و فیزیکی متفاوت باشند (به عنوان مثال بیت ۱۲ به بالا برای صفحه 4KiB) و باید هم در اندیس مجازی و هم در برچسب فیزیکی گنجانده شود. در عمل این مشکل ساز نیست، زیرا برای جلوگیری از مشکلات یکپارچگی، کش‌های VIPT طوری طراحی شده‌اند که چنین بیت‌های فهرستی ندارند (به عنوان مثال، با محدود کردن تعداد کل بیت‌های فهرست و جابجایی بلوک به ۱۲ برای صفحات 4KiB)؛ این امر باعث می‌شود تا اندازه حافظه پنهان VIPT حداکثر برابر با اندازه صفحه ضرب در میزان ارتباط حافظه پنهان شود.
کش از نوع به طریق فیزیکی فهرست شده و به طریق مجازی برچسب گذاری شده (PIVT) اغلب در متون ادعا می‌شود که بی فایده و غیر موجود است. با این حال، MIPS R6000 از این نوع حافظه پنهان به عنوان تنها پیاده‌سازی شناخته شده استفاده می‌کند. R6000 به شکل منطق تزویج امیتری پیاده‌سازی شده‌است، که یک فناوری بسیار سریع است و برای حافظه‌های بزرگ مانند TLB مناسب نیست. R6000 با قرار دادن حافظه TLB در یک قسمت اختصاصی از حافظه نهان سطح دو، با داشتن یک «برش» TLB کوچک و با سرعت بالا روی چیپ، این مسئله را حل می‌کند. حافظه نهان با آدرس فیزیکی بدست آمده از برش TLB فهرست بندی می‌شود. با این حال، از آنجا که قطعه TLB فقط آن دسته از بیت‌های آدرس مجازی را که برای فهرست بندی حافظه پنهان ضروری هستند ترجمه می‌کند و از هیچ برچسبی استفاده نمی‌کند، ممکن است اصابت‌های کاذب در حافظه پنهانی رخ دهد که با برچسب گذاری با آدرس مجازی برطرف می‌شود.
سرعت این رویداد مجدد (تأخیر بار) برای عملکرد پردازنده بسیار مهم است و بنابراین اکثر کش‌های سطح ۱ جدید بطریق مجازی فهرست بندی می‌شوند، که حداقل این امکان را می‌دهد تا جستجو در TLB واحد مدیریت حافظه به موازات واکشی داده از RAM کش پیش برود.
اما فهرست بندی مجازی برای همه سطوح حافظه نهان بهترین گزینه نیست. هزینه مدیریت مستعارهای مجازی با افزایش اندازه حافظه نهان افزایش می‌یابد و در نتیجه بیشتر کش‌های سطح ۲ و بالاتر بطریق فیزیکی فهرست بندی می‌شوند.
از زمان‌های گذشته، حافظه نهان هم از آدرس‌های مجازی و هم از آدرس‌های فیزیکی برای برچسب‌های کش استفاده می‌کرد، اگرچه برچسب گذاری مجازی اکنون غیرمعمول است. اگر جستجوی TLB بتواند قبل از جستجوی RAM کش به پایان برسد، آنگاه آدرس فیزیکی به موقع برای مقایسه برچسب در دسترس است و نیازی به برچسب گذاری مجازی نیست؛ بنابراین، معمولاً حافظه‌های نهان بزرگ به‌طور فیزیکی برچسب گذاری می‌شوند و فقط حافظه‌های نهان کوچک، با تأخیر بسیار کم، به‌طور مجازی برچسب گذاری می‌شوند. در پردازنده‌های عمومی جدید، vhints جایگزین برچسب گذاری مجازی شده‌است.