آلودگی حافظه پنهان
"این مقاله در حال ترجمه از ویکی انگلیسی است
لطفا حذف نشود."
آلودگی حافظه پنهان (به انگلیسی: Cache pollution) را توصیف میکند که در آن یک برنامه رایانهای در حال اجرا، دادهها را به صورت غیر ضروری در حافظه نهان سیپییو بارگذاری میکند، در نتیجه باعث میشود که سایر دادههای مفید از حافظه پنهان به سطوح پایینتر سلسلهمراتب حافظه انتقال داده شوند و عملکرد را تضعیف کنند. به عنوان مثال، در یک پردازنده چندهستهای، یک هسته ممکن است جایگزین بلوکهای واکشی شده توسط هستههای دیگر در حافظه پنهان مشترک شود، یا بلوکهای از پیش واکشی شده ممکن است جایگزین بلوکهای واکشی شده -تقاضا از حافظه پنهان شوند.
مثال
به تصویر زیر توجه کنید:
T[0] = T[0] + 1;
for i in 0..sizeof(CACHE)
C[i] = C[i] + 1;
T[0] = T[0] + C[sizeof(CACHE)-1];
(در اینجا فرض بر این است که حافظه نهان تنها از یک سطح تشکیل شدهاست، قفل آن باز است، خط مشی جایگزینی شبه LRU است، همه دادهها قابل ذخیرهسازی هستند، مجموعه شرکت پذیری از حافظه پنهان N است (که در آن N> 1) و حداکثر یک ثبات پردازنده برای حاوی مقادیر برنامه بودن موجود است).
درست قبل از شروع حلقه، T[0] از حافظه به حافظه پنهان واکشی میشود و مقدار آن به روز میشود. با این حال، همانطور که حلقه اجرا میشود، چون تعداد عناصر دادهای که به حلقه ارجاع میدهند نیاز دارد که کل حافظه پنهان تا ظرفیت خود پر شود، بلوک کش حاوی T[0] باید خارج شود؛ بنابراین، دفعه بعد که برنامه از T[0] برای به روز رسانی درخواست میکند، کش از دست میرود و کنترلکننده کش باید از گذرگاه داده درخواست کند تا بلوک کش مربوطه را دوباره از حافظه اصلی بیاورد.
در این مورد گفته میشود که حافظه پنهان «آلوده» است. تغییر الگوی دسترسی به دادهها با قرار دادن اولین به روز رسانی T[0] بین حلقه و به روز رسانی دوم میتواند ناکارآمدی را از بین ببرد:
برای i در 0.. sizeof (CACHE) C[i] = C[i] + 1; T[0] = T[0] + 1; T[0] = T[0] + C[اندازه(CACHE)-1];
راه حلها
به غیر از تغییر ساختار کد که در بالا ذکر شد، راه حل برای آلودگی حافظه پنهان این است که اطمینان حاصل شود که فقط دادههای با استفاده مجدد بالا در آن ذخیره میشوند. این را میتوان با استفاده از دستورالعملهای ویژه کنترل کش، پشتیبانی از سیستمعامل یا پشتیبانی سختافزاری به دست آورد.
نمونههایی از دستورالعملهای سختافزاری تخصصی عبارتند از "lvxl" ارائه شده توسط پاورپیسی AltiVec. این بارهای آموزش ۱۲۸ ارزش گستردهای از بلوک کش مربوطه را به عنوان به عنوان نامزد نخست برای اخراج بر نیاز به "هایی که اخیرا استفاده" یعنی کمی به یک ثبات و علائم اخراج یک بلوک از مجموعه ای کش آن است. برای استفاده مناسب از آن دستورالعمل در زمینه مثال بالا، عناصر داده ارجاع شده توسط حلقه باید با استفاده از این دستورالعمل بارگذاری شوند. هنگامی که به این روش اجرا میشود، آلودگی حافظه پنهان رخ نمیدهد، زیرا اجرای چنین حلقه ای باعث خروج زودهنگام T[0] از حافظه پنهان نمیشود. از این امر اجتناب میشود، زیرا با پیشرفت حلقه، آدرسهای عناصر در C به همان روش حافظه پنهان نگاشت میشوند، و دادههای واقعی قدیمیتر (اما به عنوان «کمترین استفادهشده اخیر» علامتگذاری نشدهاند) در راه (های دیگر) دست نخورده باقی میمانند). فقط قدیمیترین دادهها (مرتبط با مثال ارائهشده) از حافظه پنهان خارج میشوند، که T[0] عضوی از آن نیست، زیرا بهروزرسانی آن درست قبل از شروع حلقه اتفاق میافتد.
بهطور مشابه، با استفاده از پشتیبانی از سیستم عامل (OS)، صفحات موجود در حافظه اصلی که با آرایه داده C مطابقت دارند را میتوان به عنوان «ممانعت از حافظه پنهان» یا به عبارت دیگر غیرقابل کش علامت گذاری کرد. بهطور مشابه، در سطح سختافزار، از طرحهای دور زدن حافظه پنهان میتوان استفاده کرد که دادههای کم استفاده مجدد را بر اساس الگوی دسترسی برنامه شناسایی کرده و آنها را از حافظه پنهان دور میزند. همچنین، حافظه پنهان مشترک را میتوان برای جلوگیری از تداخل مخرب بین برنامههای در حال اجرا، پارتیشنبندی کرد. معاوضه در این راه حلها این است که طرحهای مبتنی بر سیستم عامل ممکن است تأخیر زیادی داشته باشند که ممکن است سود قابل دستیابی با جلوگیری از آلودگی حافظه پنهان را باطل کند (مگر اینکه منطقه حافظه در ابتدا غیرقابل کش بوده باشد)، در حالی که تکنیکهای مبتنی بر سختافزار ممکن است یک جهانی نداشته باشند. نمای جریان کنترل برنامه و الگوی دسترسی به حافظه.
اهمیت روزافزون
اهمیت کنترل آلودگی حافظه پنهان شدهاست زیرا جریمههای ناشی از به اصطلاح «دیوار حافظه» همچنان در حال افزایش است. سازندگان تراشه به ابداع ترفندهای جدید برای غلبه بر تأخیر نسبی حافظه به سیپییو ادامه میدهند. آنها این کار را با افزایش اندازه حافظه پنهان و با ارائه راههای مفید برای مهندسان نرمافزار برای کنترل نحوه رسیدن و ماندن دادهها در سیپییو انجام میدهند. کنترل آلودگی کش یکی از دستگاههای متعددی است که در دسترس برنامهنویس (عمدتاً جاسازی شده) است. با این حال، روشهای دیگری نیز که بیشتر آنها اختصاصی بوده و بسیار سختافزاری و کاربردی هستند نیز مورد استفاده قرار میگیرند.