ماشین مجازی

بندانگشتی|کاربری در حال استفاده از fedora توسط مجازی ساز Oracle Virtual Box
در علم کامپیوتر **ماشین مجازی**  است که بر روی یک کامپیوتر پیاده‌سازی می‌شود. این پیاده‌سازی به‌گونه‌ای است که تصور می‌شود یک کامپیوتر واقعی در حال اجرای برنامه‌های ماست.

سرورهای مجازی به دو دسته تقسیم می‌شوند.
* **سرورهای مجازی اشتراکی (VPS)**

این نوع سرورها با مجازی سازهایی مانند openvz ایجاد و مدیریت می‌شوند.

این نوع سرورها چون تمامی منابع آنها اشتراکی و به صورت Oversell می‌باشد از کیفیت نچندان مطلوب برخوردار هستند و از مزایای آنها به دلیل اشتراکی بودن منابع و Oversell بودن سرور می‌توان به قیمت بسیار پایین این سرویس‌ها اشاره کرد.

منابع این نوع سرورها به صورت کاملاً اشتراکی بوده و در تمامی منابع مانند رم، هارد، سی پی یو و شبکه سرور و حتی کرنل یا همان هسته مرکزی مجاز ساز با هم مشترک هستند.
* **سرورهای مجازی اختصاصی (VDS)**

این نوع سرور ها که  از مجازی سازهایی هم چون VMWare , KVM , Proxmox استفاده می‌کند که این مجازی سازها از حالت ایزوله استفاده می‌کنند و تمامی کاربرانی که این نوع سروی‌ها را دارا هستند توسط پلنی که برای آنها تعریف شده از مقدار منابع به‌خصوصی استفاده می‌کنند و تمامی منابع آنها توسط مدیران و تیم فنی به صورت دقیق تنظیم شده.

این نوع **سرورهای مجازی** همانند **سرورهای اختصاصی** هستند با این تفاوت که می‌توانند از مقدار منابع کمتری نسبت به سرورهای اختصاصی بهره‌مند شوند و با قیمت مناسب تر از سرورهای اختصاصی قابل تهیه می‌باشند.

از قابلیت‌های آنها می‌توان به نصب سیستم عامل‌های ویندوزی و لینوکسی به صورت اختصاصی اشاره کرد.

## تعاریف
یک ماشین مجازی، در ابتدا توسط Popek and Goldberg به صورت «یک نسخه کپی شده از روی یک ماشین واقعی، به صورت کارا و ایزوله شده» تعریف شد. استفاده‌های کنونی، ماشین‌های مجازی‌ای را شامل می‌شود که هیچ ارتباط با سخت‌افزار واقعی ندارند.

ماشین‌های مجازی، بر اساس استفاده و درجه ارتباط به ماشین واقعی، به دو دسته اصلی تقسیم می‌شوند. یک **ماشین مجازی سیستمی** یک زیرساخت محاسباتی کامل را فراهم می‌کند که از اجرای یک سیستم‌عامل کامل پشتیبانی می‌کند. در مقابل، یک **ماشین مجازی فرایند**، برای اجرای یک برنامه واحد طراحی شده، که این به این معناست که صرفاً از یک فرایند خاص پشتیبانی می‌کند. یک ویژگی مهم یک ماشین مجازی، این است که نرم‌افزاری که درون آن در حال اجراست، با منابع و سطوح انتزاعی که توسط ماشین مجازی اعمال می‌شود، محدود شده‌است – یعنی نمی‌تواند از دنیای مجازی خود خارج شود.
ماشین‌های مجازی می‌توانند فعالیت‌های خاصی را انجام دهند که انجام دادن آنها در محیط میزبان بسیار خطرناک است، مانند دسترسی به داده‌های آلوده به ویروس یا آزمایش سیستم عامل‌ها. از آنجا که ماشین مجازی از بقیه سیستم جدا شده‌است، نرم‌افزار داخل ماشین مجازی نمی‌تواند کامپیوتر میزبان را دستکاری کند.

## تاریخچه
ماشین مجازی سیستمی و ماشین مجازی فرایند به دههٔ ۶۰ میلادی بازمی‌گردند و همچنان درحال توسعه می‌باشند.

ماشین‌های مجازی سیستمی از سیستم‌های اشتراک زمانی ایجاد شدند به ویژه که این سیستم‌ها در سیستم اشتراک زمانی سازگار یا CTSS پیاده‌سازی شدند. اشتراک زمانی به کاربرها این اجازه را می‌دهد که از یک کامپیوتر به صورت همزمان استفاده کنند به طوری که به نظر می‌رسد هر برنامه دسترسی کامل به ماشین دارد اما در حقیقت تنها یک برنامه در یک لحظه در حال اجرا می‌باشد به صورتی که سیستم در فاصله‌های زمانی بین برنامه‌ها تعویض انجام می‌دهد که هر بار باعث صرفه جویی و بازیابی حالت می‌شود. این مطلب در قالب ماشین‌های مجازی تکامل یافت به خصوص به وسیلهٔ سیستم‌های تحقیقاتی شرکت IBM مانند سیستم M44/44X که از مجازی سازی جزئی استفاده می‌کرد و CP_40 و SIMMON که از مجازی سازی کامل استفاده می‌کردند و نمونه‌های اولیهٔ هایپروایزرها بودند. اولین معماری ماشین مجازی که به‌طور گسترده در دسترس قرار گرفت CP-67/CMS بود (برای دسترسی به اطلاعات بیشتر به تاریخچه‌ی CP/CMS رجوع کنید). یک تمایز مهم بین استفاده از چند ماشین مجازی بر روی یک سیستم میزبان برای اشتراک زمانی مثلاً در M44/44X و CP_40 و استفاده از یک ماشین مجازی بر روی یک سیستم میزبان برای نمونه سازی مثلاً در SIMMON وجود داشت. برابرسازها که وظیفهٔ شبیه‌سازی سخت‌افزار سیستم‌های قبلی برای سازگاری را دارند به مانند System/360 IBM در سال ۱۹۶۳ به‌وجود آمدند. این در حالی است که شبیه‌سازی نرم‌افزار (که آن زمان به نام "simulation" شناخته می‌شد) به قبل از آن بازمی‌گردد.

