توهمی که حافظه مجازی فراهم میکند
هر برنامه در حال اجرا طوری رفتار میکند که گویی یک بلوک بزرگ، خصوصی، و پیوسته از حافظه از آدرس صفر دارد، کاملاً بیخبر از برنامههای دیگری که همزمان اجرا میشوند یا از اینکه ماشین واقعاً چقدر حافظه فیزیکی دارد. این توهم توسط Virtual Memory ایجاد میشود، مکانیزمی که آدرسهایی که یک برنامه استفاده میکند را از مکانهای واقعی حافظه فیزیکی که داده در آنها ذخیره میشود جدا میکند.
دو نوع آدرس
یک برنامه منحصراً با Virtual Addresses کار میکند، در حالی که حافظه سختافزاری واقعی توسط Physical Addresses سازماندهی میشود. هر دسترسی حافظهای که یک برنامه انجام میدهد باید از یک آدرس مجازی به آدرس فیزیکی متناظر ترجمه شود پیش از اینکه سختافزار واقعی بتواند داده را بازیابی یا ذخیره کند.
صفحات: واحد ترجمه
بهجای ترجمه بایتهای تکی یکییکی، حافظه به قطعات با اندازه ثابت به نام Pages تقسیم میشود. هر صفحه مجازی به یک Frame فیزیکی با همان اندازه نگاشت میشود، و این نگاشت در یک ساختار داده به نام Page Table ثبت میشود، که توسط سیستمعامل نگهداری میشود.
آدرس مجازی:
[ شماره صفحه مجازی | آفست صفحه ]
جستجوی جدول صفحه:
شماره صفحه مجازی → شماره فریم فیزیکی
آدرس فیزیکی:
[ شماره فریم فیزیکی | آفست صفحه ]چرا ترجمه باید سریع باشد
از آنجا که هر دسترسی حافظهای واحد به یک ترجمه نیاز دارد، مراجعه به جدول صفحه کامل در حافظه اصلی برای هر دسترسی بسیار کند خواهد بود. برای حل این مسئله، سختافزار یک کش کوچک و تخصصی به نام TLB (Translation Lookaside Buffer) شامل میشود، که ترجمههای مجازی-به-فیزیکی اخیراً استفادهشده را مستقیماً ذخیره میکند، مشابه از نظر روحی با اصول کشینگ که پیشتر در این مجموعه بحث شد. یک TLB hit اجازه میدهد ترجمه تقریباً بلافاصله رخ دهد، در حالی که یک TLB miss نیازمند مراجعه به جدول صفحه کامل است، که بهطور قابلتوجهی کندتر است.
وقتی داده در حافظه فیزیکی نیست چه اتفاقی میافتد
از آنجا که حافظه مجازی اجازه میدهد یک برنامه طوری رفتار کند که گویی حافظه بیشتری از آنچه فیزیکاً نصب شده دارد، برخی صفحات مجازی ممکن است در حال حاضر اصلاً در حافظه فیزیکی حضور نداشته باشند، و در عوض روی دیسک ذخیره شده باشند. وقتی یک برنامه به چنین صفحهای دسترسی پیدا میکند، یک Page Fault رخ میدهد: سیستمعامل برنامه را متوقف میکند، صفحه مورد نیاز را از دیسک بازیابی میکند، آن را در حافظه فیزیکی قرار میدهد، جدول صفحه را بر همین اساس بهروزرسانی میکند، و سپس اجرای برنامه را طوری از سر میگیرد که گویی هیچ اتفاق غیرمعمولی رخ نداده است.
چرا حافظه مجازی همچنین حفاظت فراهم میکند
فراتر از فعال کردن برنامهها برای استفاده از حافظه بیشتری نسبت به آنچه فیزیکاً موجود است، حافظه مجازی یک بهره حفاظتی حیاتی فراهم میکند: از آنجا که هر برنامه فقط دید به فضای آدرس مجازی خودش دارد، نمیتواند مستقیماً حافظه متعلق به یک برنامه دیگر در حال اجرا را بخواند یا خراب کند، چون سیستمعامل جدول صفحه هر برنامه را کنترل میکند و صرفاً هرگز آدرسهای آن را روی حافظه فیزیکی برنامه دیگری نگاشت نمیکند.
چرا این مکانیزم برای محاسبات مدرن ضروری است
بدون حافظه مجازی، اجرای امن و همزمان چند برنامه مستقل نیازمند مدیریت حافظه دستی بسیار دقیقتر و شکنندهتری خواهد بود، و برنامهها باید دقیقاً میدانستند ماشین چقدر حافظه فیزیکی دارد و برنامههای دیگر کجا قرار دارند — سطحی از پیچیدگی که حافظه مجازی بهطور کامل پنهان میکند، و اجازه میدهد نرمافزار بسیار سادهتر و امنتر نوشته شود.