اصول کش: حافظه کوچک و سریع چگونه پیش‌بینی می‌کند بعداً چه چیزی نیاز است

یک کش فقط به این دلیل کار می‌کند که برنامه‌ها تمایل دارند داده یکسان یا نزدیک به هم را به‌طور تکراری دسترسی کنند نه به‌صورت تصادفی. این مقاله اصل محلیت که کش را مؤثر می‌کند را توضیح می‌دهد، یک کش مستقیم‌نگاشت‌شده چگونه داده را با استفاده از یک آدرس مکان‌یابی می‌کند، و در یک hit کش در مقابل یک miss کش چه اتفاقی می‌افتد.

حافظه کشمحلیت مرجکش مستقیم‌نگاشت‌شده

~3 دقیقه مطالعه · آخرین به‌روزرسانی ۱۵ شهریور ۱۴۰۵

چرا کش کار می‌کند: اصل محلیت

یک کش فقط به این دلیل مفید است که برنامه‌های واقعی حافظه را به یک الگوی کاملاً تصادفی دسترسی نمی‌کنند. در عوض، آن‌ها Locality of Reference را نشان می‌دهند، که به دو شکل مرتبط می‌آید: Temporal Locality، به این معنا که یک مکان حافظه که اخیراً دسترسی داشته، احتمالاً به‌زودی دوباره دسترسی خواهد داشت، و Spatial Locality، به این معنا که مکان‌های حافظه نزدیک به یک مکان اخیراً دسترسی‌شده نیز احتمالاً به‌زودی دسترسی خواهند داشت، مانند عناصر بعدی در یک آرایه.

یک کش واقعاً چه چیزی ذخیره می‌کند

یک Cache یک حافظه کوچک و سریع است که کپی‌هایی از داده اخیراً استفاده‌شده از حافظه اصلی را نگه می‌دارد، که بین پردازنده و حافظه اصلی در سلسله‌مراتب که پیش‌تر در این مجموعه بحث شد قرار دارد. وقتی پردازنده داده‌ای را درخواست می‌کند که از قبل در کش حاضر است، می‌تواند بسیار سریع‌تر از واکشی آن از حافظه اصلی بازیابی شود.

مکان‌یابی داده: کش مستقیم‌نگاشت‌شده

ساده‌ترین سازمان کش، Direct-Mapped Cache نامیده می‌شود، جایی که هر آدرس حافظه دقیقاً به یک مکان مشخص در کش نگاشت می‌شود، که با بخشی از بیت‌های آدرس تعیین می‌شود.

آدرس حافظه شکسته‌شده به فیلدها:
[ Tag | Index | Block Offset ]

  • بیت‌های Index مشخص می‌کنند کدام مکان کش بررسی شود.
  • بیت‌های Tag همراه با داده ذخیره می‌شوند و با آدرس درخواست‌شده مقایسه می‌شوند تا تأیید کنند داده درست حاضر است، چون چند آدرس حافظه مختلف می‌توانند به همان index نگاشت شوند.
  • بیت‌های Block Offset بایت خاصی درون یک بلوک ذخیره‌شده بزرگ‌تر را انتخاب می‌کنند، چون کش‌ها معمولاً داده را در قطعات با اندازه ثابت ذخیره می‌کنند نه بایت‌های تکی.

Cache Hit و Cache Miss

وقتی پردازنده داده‌ای را درخواست می‌کند و آن را از قبل در کش با یک tag منطبق پیدا می‌کند، این Cache Hit نامیده می‌شود، و داده به‌سرعت بازگردانده می‌شود. وقتی داده درخواست‌شده پیدا نمی‌شود، این Cache Miss نامیده می‌شود، و پردازنده باید داده را از یک سطح کندتر سلسله‌مراتب حافظه بازیابی کند، سپس یک کپی را در کش برای استفاده احتمالی آینده ذخیره کند.

در یک cache hit:
داده بلافاصله از کش بازگردانده می‌شود

در یک cache miss:
داده از حافظه اصلی واکشی می‌شود
یک کپی در کش ذخیره می‌شود
داده به پردازنده بازگردانده می‌شود

چرا اندازه بلوک اهمیت دارد

به‌دلیل محلیت مکانی، کش‌ها فقط یک بایت تکی درخواستی را در یک miss ذخیره نمی‌کنند؛ آن‌ها یک Block کامل (که Cache Line نیز نامیده می‌شود) از حافظه نزدیک را یک‌جا بازیابی و ذخیره می‌کنند، با پیش‌بینی اینکه داده مجاور احتمالاً به‌زودی مورد نیاز خواهد بود. انتخاب اندازه بلوک مناسب شامل یک مبادله است: بلوک‌های بزرگ‌تر محلیت مکانی را مؤثرتر بهره‌برداری می‌کنند اما زمان بیشتری برای انتقال در یک miss می‌گیرند و اگر داده اضافه واقعاً استفاده نشود می‌توانند فضای کش را هدر دهند.