ماشین‌های مجازی فرایند در ابتدا به عنوان زمینه‌های انتزاعی برای یک زبان میانی استفاده شده به عنوان نمایش میانی یک برنامه به وسیلهٔ یک کامپایلر به وجود آمدند که نمونه‌های اولیه آن به سال ۱۹۶۶ بازمی‌گردند. یک نمونهٔ اولیه در سال ۱۹۶۶ ماشین O_code بود که یک ماشین مجازی است که O_code (کد شیء) خارج شده از جلوبندی کامپایلر بی سی پی ال را اجرا می‌کند. این انتزاعی سازی این اجازه را به کامپایلر می‌داد که به راحتی به یک معماری جدید انتقال یابد و این کار به وسیلهٔ پیاده‌سازی یک عقب بندی جدید که کد شیء موجود را تبدیل به کد ماشین برای ماشین فیزیکی فعلی می‌کرد، انجام می‌شد. زبان اویلر از یک طراحی مشابه برخوردار است و زبان میانی آن P می‌باشد. این مطلب درحدود سال ۱۹۷۰ به وسیلهٔ پاسکال (زبان برنامه‌نویسی) عمومیت یافت به خصوص در سیستم پاسکال_پی (۱۹۷۳) و کامپایلر پاسکال_اس (۱۹۷۵) که در آن‌ها پی_کد نامیده شد و ماشین حاصل ماشین پی_کد نامیده شد. این مطلب تأثیر گذار بوده‌است و ماشین‌های مجازی از این نظر به‌طور کلی ماشین پی_کد خوانده می‌شوند. پی_کد پاسکال علاوه بر یک زبان میانی بودن، به صورت مستقیم به وسیلهٔ یک مفسر که ماشین مجازی را پیاده‌سازی می‌کند، اجرا می‌شود به خصوص در پاسکال UCSD (1978). این مطلب مفسرهای بعدی به خصوص ماشین مجازی جاوا را تحت تأثیر قرار داد. یک مثال ابتدایی دیگر SNOBLO4 (1967) می‌باشد که به زبان پیاده‌سازی اسنوبول نوشته شده‌است. SNOBLO4 یک زبان اسمبلی برای یک ماشین مجازی است و پس از آن ماشین‌های فیزیکی را با ترنسپایل کردن اسمبلر محلی به وسیلهٔ اسمبلرهای سطح-بالا مورد هدف قرار داد. با این وجود از آن زمان اسمبلرهای سطح_بالا از رده خارج شده‌اند در نتیجه این روش کمتر تأثیرگذار بوده‌است. ماشین‌های مجازی فرایند، رویکردی محبوب برای پیاده‌سازی نرم‌افزارهای میکرو کامپیوترهای اولیه مانند تاینی بیسیک و بازی‌های ماجراجویی بودند و از پیاده‌سازی‌های یکباره مانند Pyramid 2000 گرفته تا یک موتور همه منظوره مانند z-machine شرکت Infocom که به گفتهٔ گراهام نلسون "شاید بیشترین میزان قابل حمل بودن برای یک ماشین مجازی " را داراست را پیاده‌سازی می‌کردند.

پیشرفت‌های قابل توجهی در پیاده‌سازی اسمال تاک – ۸۰ رخ داد به خصوص پیاده‌سازی دویچ/شیفمان که کامپایل در جا را به عنوان رویکرد پیاده‌سازی که از ماشین مجازی فرایند استفاده می‌کند، به جلو راند. از دیگر ماشین‌های مجازی قابل توجه اسمال تاک می‌توان VisualWorks, Strongtalk و Squeak را نام برد. زبان مرتبط دیگری که نوآوری‌های بسیاری را در زمینهٔ ماشین‌های مجازی ایجاد کرد زبان برنامه‌نویسی سلف می‌باشد که بهینه‌سازی تطبیقی و جمع‌آوری زباله‌های نسلی را پایه‌گذاری کرد. این تکنیک‌ها از نظر تجاری مثلاً در ماشین مجازی جاوای هات اسپات (سال ۱۹۹۹) موفق بودند. نوآوری‌های دیگر شامل استفاده از ماشین مجازی مبتنی بر ثبات برای تطابق بهتر با سخت‌افزار اصلی، به جای استفاده از ماشین مجازی مبتنی بر پشته که تطابق نزدیک تری با زبان برنامه‌نویسی دارد، می‌باشد؛ این مطلب در سال ۱۹۹۵ به وسیلهٔ ماشین مجازی دیس برای زبان برنامه‌نویسی لیمبو پایه‌گذاری شد.OpenJ9 یک جایگزین برای ماشین مجازی جاوا هات‌اسپات در OpenJDK می‌باشد و یک پروژهٔ منبع_باز اکلیپس می‌باشد که مدعی استارتاپ بهتر و استفاده از منابع کمتر در مقایسه با هات‌اسپات می‌باشد.

## منابع


رده:پیاده‌سازی زبان برنامه‌نویسی
رده:فناوری‌های سیستم‌عامل
رده:نرم‌افزار