حافظه کش پردازنده چیست
زمان مطالعه: ۶ دقیقه
پردازندههای امروزی بسیار پیشرفت کردهاند و نسبت به نسلهای گذشته فوقالعاده سریعاند، اما اغلب مجبور میشوند منتظر دیتا بمانند. حافظه رم از پردازنده کندتر است و استوریج از آن هم کندتر. کش پردازنده درواقع پلی است میان این شکاف؛ مخزنی کوچک و بسیار سریع از حافظه که روی خودِ پردازنده یا در کنار آن قرار میگیرد و دادهها و دستورالعملهای استفادهشده را در دسترس نگه میدارد. وقتی پردازنده چیزی را طلب میکند که از قبل در حافظهی کش قرار دارد، با تمام سرعت پیش میرود؛ اما اگر مجبور شود آن از حافظهی اصلی بخواند، روند کار کند خواهد شد. در این مطلب توضیح میدیم که حافظهی کش پردازنده چیست، همچنین انواع CPU Cache و سطوح حافظهی کش پردازنده را بررسی خواهیم کرد. با اگزوگیم همراه باشید.
چرا کش پردازنده ضرورت دارد؟
همانطور که در مقدمه گفتیم، سرعت سیپییو نسبت به سرعت عملی که حافظه رم و حاظفهی ذخیره سازی دارد بسیار بسیار بیشتر است، در نتیجه اگر قرار باشد که پردازنده هر دیتای که برای پردازش نیاز دارد را همیشه مستقیما از رم یا هارد دیسک بخواهد، به ناچار باید وابسته به آنها باشد و در نتیجه سرعتش کند خواهد شد. حافظهی کشِ پردازنده یک حافظهی بسیار کم حجم و فوقالعاده سریع است که در کنار خود پردازنده فعالیت میکند.
هر بار که پردازنده نیاز به دیتا داشته باشد، اولین دیتاهای مورد نیاز که باید در دسترس بمانند وارد کش میشوند تا پردازنده منابع مورد نیاز خود برای پردازش را از روی آن بردارد، و سریعتر به وظیفهی خود برسد و به حافظهی سیستم وابستگیِ مستقیم پیدا نکند. سپس این چرخه ادامه پیدا میکند و هر بار مقداری از دیتای مورد نیاز پردازنده که باید زودتر در دسترس قرار بگیرد، از حافظهی رم به حافظهی کش منتقل و آنجا جمع میشود تا پردازنده را تغذیه کند. طبیعتا هرچقدر مقدار کش بزرگتر و سرعت آن بیشتر باشد، باعث خواهد شد که پردازنده سریعتر و بهتر بتواند به منابع مورد نیاز خود دسترسی پیدا کند و با حداکثر سرعتی که توانش را دارد کار کند.
سطوح کش و نقش هر کدام
بیشتر پردازندههای دسکتاپ از یک سلسلهمراتب کش با چینش بر اساس سرعت و اندازه استفاده میکنند. سطح نخست معمولا به دو بخش دستورالعمل و داده تقسیم میشود و برای هر هسته اختصاصی است. این سطح بسیار کوچک اما بسیار سریع است و به صورت مداوم پردازنده را تغذیه میکند و اولین ایستگاه برای هرآن چیزی است که هسته همین حالا نیاز دارد. این همان کش سطح یک یا L1 است.
سطح دوم، پشتِ L1 قرار میگیرد، حجم بزرگتری دارد، در اغلب معماریها همچنان هر هسته را جداگانه تغذیه میکند، و مجموعهی کاری وسیعتر را با اندکی تاخیر بیشتر (نسبت به کش سطح یک) پوشش میدهد. این همان کش سطح دو یا L2 است.
سطح سوم در بسیاری از چیپهای مصرفی میان هستهها مشترک است، بسیار بزرگتر از دو سطح قبلی است، کندتر از آنهاست، و برای نگهداشتن دادهها و دستورالعملهایی که چند هسته به اشتراک میگذارند عالی عمل میکند؛ مثل دیتای بازیها یا مسیرهایی که در مرورگرها و موتورهای پردازشی مشترکاند. این همات کش سطح سه یا L3 است.

