سلام .
شما وقتی میخواهید به یک آدرسی توی RAM مقداری رو تغیبر بدید (بنویسید/بخوانید) ، اینکار مستقیما انجام نمیشه .
برای مثال اگه فرض کنیم که سرعت دسترسی به RAM به اندازه 50 واحد زمانی طول بکشه . سرعت دسترسی به Cache به اندازه 5 واحد زمانی است . (این فقط مثال بود ، سرعت ها متغییر هست ، ولی همیشه Cache واحد زمانی خیلی کمتری برای دسترسی میخواد ، این یعنی سرعت بیشتر )
هر بار که شما به داده ای اشاره میکنید . اگر اون داده توی Cache نباشه ، سیستم میاد داده رو از داخل RAM به Cache میاره و اونموقع که داده توی Cache هست شما باهاش کار میکنید .
درواقع شما با Cache کار میکنید .
و Cache از Cache Line ها تشکیل شده . و هر Cache Line به اندازه ی 64 بایت هست . (بستگی به سیستم داره که Cache Line هاش چقدر باشه )
خلاصه ، حالا شما میاد مثلا میخواید توی آدرس 0x000010 داده رو به اندازه 8 بایت بخونید .
اول داخل Cache بررسی میشه تا معلوم بشه این آدرس توی Cache هست یا نه . اگر باشه بهش میگن Cache-Hit .
اگر اون آدرس توی Cache نباشه ، سیستم میره از RAM اون آدرس رو میاره توی Cache . پس اینجا آدرسی که شما بهش دادید توی Cache نبود . به این میگن Cache-Miss .
حالا نسبت به واحد های زمانی که RAM و Cache دارن اگر حساب کنیم ، توی Cache-Miss شما باید 50 واحد زمانی اضافه رو برای آوردن داده از RAM به Cache داشته باشید .
ولی توی Cache-Hit شما فقط همون 5 واجد زمانی رو دارید . چون داده در حال حاظر توی Cache هست .
برای جلوگیری از Cache-Miss و شما باید داده هاتون رو چسبیده به هم قرار بدید .
چون هر بار که از RAM داده ای به Cache میاد به اندازه ی Cache-Line ( برای مثال Cache-Line به اندازه ی ۶۴ بایت هست ) میاد توی Cache .
و با داده ای که توی Cache کمتز از همه استفاده شده جایگذین میشه .
حالا اگر شما متغییر اولتون رو توی Cache بیارید و اگر مثلا متغییر شما ۴ بایت باشه ، تا ۶۰ بایت بعدی این متغییر هم داخل Cache میاد .
پس شما دیگه نیازی به آوردن متغییر هایی که تا ۶۰ بایت بعد از متغییرتون هستند رو به Cache ندارید .
پس داده هایی که باهم استفاده میشن رو پراکنده توی آدرس های مختلف قرار ندید .
یعنی به صورت خطی باشن .
مثلا توی Linked-List اشیا توی آدرس ها مختلفی هستند .
اگر شما توی Linked-List به شی اولی دسترسی پیدا کنید . اشیا بعدی دقیق پشت سر اون شی نیستند و برای دسترسی به اونها شما Cache-Miss دارید .
ولی توی Vector اشیا پشت سر هم هستند و شما به شی اولی دسترسی پیدا کنید ، شی های بعدی هم توی Cache میان . (به دلیل اندازه Cache-Line )
یه نکته هم هست ، خود Cache به صورت چند تا سطح (Level) هست . ( معمولا ۳ تا سطح داره )
یعنی هر داده ای که Cache-Hit بیشتری میگیره ، به سمت سطح سرعتی تر Cache منتقل میشه .