پیش‌واکشی حافظه نهان کیست؟ توضیح بده.
پیش‌واکشی حافظه نهان ، تکنیکی است که توسط پردازنده‌های رایانه انجام می‌شود و برای تقویت عملکرد اجرای برنامه‌ها است. در این تکنیک، پردازنده دستورالعمل‌ها یا داده‌ها را از حافظه اصلی (حافظه کندتر) به یک حافظه محلی (حافظه تندتر) قبل از اینکه واقعاً مورد نیاز باشد بازیابی می‌کند (از این رو اصطلاح 'prefetch' نامیده می‌شود). اکثر پردازنده‌های کامپیوتری مدرن، دارای حافظه نهان سریع و محلی هستند که داده‌های بازیابی شده را تا زمانی که مورد استفاده قرار نگرفته‌اند در خود نگه می‌دارند. معمولاً عملیات پیش واکشی در حافظه اصلی صورت می‌گیرد. به دلیل طراحی پردازنده‌ها، معمولاً دسترسی به حافظه‌های نهان بسیار سریع‌تر از دسترسی به حافظه اصلی است، بنابراین واکشی اولیه داده‌ها و سپس دسترسی به آن‌ها از طریق حافظه نهان معمولاً چندین مرتبه سریع‌تر از دسترسی مستقیم به آن‌ها از حافظه اصلی است. واکشی اولیه را می‌توان با دستورالعمل‌های کنترل حافظه پنهان غیر مسدود کننده (non-blocking) انجام داد.مقایسه پیش واکشی حافظه نهان در داده‌ها با دستورالعمل‌ها.پیش واکشی حافظه نهان می‌تواند داده‌ها یا دستورالعمل‌ها را در حافظه پنهان بازیابی کند.مقایسه پیش واکشی حافظه نهان سخت‌افزار با نرم‌افزار.پیش واکشی حافظه نهان می‌تواند توسط سخت‌افزار یا نرم‌افزار انجام شود.روش‌های پیش واکشی سخت‌افزاری.بافرهای جریان (Stream buffers).روش دیگری برای پیش واکشی دستورالعمل‌ها، پیش واکشی تعدادی آدرس به صورت دنباله هستند. این روش عمدتاً زمانی استفاده می‌شود که بلوک‌های متوالی که قرار است از قبل واکشی شوند، دارای s آدرس جدا از هم هستند،این روش Strided Prefetching نام دارد.روش‌های پیش واکشی نرم‌افزاری.پیش واکشی هدایت شده توسط کامپایلر.پیش واکشی هدایت شده توسط کامپایلر، در حلقه‌هایی با تعداد زیاد تکرار استفاده می‌شود. در این تکنیک، کامپایلر cache misses را پیش‌بینی می‌کند و یک دستورالعمل پیش واکشی بر اساس جریمه خطا و زمان اجرای دستورالعمل‌ها ایجاد می‌کند.این پیش واکشی‌ها عملیات حافظه غیر مسدود هستند، یعنی این دسترسی‌های حافظه با دسترسی‌های واقعی حافظه تداخلی ندارند، وضعیت پردازنده را تغییر نمی‌دهند و همچنین باعث وقوع خطا در پردازنده نمی‌شوند.یکی از مزیت‌های اصلی پیش واکشی نرم‌افزار، کاهش تعداد cache misses است.مثال زیر نشان می‌دهد که چگونه یک دستورالعمل پیش واکشی به یک کد برای بهبود عملکرد حافظه پنهان اضافه می‌شود.یک حلقه for را در نظر بگیرید:for (int i=0; i&lt;1024; i++) { array1[i] = 2 * array1[i];در هر تکرار، i امین عنصر از آرایه "array1" قابل دسترسی است؛ بنابراین، می‌توانیم عناصری را که در تکرارهای بعدی به آن نیاز داریم را با قرار دادن یک دستورالعمل "prefetch" مانند شکل زیر پیش واکشی کنیم:for (int i=0; i&lt;1024; i++) { prefetch (array1 [i + k]); array1[i] = 2 * array1[i];اینجا، گام پیش واکشی، formula_1 به دو عامل بستگی دارد، cache miss penalty و زمان لازم برای اجرای یک تکرار حلقه for. به عنوان مثال، اگر یک تکرار از حلقه ۷ سیکل طول بکشد تا اجرا شود، cache miss penalty چهل و نه چرخه باشد. داریمformula_4. که به این معنی است که باید ۷ عنصر را پیش واکشی کنیم. در زمان اولین تکرار، i=۰ خواهد بود، بنابراین عنصر هفتم را پیش واکشی می‌کنیم. با همین منوال، ۷ عنصر اول (i=۰-&gt;۶) همچنان پیش واکشی می‌شوند (به عبارتی دیگر هر عنصر از آرایه۱ در یک خط‌کش برای خودش قرار دارد).معیارهای پیش واکشی حافظه پنهان.سه معیار اصلی برای پیش واکشی حافظه پنهان وجود داردپوشش.پوشش، نسبت تعداد cache misses پیشگیری شده به خاطر پیش واکشی به تعداد کل cache misses است:formula_5 ،جایی که، formula_6دقت.دقت، نسبت پیش واکشی مفید (آدرس‌های پیش واکشی شده توسط برنامه) به کل پیش واکشی‌ها.formula_7در حالی که به نظر می‌رسد داشتن دقت کامل به معنای عدم وجود خطا است، اگر بلوک‌های پیش واکشی شده مستقیماً در حافظه پنهان قرار گیرند، خود پیش واکشی‌ها ممکن است منجر به خطاهای جدیدی شوند. اگرچه این مورد ممکن است کسر کوچکی از تعداد کل پیش واکشی‌ها باشد ولی احتمالش صفر نیست.به موقع بودن.گوییم یک پیش واکشی به موقع است اگر حدفاصل زمان بین پیش واکشی و واکشی کم باشد. یک مثال برای توضیح بیشتر به موقع بودن به شرح زیر است:یک حلقه for را در نظر بگیرید که در آن هر تکرار ۳ چرخه برای اجرا و عملیات پیش واکشی ۱۲ چرخه طول می‌کشد. این بدان معناست که برای اینکه داده‌های پیش واکشی شده مفید باشند، باید پیش واکشی را formula_8 تکرار قبل از استفاده اصلی انجام دهیم.