پیش‌واکشی

پیش‌واکشی (به انگلیسی: prefetching) تکنیکی در رایانش است که با دریافت داده‌ها یا دستورالعمل‌ها قبل از نیاز به آنها باعث بهبود عملکرد می‌شود. با پیش‌بینی آنچه یک برنامه در آینده درخواست خواهد کرد، سیستم می‌تواند اطلاعات را از قبل بارگذاری کند تا زمان انتظار کاهش یابد. 

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

## نمای کلی
پیش واکشی با پیش‌بینی اینکه در آينده به کدام آدرس‌های حافظه یا منابع سیستم نیاز پیدا خواهد شد و بارگذاری آنها در حافظه‌های ذخیره‌سازی با دسترسی سریع‌تر، مانند حافظه‌های نهان ، کار می‌کند. 

پیش‌واکشی می‌تواند در موارد زیر مورد استفاده قرار گیرد:

* **سطح سخت‌افزار** ، مانند کنترل‌گر حافظه‌ی پردازنده
* **سطح نرم‌افزار** ، استراتژی‌ در کامپایلرها ، سیستم‌های عامل، منطق در مرورگرهای وب یا سامانه‌ی فایل‌بندی

## سخت‌افزار
پردازنده‌ها (CPU) اغلب شامل پیش‌واکشی‌ای هستند که تلاش می‌کند با بارگذاری داده‌ها در حافظه‌ی نهان، پیش از آنکه برنامه‌ی در حال اجرا آن را درخواست کند، خطاهای حافظه‌ی نهان را کاهش دهد. این تکنیک برای برنامه‌هایی است که در الگوهای قابل پیش‌بینی به حافظه دسترسی دارند، مانند حلقه‌هایی که روی آرایه‌ها تکرار می‌شوند. 

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

* پیش‌واکشی **[[پهنه‌بندی داده|گام به گام]]** ، الگوهای دسترسی به حافظه با گام ثابت (فاصله ثابت بین دسترسی‌های متوالی به حافظه) را تشخیص می‌دهد
* پیش‌واکشی **[[پردازش جریان|جریان]]** ، توالی‌های طولانی از دسترسی‌های پیوسته به حافظه را شناسایی می‌کند (دسترسی متوالی به یک بلوک از حافظه) 
* پیش‌واکشی همبستگی ، الگوهای بین خطاهای حافظه‌ی نهان را یاد می‌گیرد و بر اساس آن الگوها، پیش‌واکشی‌ها را فعال می‌کند 

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

در نرم‌افزار، دستورالعمل‌هایی وجود دارد که می‌توان آن‌ها را با موارد زیر نوشت:

*`prefetch` در معماری x86

*`__builtin_prefetch` در کامپایلر GCC

*`_mm_prefetch` در راهنمای ذاتی اینتل

### سیستم‌های عامل
سیستم‌های عامل از پیش‌واکشی برای کاهش تأخیر دسترسی به فایل و حافظه استفاده می‌کنند.

* **[[صفحه‌بندی (رایانه)|صفحه‌بندی پیش‌بینی‌شده]]**، تلاش می‌کند صفحات حافظه را بر اساس صفحات موجود و ناموجود در RAM، پیش‌واکشی کند.

### مرورگرهای وب
مرورگرهای وب از تکنیک‌های پیش‌واکشی برای بهبود عملکرد ارائه شده استفاده می‌کنند. نمونه‌های رایج آن عبارتند از:

* **[[سامانه نام دامنه|پیش‌واکشی DNS]]** : نام دامنه‌ی لینک‌هایی که احتمال کلیک شدنشان وجود دارد را پردازش می‌کند
* **[[پیش‌واکشی لینک]]** : صفحات وب یا فایل‌های لینک‌شده را قبل از کلیک کاربر بارگذاری می‌کند 
* **پیش‌بارگذاری منابع** : منابع حیاتی (مانند فونت‌ها یا اسکریپت‌ها ) را به موازات بارگذاری صفحه فعلی دریافت می‌کند 

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

بسته به نحوه‌ی پیاده‌سازی، استفاده از پیش‌واکشی نرم‌افزاری و سخت‌افزاری به طور همزمان نیز می‌تواند به دلیل تعاملاتی که ممکن است بین نرم‌افزار و سخت‌افزار رخ دهد، منجر به کاهش عملکرد شود. 

## جستارهای وابسته

* حافظه نهان (رایانش)
* پیش‌واکشی حافظه نهان
* پیش واکشی دستورالعمل
* اجرای پیش بینانه
* صف ورودی پیش‌واکشی

## منابع