چرا درک این اصول اهمیت دارد

هر موضوع پیشرفته‌تر کشی که بعداً در این مجموعه بحث می‌شود — سنجش و بهبود کارایی کش، استراتژی‌های نگاشت انعطاف‌پذیرتر، و سلسله‌مراتب کش چندسطحی — مستقیماً روی این مفاهیم اصلی محلیت، نگاشت مستقیم، و تمایز hit/miss که در اینجا معرفی شد بنا می‌شود.

نوشته و پژوهش‌شده توسط دکتر شاهین صیامی

مقالات مرتبط

سلسله‌مراتب حافظه: چرا کامپیوترها از چند نوع حافظه استفاده می‌کنند

هیچ فناوری حافظه واحدی هم‌زمان سریع، بزرگ، و ارزان نیست. این مقاله مفهوم سلسله‌مراتب حافظه که چند فناوری حافظه مختلف را ترکیب می‌کند تا به سرعت سریع‌ترین آن‌ها با هزینه ارزان‌ترین نزدیک شود را معرفی می‌کند، سپس فناوری‌های اصلی که هر سطح را می‌سازند مرور می‌کند.

ادامه

تصورات غلط رایج درباره طراحی پردازنده و تصویر کلی فصل چهارم

پس از پوشش datapath ها، پایپ‌لاینینگ، خطرها، و مقایسه‌های پردازنده دنیای واقعی، وقت آن است چند تصور غلط پایدار درباره نحوه رفتار واقعی پردازنده‌ها را اصلاح کنیم. این مقاله به مغالطات رایج درباره پایپ‌لاینینگ و کارایی می‌پردازد، سپس مسیر کامل از datapath های ساده تا اجرای سوپراسکالر که در سراسر این فصل پوشش داده شد را به هم پیوند می‌دهد.

ادامه

پایپ‌لاین‌های دنیای واقعی: مقایسه ARM و Intel، و تسریع ضرب ماتریس

مفاهیم نظری پایپ‌لاین در پردازنده‌های تجاری واقعی شکل مشخصی به خود می‌گیرند، که بسته به اهداف طراحی‌شان از نظر عمق پایپ‌لاین و عرض صدور به‌طور گسترده متفاوت‌اند. این مقاله مقایسه می‌کند ARM Cortex-A53 و Intel Core i7 چگونه پایپ‌لاینینگ را متفاوت برای کارایی توان در مقابل کارایی خام پیاده‌سازی می‌کنند، سپس نشان می‌دهد موازی‌سازی سطح دستور چگونه ضرب ماتریس را در عمل تسریع می‌کند.

ادامه

موازی‌سموازی‌سازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمانازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمان

موازی‌سازی سطح دستور: اجرای بیش از یک دستور به‌طور هم‌زمان

ادامه

یک پردازنده پایپ‌لاین‌شده چگونه استثناها را مدیریت می‌کند

هر دستوری آن‌طور که انتظار می‌رود اجرا نمی‌شود — برخی شرایط خطایی مانند یک opcode نامعتبر یا سرریز محاسباتی را فعال می‌کنند که پردازنده باید با امنیت به آن‌ها پاسخ دهد. این مقاله توضیح می‌دهد استثناها چه هستند، یک پردازنده پایپ‌لاین‌شده چگونه آن‌ها را بدون خراب کردن وضعیت برنامه تشخیص داده و مدیریت می‌کند، و چرا استثناها مشابه خطرهای کنترلی رفتار می‌شوند.

ادامه

خطرهای کنترلی: مدیریت شاخه‌ها در یک پردازنده پایپ‌لاین‌شده

شاخه‌ها یک مسئله منحصربه‌فرد برای پایپ‌لاینینگ ایجاد می‌کنند: پردازنده باید دستور بعدی را پیش از آنکه حتی بداند آیا یک شاخه گرفته خواهد شد یا نه، واکشی کند. این مقاله توضیح می‌دهد خطرهای کنترلی چه هستند، پیش‌بینی شاخه و حل زودهنگام چگونه تلاش می‌کنند هزینه آن‌ها را به حداقل برسانند، و وقتی یک پیش‌بینی نادرست از آب درمی‌آید چه اتفاقی می‌افتد.

ادامه