دادهها چگونه وارد کش میشوند
کش به بخشهایی با اندازهی ثابت به نام «خط» سازماندهی میشود. وقتی پردازنده سراغ دیتایی با آدرسِ بخصوص میرود، کنترلر کش کل خطِ حاوی آن آدرس را به سطحی مناسب (کش سطح یک، دو یا سه) میآورد. چون احتمال دسترسی به آدرسهای نزدیک در آینده زیاد است، آوردن کل خطِ حاوی آدرس (و نه فقط آن دیتای بخصوص) شانسِ این که دفعات بعدی نیز پردازنده به سرعت به دیتایی که نیاز دارد دسترسی پیدا کند را به حداکثر میرساند. به چه علت؟ چون وقتی پردازنده دیتای بخصوصی از یک خط را درخواست میکند، احتمالِ زیاد دیتای بعد نیز از همان خط خواهد بود.
هر سطحِ کش از یک «درجهی همبستگی» استفاده میکند تا تعیین کند یک خط در کدام جایگاهها میتواند بنشیند. هرچه این درجه (که همبستگی یا به بیانی همگون بودن دیتای یک خط را مشخص میکند) بیشتر باشد، برخوردهای تصادفیِ دادههای غیرمرتبط کاهش مییابد، هرچند کارِ جستوجویِ آن دیتا اندکی پیچیدهتر میشود. «سیاستهای جایگزینی» هم تصمیم میگیرند وقتی خط جدید جا میخواهد، کدام خط قدیمی بیرون انداخته شود. این سیاستها برای تعادل با الگوهای رایج دسکتاپ و بازی تنظیم میشوند.
سیستمی نیز در کش پردازنده وجود دارد که همیشه یک قدم از جریان انتقال داده به کش جلوتر است، به این معنا که جریان اطلاعات را میخواند تا اگر نیاز به دسترسی به آنها توسط پردازنده به وجود آمد، پیشاپیش نرخ اصابت یا برخورد جریان دادهها به پردازنده را افزایش دهد. این سیستم درواقع به دنبال الگوهای قابل پیشبینی میگردند — جریانهای ترتیبی، گامهای ثابت یا حلقههای تکرارشونده — و خطوط بعدی را به صورت حدسی در دسترس قرار میدهد. وقتی این پیشواکِش درست باشد، مثل جادو بهنظر میرسد! چون سرعت را بسیار بالا میبرد. وقتی خطا کند، پهنایباند را هدر میدهد و کش را به شکلی کاذب درگیر میکند. به همین دلیل این سازوکارها با دقت در سختافزار مهار میشوند و گاهی برخی میانافزارها برای شرایط خاص، کلیدهایی برای تغییر رفتار ارائه میکنند.

نوشتن داده و انسجام میان هستهها
کَش کردن خواندن (Read) دیتا بخش سادهی ماجراست. نوشتن (Write) سختتر است، چون چندین کش و حافظهی اصلی باید بر سر جدیدترین مقدار توافق داشته باشند. دو راهبرد کلاسیک وجود دارد.
“نوشتن عبوری” همزمان کش و حافظه را بهروزرسانی میکند. این روش ساده است اما میتواند ترافیک اضافی ایجاد کند.
“نوشتن بازگشتی” ابتدا فقط کش را بهروزرسانی میکند و خط را به صورت خام نشانه میگذارد. دادهی تازه وقتی خط بیرون انداخته شد به حافظه میرسد. این روش فشار پهنایباند را کاهش میدهد و در پردازندههای پیشرفتهتر رایج است.
در تراشههای چندهستهای، پروتکلی برای حفظ انسجامِ کش وجود دارد که تضمین میکند که عملکرد هر هسته به صورت جزا پیوسته و منسجم باشد. اگر هستهی A خطی کَش شده را تغییر دهد که هستهی B نیز نسخهای از آن را دارد، پروتکل نسخهی B را باطل یا بهروزرسانی میکند. این پیامها از طریق بافت ارتباطی روی تراشه جابهجا میشوند و به اندازهی خودِ اندازهی کش برای کارایی در بارهای چندرشتهای اهمیت دارند.
رویکردهای فراگیر و انحصاری
برخی پردازندهها کش سطح سوم را «فراگیر» طراحی میکنند؛ یعنی هر آنچه در L1 یا L2 است باید در L3 هم موجود باشد. این کار برای حفظ انسجام موثرتر است، چون هسته با نگاه کردن به L3 میفهمد چه کسی نسخهای از خط را دارد. برخی دیگر L3 را «انحصاری» یا «عمدتا انحصاری» میگذارند تا مجموع سلسله مراتب، دادهی منحصربهفردِ بیشتری را در خود جا بدهد. هیچکدام از این روشها لزوما بر دیگری برتری مطلق ندارند؛ انتخاب درست به تعداد هستهها، بارهای مورد انتظار و منابعی که برای جابهجایی داده مصرف میشود بستگی دارد.

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

جمعبندی
کش پردازنده مثل یک تورِ لایهبندیشدهای است که دادهها و دستورالعملهایی را که احتمالا گامِ بعد برای پردازشِ سیپییو نیاز میشوند را به دام میاندازد. کش سطح یک پاسخِ فوری برای دیتایی که سیپییو نیاز دارد را فراهم میکند، کش سطح دو میدان دسترسی به دیتاها را برای هر هسته افزایش میدهد، و کش سطح سه مثل یک انبار مشترک عمل میکند که میتواند دسترسیِ سیپییو به حافظهٔ اصلی را بهطور چشمگیری تقویت کند. هرچه ظرفیت کش پردازنده بیشتر باشد و از طراحی مدرنتری بهره ببرد، در نهایت سیستم شما سریعتر و قویتر خواهد بود.
پرسش و پاسخ – سوالات متداول
چرا دو پردازنده با تعداد هسته و کلاک یکسان عملکرد متفاوتی دارند؟
تفاوت در اندازه و تاخیر کشها میتواند نرخ دسترسیِ سیپییو به دیتاهای مورد نیاز را به شدت تقویت کند. حتی وقتی مشخصات روی کاغذ مشابهاند، سرعت و ظرفیت و دقت کش میتواند عامل بسیار موثری باشد.
آیا افزایش ظرفیت RAM میتواند جایگزینِ کشِ بیشتر باشد؟
خیر. ظرفیت رم فضای مورد نیاز برای حافظهی موقت سیستم را تامین میکند، درحالی که کش پردازنده تاخیرِ دسترسی سیپییو به دادههای مورد نیاز را کاهش میدهد. هر دو مهم هستند، اما مسائل متفاوتی را در مقیاسهای زمانی متفاوتی حل میکنند و نمیتوانند جایگزین یکدیگر باشند.