حافظه مجازی
در رایانش، حافظه مجازی یا ذخیره‌سازی مجازی یک تکنیک مدیریت حافظه است که «یک فرم انتزاعی ایده‌آل از منابع ذخیره‌سازی را که در واقع در یک ماشین در دسترس است» فراهم می‌کند که برای کاربران " یک تصور از یک حافظهٔ بسیار بزرگ (اصلی) ایجاد می‌کند ".
سیستم عامل رایانه، با استفاده از ترکیبی از سخت‌افزار و نرم‌افزار، آدرس‌های حافظه مورد استفاده یک برنامه را که آدرس‌های مجازی نامیده می‌شوند، به آدرس‌های فیزیکی در حافظه کامپیوتر مرتبط می‌کند. فضای ذخیره‌سازی اصلی، همان‌طور که توسط یک فرایند یا کار مشاهده می‌شود، به عنوان یک فضای آدرس پشت سر هم یا مجموعه ای از بخش های(segment) کنار هم ظاهر می‌شود. سیستم عامل فضاهای آدرس مجازی و اختصاص حافظه واقعی به حافظه مجازی را مدیریت می‌کند. سخت‌افزار ترجمه آدرس در CPU که غالباً به آن واحد مدیریت حافظه (memory management unit) گفته می‌شود، به صورت خودکار آدرس‌های مجازی را به آدرس‌های فیزیکی ترجمه می‌کند. نرم‌افزارهای موجود در سیستم عامل ممکن است این قابلیت‌ها را گسترش دهند تا فضایی از آدرس مجازی فراهم شود که می‌تواند از ظرفیت حافظه واقعی فراتر رود و بنابراین حافظه بیشتری را نسبت به آنچه که از نظر فیزیکی در رایانه وجود دارد، آدرس دهی کند.
از مزایای اصلی حافظه مجازی می‌توان موارد زیر را نام برد: رفع نیاز برنامه‌ها به مدیریت فضای حافظه مشترک، توانایی به اشتراک گذاری حافظه مورد استفاده کتابخانه‌ها بین فرایندها، افزایش امنیت به دلیل جداسازی حافظه و استفاده مفهومی از حافظه ای بیشتر از آنچه که از نظر فیزیکی در دسترس است با استفاده از تکنیک صفحه بندی یا تقسیم‌بندی.
حافظه مجازی بخشی جدایی ناپذیر از معماری رایانه‌های مدرن است. پیاده‌سازی‌ها معمولاً به پشتیبانی سخت‌افزاری نیاز دارند که معمولاً به صورت یک واحد مدیریت حافظه است که درون CPU تعبیه شده‌است. اگرچه لازم نیست، اما شبیه‌سازها و ماشین‌های مجازی می‌توانند از پشتیبانی سخت‌افزاری برای افزایش عملکرد پیاده‌سازی حافظه مجازی خود استفاده کنند. در نتیجه، سیستم عامل‌های قدیمی تر، مانند سیستم‌های رایانه‌های بزرگ دهه ۱۹۶۰ و سیستم‌های رایانه‌های شخصی اوایل تا اواسط دهه ۱۹۸۰ (به عنوان مثال، DOS) , به‌طور کلی قابلیت حافظه مجازی ندارند، موارد استثنایی قابل توجه در مورد رایانه‌های بزرگ‌های دهه ۱۹۶۰ شامل موارد زیر است: و سیستم عامل Apple Lisa نمونه ای از سیستم عامل رایانه شخصی در دهه ۱۹۸۰ است که از حافظه مجازی برخوردار است.
طی دهه ۱۹۶۰ و اوایل دهه ۷۰، حافظه کامپیوتر بسیار گران بود. معرفی حافظه مجازی توانایی اجرای سیستم‌های نرم‌افزاری با حافظه زیاد را در رایانه‌هایی با حافظه واقعی کمتر فراهم می‌کند. صرفه جویی در این زمینه انگیزه ای قوی برای تغییر به حافظه مجازی برای همه سیستم‌ها بود. قابلیت اضافی ایجاد فضاهای آدرس مجازی، سطح دیگری از امنیت و قابلیت اطمینان را ایجاد می‌کند و بنابراین حافظه مجازی را برای بازار جذاب تر می‌کند.
اکثر سیستم عامل‌های مدرن که از حافظه مجازی پشتیبانی می‌کنند نیز هر پردازش را در فضای آدرس اختصاصی خود اجرا می‌کنند؛ بنابراین طوری به نظر می‌رسد که انگار هر برنامه بتنهایی به حافظه مجازی دسترسی دارد. با این حال، برخی از سیستم عامل‌های قدیمی (مانند OS / VS1 و OS / VS2 SVS) و حتی سیستم‌های مدرن (مانند IBM i) سیستم عامل‌های تک فضای آدرسی هستند که تمام پردازش‌ها را در یک فضای آدرس واحد متشکل از حافظه مجازی اجرا می‌کنند.
سیستم‌های جاسازی شده و سایر سیستم‌های رایانه ای مخصوص که نیاز به زمان پاسخ بسیار سریع یا بسیار پایدار دارند، ممکن است به دلیل کاهش قطعیت، استفاده از حافظه مجازی را انتخاب نکنند. سیستم‌های حافظه مجازی باعث ایجاد تله‌های غیرقابل پیش‌بینی می‌شود که ممکن است در پاسخ به ورودی، تأخیرهای ناخواسته و غیرقابل پیش‌بینی ایجاد کند، به خصوص اگر دام نیاز به خواندن داده‌ها از حافظه ثانویه به حافظه اصلی داشته باشد. سخت‌افزار ترجمه آدرس‌های مجازی به آدرس‌های فیزیکی معمولاً به یک مساحت تراشه قابل توجهی برای پیاده‌سازی احتیاج دارد و همه تراشه‌های استفاده شده در سیستم‌های تعبیه شده شامل این سخت‌افزار نیستند، این دلیل دیگری است که برخی از این سیستم‌ها از حافظه مجازی استفاده نمی‌کنند.
تقریباً همه پیاده‌سازی‌های فعلی حافظه مجازی، فضای آدرس مجازی را به صفحات تقسیم می‌کنند، که بلوک‌هایی پشت سرهم از آدرس‌های حافظه مجازی هستند. اندازه صفحات مربوط به سیستم های کنونی معمولاً حداقل ۴ کیلوبایت است. سیستم‌های دارای دامنه آدرس مجازی بزرگ یا مقدار حافظه واقعی بزرگ معمولاً از اندازه صفحه‌های بزرگتر استفاده می‌کنند.
جداول صفحه برای ترجمه آدرس‌های مجازی قابل دیدن توسط برنامه به آدرسهای فیزیکی مورد استفاده سخت‌افزار برای پردازش دستورالعملها استفاده می‌شود؛ چنین سخت‌افزاری که این ترجمه خاص را مدیریت می‌کند اغلب به عنوان واحد مدیریت حافظه شناخته می‌شود. هر مدخل در جدول صفحه دارای یک پرچم است که نشان می‌دهد صفحه مربوطه در حافظه واقعی است یا خیر. اگر در حافظه واقعی باشد، مدخل جدول صفحه حاوی آدرسی از حافظه واقعی است که صفحه در آن ذخیره شده‌ است. هنگامی که سخت‌افزار به صفحه ای مراجعه می‌کند، اگر مدخل جدول صفحه نشان دهد که صفحهٔ مورد نظر در حال حاضر در حافظه واقعی وجود ندارد، آنگاه سخت‌افزار یک استثنا خطای صفحه (page fault) را برمی‌انگیزد که موجب فراخوانی بخش ناظر صفحه بندی سیستم عامل می‌شود.
سیستم‌ها می‌توانند یک جدول صفحه برای کل سیستم، جداول صفحه جداگانه برای هر برنامه و بخش، یک درخت جداول صفحه برای بخشهای بزرگ یا ترکیبی از اینها داشته باشند. اگر فقط یک جدول صفحه وجود داشته باشد، برنامه‌های مختلفی که همزمان اجرا می‌شوند از قسمتهای مختلف یک دامنه آدرس مجازی استفاده می‌کنند. اگر چندین جدول صفحه یا بخش وجود داشته باشد، چندین فضای آدرس مجازی و برنامه‌های همزمان با جداول صفحه جداگانه وجود دارد که به آدرس‌های مختلف واقعی هدایت می‌کنند.
برخی از سیستم‌های قبلی با اندازه حافظه واقعی کوچکتر مانند SDS 940، از ثبات‌های صفحه به جای جداول صفحه در حافظه برای ترجمه آدرس استفاده می‌کنند.
این قسمت از سیستم عامل جداول صفحه را ایجاد و مدیریت می‌کند. اگر سخت‌افزار یک استثنای خطای صفحه را ایجاد کند، ناظر صفحه بندی به حافظه ثانویه دسترسی پیدا می‌کند، صفحه ای را که دارای آدرس مجازی است که منجر به خطای صفحه شده‌است، برمی‌گرداند، جداول صفحه را به روز می‌کند تا مکان فیزیکی آدرس مجازی را منعکس کند و به مکانیسم ترجمه می‌گوید درخواست را مجدداً راه اندازی کنید.
وقتی همه حافظه فیزیکی در حال استفاده است، ناظر صفحه بندی باید یک صفحه را در حافظه اصلی آزاد کند تا صفحه مبادله شده به داخل را نگه دارد. ناظر از یکی از انواع الگوریتم‌های جایگزینی صفحه مانند کمترین مورد استفاده شده اخیرا(least recently used) برای تعیین اینکه کدام صفحه را آزاد کند استفاده می‌کند.
سیستم عامل‌ها دارای مناطق حافظه ای هستند که سنجاق(pin) شده‌اند (هرگز به حافظه ثانویه جابجا نمی‌شوند). سایر اصطلاحات مورد استفاده عبارتند از: صفحات قفل شده، ثابت شده یا سیمی هستند. به عنوان مثال، مکانیزم‌های وقفه به آرایه ای از اشاره گرها به مدیریت کنندهٔ آنها، مانند تکمیل ورودی/خروجی و خطای صفحه، متکی هستند. اگر صفحات حاوی این اشاره گرها یا کدی که آنها فراخوان می‌کنند قابل صفحه بندی باشند، مدیریت وقفه بسیار پیچیده‌تر و زمانبرتر می‌شود، خصوصاً در موارد وقفه‌های خطای صفحه. از این رو، برخی از ساختارهای جدول صفحه قابل صفحه بندی نیستند.
برخی از صفحات ممکن است برای مدت زمان کوتاه سنجاق شوند، برخی دیگر ممکن است برای مدت طولانی سنجاق شوند و برخی دیگر ممکن است نیاز به سنجاق شدن دائمی داشته باشند. مثلا:
در سیستم عامل‌های IBM برای سیستم ۳۷۰ و سیستم‌های بعد از آن، این اصطلاح «ثابت شده» است، و چنین صفحاتی ممکن است بشکل بلند مدت ثابت شده باشند، یا ممکن است کوتاه مدت ثابت شده باشند، یا ممکن است ثابت شده نباشند (یعنی قابل صفحه بندی). ساختارهای کنترل سیستم اغلب بطور بلند مدت ثابت شده هستند (با زمان ساعت-دیواری اندازه‌گیری می‌شوند، یعنی زمان با ثانیه اندازه‌گیری می‌شود، به جای اینکه در کسری از یک ثانیه اندازه‌گیری شود) در حالی که بافرهای ورودی/خروجی معمولاً کوتاه مدت ثابت شده هستند (معمولاً به‌طور قابل توجهی کمتر از زمان ساعت دیواری اندازه‌گیری می‌شوند، احتمالاً برای ده‌ها میلی ثانیه). در واقع، سیستم عامل دارای تسهیلات ویژه ای برای «ثابت کردن سریع» این بافرهای داده کوتاه مدت ثابت است (ثابت کردنی که بدون استفاده از دستورالعمل فراخوان ناظر وقت گیر انجام می‌شود).
مالتیک ها() از اصطلاح «سیم دار شده» استفاده کردند. OpenVMS و Windows برای صفحاتی که به‌طور موقت غیرقابل صفحه بندی می‌شوند (مثلا برای بافرهای ورودی/خروجی) از اصطلاح «قفل شده» و برای «صفحه ای که هرگز قابل صفحه بندی نیست» براحتی از اصطلاح «غیرقابل صفحه بندی» استفاده می‌کنند. Single UNIX Specification همچنین از واژه «قفل شده» در مشخصات mlock () استفاده می‌کند، همانند mlock() man pages در بسیاری از سیستم‌های مشابه یونیکس.
هنگام استفاده از صفحه بندی و سرقت صفحه، مشکلی به نام "thrashing" ممکن است ایجاد شود، که در آن کامپیوتر زمان زیادی را به‌طور نامناسب صرف انتقال صفحات به یک ذخیرهٔ پشتیبان یا خارج کردن صفحات از آن می‌کند، بنابراین انجام کار مفید را کند می‌کند. مجموعه کاری یک کار، حداقل مجموعه صفحاتی است که باید در حافظه باشد تا بتواند پیشرفت مفیدی داشته باشد. زد و خورد زمانی اتفاق می‌افتد که حافظه کافی برای ذخیره مجموعه‌های کاری همه برنامه‌های فعال در دسترس نباشد. افزودن حافظه واقعی ساده‌ترین راه حل است، اما بهبود طراحی برنامه، زمان‌بندی و استفاده از حافظه می‌تواند کمک کند. راه حل دیگر کاهش تعداد کارهای فعال در سیستم است. این امر با خارج کردن کامل مجموعه کار یک یا چند فرایند، تقاضای حافظه واقعی را کاهش می‌دهد.
بعضی از سیستم‌ها مانند Burroughs B5500 به جای صفحه بندی، از تقسیم‌بندی(segmentation) استفاده می‌کنند و فضاهای آدرس مجازی را به بخشهایی با طول متغیر تقسیم می‌کنند. یک آدرس مجازی در اینجا از یک شماره بخش و یک جابجایی (آفست) در داخل بخش تشکیل شده‌است. Intel 80286 از یک طرح تقسیم‌بندی مشابه به عنوان یک گزینه پشتیبانی می‌کند، اما به ندرت استفاده می‌شود. از ترکیب تقسیم‌بندی و صفحه بندی می‌توان با تقسیم هر بخش به صفحات استفاده کرد. سیستم‌های دارای این ساختار حافظه، مانند Multics و IBM System / 38، معمولاً در صفحه بندی غالب هستند، و تقسیم‌بندی از حافظه محافظت می‌کند.
در پردازنده‌های Intel 80386 و بعداً IA-32، بخش‌ها در یک فضای آدرس خطی صفحه بندی شدهٔ ۳۲ بیتی قرار دارند. بخشها را می‌توان به داخل و خارج از آن فضا منتقل کرد. صفحات در آنجا می‌توانند به داخل و خارج از حافظه اصلی بروند و دو سطح حافظه مجازی را فراهم کنند. تقریباً هیچ سیستم عاملی، این کار را انجام نمی‌دهد، در عوض فقط از صفحه بندی استفاده می‌کند. راه حل‌های مجازی سازی اولیه x86 بدون سخت‌افزار، صفحه بندی و تقسیم‌بندی را با هم ترکیب کردند زیرا صفحه بندی x86 تنها دو دامنه محافظت را ارائه می‌دهد در حالی که یک VMM، سیستم عامل مهمان یا پشتهٔ اپلیکیشن مهمان به سه مورد نیاز دارد. تفاوت بین صفحه بندی و تقسیم‌بندی فقط مربوط به تقسیم حافظه نیست؛ تقسیم‌بندی برای فرآیندهای کاربر، به عنوان بخشی از معناشناسی مدل حافظه، قابل مشاهده است. از این رو، به جای حافظه ای که شبیه صرفاً یک فضای بزرگ است، در چندین فضای مختلف ساختار بندی شده‌است.
این تفاوت پیامدهای مهمی دارد. نمی‌توان گفت که یک بخش، یک صفحه با طول متغیر یا یک روش ساده برای افزایش فضای آدرس است. تقسیم‌بندی که می‌تواند یک مدل حافظه تک سطحی را ارائه دهد که در آن هیچ تفاوتی بین حافظه پردازش و سیستم فایل وجود ندارد، فقط شامل لیستی از بخش‌ها (فایل‌ها) است که به فضای آدرس بالقوه فرایند مرتبط شده‌است.
این، شبیه مکانیسم‌های ارائه شده توسط فراخوان‌هایی مانند mmap و MapViewOfFile Win32 نیست، زیرا هنگام مرتبط کردن فایل‌ها به مکان‌های نیمه دلخواه، اشاره‌گرهای بین-فایل کار نمی‌کنند. در Multics، یک فایل (یا یک بخش از یک فایل چند بخشی) به یک بخش در فضای آدرس مرتبط می‌شود، بنابراین فایل‌ها همیشه در مرز یک بخش مرتبط می‌شوند. بخش اتصال یک فایل می‌تواند حاوی اشاره‌گرهایی باشد که تلاش برای بارگیری اشاره گر در یک ثبات یا ارجاع غیر مستقیم از طریق آن باعث ایجاد دام می‌شود. اشاره گر حل نشده حاوی نشانه ای از نام بخشی است که اشاره گر به آن اشاره می‌کند و یک جابجایی درون بخش است. مدیریت کنندهٔ دام، بخش را به فضای آدرس مرتبط می‌کند، شماره قسمت را در اشاره‌گر قرار می‌دهد، قسمت برچسب را در اشاره‌گر تغییر می‌دهد تا دیگر باعث دام نشود، و دوباره به کدی که دام در آن رخ داده‌است بازمی‌گردد و دستورالعمل ایجاد کننده دام را مجدداً اجرا می‌کند. این امر نیاز به لینک دهنده را به‌طور کامل از بین می‌برد و زمانی جواب می‌دهد که پردازش‌های مختلف، فایل مشابهی را به مکان‌های مختلف در فضای آدرس خصوصی خود مرتبط کنند.
برخی از سیستم عامل‌ها علاوه بر امکاناتی که برای صفحه بندی و تقسیم‌بندی دارند، امکان جابجایی کل فضاهای آدرس را نیز فراهم می‌کنند. وقتی این اتفاق می‌افتد، سیستم عامل آن صفحات و بخشهایی را که در حال حاضر در حافظه واقعی قرار دارند می‌نویسد تا فایل‌ها را تعویض کند. در جابجایی به داخل، سیستم عامل داده‌های فایل‌های جابجایی را بازخوانی می‌کند اما به‌طور خودکار صفحاتی را که در زمان انجام عمل مبادله خارج شده بودند، مجدداً نمی‌خواند.
سیستم عامل‌های MVS شرکت IBM، از OS/VS2 Release 2 گرفته تا z/OS فضای آدرس را به شکل غیرقابل جابجایی فراهم می‌کنند. با این کار هیچ صفحه ای در فضای آدرس پین نمی‌شود. با وارد کردن نام یک برنامه اصلی واجد شرایط در جدول ویژگی‌های برنامه(program properties table) با یک پرچم غیرقابل جابجایی، می‌توان این کار را برای مدت زمان یک کار انجام داد. علاوه بر این، کد مجاز می‌تواند با استفاده از دستورالعمل فراخوانی ناظر SYVEVENT به‌طور موقت فضای آدرس را غیرقابل تغییر کند. برخی تغییرات در ویژگی‌های فضای آدرس مستلزم آن است که سیستم عامل با استفاده از SYSEVENT TRANSWAP آن را به خارج جابجا کرده و سپس دوباره آن را به داخل جابجا کند.
جابجا کردن لزوماً به سخت‌افزار مدیریت حافظه احتیاج ندارد، اگر مثلاً چندین کار در قسمت مشابهی از حافظهٔ ذخیره‌سازی به داخل و خارج جابجا شوند.
حافظه
حافظه فقط خواندنی
حافظه خواندنی-نوشتنی
حافظه فَرّار
حافظه دسترسی تصادفی (به انگلیسی: Random-Access Memory یا RAM)
حافظه پنهان (به انگلیسی: Cache)
ثبات (به انگلیسی: Register)
حافظه فلش (به انگلیسی: Flash Memory)
صفحه‌بندی (رایانه) (به انگلیسی: Paging)
تقسیم حافظه (به انگلیسی: Memory Segmentation)
حفاظت از حافظه (به انگلیسی: Memory Protection)