Во пресметувачката наука, **виртуелната машина** (**В.М.**) е емулација на сметачки систем. Виртуелните машини се засноваат на сметачки архитектури и обезбедуваат функционалност на физички сметач. Нивните имплементации може да вклучуваат специјализиран хардвер, софтвер или комбинација.

Постојат различни видови на виртуелни машини, секоја со различни функции:

* **Системски виртуелни машини** (исто така наречени В.М. за целосна виртуелизација) обезбедуваат замена за вистинска машина. Тие обезбедуваат функционалност потребна за извршување на цели оперативни системи. Хипервизор користи природно извршување за споделување и управување со хардверот, дозволувајќи им на повеќе околини изолирани едни од други, но сепак постојат на истата физичка машина. Современите хипервизори користат хардверски виртуелизација, хардвер специфичен за виртуелизација, пред сè од обработувачот домаќин.
* **Виртуелните машини на процеси** се дизајнирани да извршуваат сметачки програми во околина независна од платформата.

Некои виртуелни машини, како што е QEMU, се дизајнирани да имитираат различни архитектури и да овозможат извршување на софтверски апликации и оперативни системи напишани за друг обработувач или архитектура. Виртуелизација на ниво на оперативен систем овозможува ресурсите на сметачот да се поделат преку кернелот. Условите не се универзално заменливи.

Дефиниции
---------

### Системски виртуелни машини

„Виртуелната машина" првично била дефинирана од Попек и Голдберг како „ефикасна, изолирана дупликат на сметачка машина во вистинско време". Тековната употреба вклучува виртуелни машини кои немаат директна кореспонденција со кој било вистински хардвер. Физичкиот, „вистински" хардвер што работи на В.М. генерално се нарекува „домаќин", а виртуелната машина емулирана на таа машина обично се нарекува „гостин". Домаќинот може да емулира неколку гости, од кои секој може да имитира различни оперативни системи и хардверски платформи.

Желбата да се извршуваат повеќе оперативни системи бил првичен мотив за виртуелни машини, со цел да се овозможи споделување на време меѓу неколку оперативни системи со една задача. Од некои аспекти, системската виртуелна машина може да се смета за генерализација на концептот за виртуелна меморија што историски му претходела. CP / CMS на IBM, првите системи што овозможуваат целосна виртуелизација, спроведуваат споделување на времето со обезбедување на секој корисник оперативен систем со еден корисник, Системот за разговор за мониторинг (CMS). За разлика од виртуелната меморија, системска виртуелна машина има право на корисникот да напише привилегирани упатства во нивниот код. Овој пристап имал одредени предности, како што е додавање влезни/излезни уреди што не се дозволени од стандардниот систем.

Бидејќи технологијата еволуира виртуелна меморија за цели на виртуелизација, може да се применат нови системи на совладување на меморијата за управување со споделување на меморија меѓу повеќе виртуелни машини на еден сметачки оперативен систем. Може да биде можно да се споделат *страници за меморија* кои имаат идентична содржина меѓу повеќе виртуелни машини што работат на истата физичка машина, што може да резултира во мапирање на истата физичка страница со техника наречена спојување на истата страница со кернел (KSM). Ова е особено корисно за страниците само за читање, како што се оние што содржат сегменти со код, што е случај за повеќе виртуелни машини што работат со ист или сличен софтвер, библиотеки на софтвер, опслужувачи, компоненти на Middleware, итн. Оперативните системи за гости не треба да бидат во согласност со хардверот домаќин, со што се овозможува да се извршуваат различни оперативни системи на ист сметач (на пр. Windows, Linux или претходни верзии на оперативен систем) за поддршка на идниот софтвер.

Употребата на виртуелни машини за поддршка на одделни гостински оперативни системи е популарна во однос на вградените системи. Типична употреба би била да се работи со оперативен систем во реално време истовремено со претпочитан комплексен оперативен систем, како што се Linux или Windows. Друга употреба би била за новел и недокажан софтвер сè уште во фаза на развој, така што работи во песочница (sandbox). Виртуелните машини имаат други предности за развој на оперативниот систем и може да вклучуваат подобар пристап за дебагирање и побрзи рестартирање.

Повеќето виртуелни машини кои работат сопствен оперативен систем за гости често се ангажирани за консолидација на опслужувачот.

### Обработни виртуелни машини

Обработна В.М. понекогаш наречен *апликативна виртуелна машина*, или *Управувано траење на околината* (MRE), работи како нормална апликација во рамките на оперативниот систем на домаќинот и поддржува еден процес. Се создава кога тој процес ќе се започне и уништува кога ќе излезе. Неговата цел е да обезбеди платформа зависна од независна програма за програмирање која апстрактира детали за основниот хардвер или оперативниот систем и дозволува програма да извршува на ист начин на која било платформа.

Обработните виртуелни машини обезбедуваат апстракција на високо ниво  –  оној на јазик за програмирање на високо ниво (во споредба со ниско ниво АСА апстракција на системот В.М.). ВМ-процесите се спроведуваат со помош на преведувач; перформанси споредливи со компајлирани програмски јазици може да се постигне со употреба на навреме компилација. Овој вид на в.м. станал популарен со Програмскиот јазик Јава, кој се спроведува со помош на Виртуелната машина Јава. Другите примери вклучуваат Parrot виртуелната машина и .NET Framework, кој работи на в.м. наречен Common Language Runtime. Сите тие можат да послужат како слој на апстракција за кој било сметачки јазик.

Посебен случај на обработни в.м. се системи што апстрактни во текот на комуникациските механизми на (потенцијално хетероген) сметачки збир. Таквата в.м. не се состои од еден процес, туку еден процес по физичка машина во кластерот. Тие се дизајнирани да ја олеснат задачата за програмирање на истовремени апликации, дозволувајќи му на програмерот да се фокусира на алгоритмите, наместо на механизмите за комуникација, обезбедени од интерконекцијата и оперативниот систем. Тие не го кријат фактот дека се одвива комуникацијата и како такви не се обидуваат да го претстават кластерот како единечна машина. За разлика од другите обработни в.м. овие системи не обезбедуваат специфичен програмски јазик, туку се вметнати на постоечки јазик; обично таков систем обезбедува обврзувања за неколку јазици (на пример, Ц и Фортран). Примери се Parallel Virtual Machine (PVM) и Message Passing Interface (MPI). Тие не се строго виртуелни машини затоа што апликациите што работат нагоре сè уште имаат пристап до сите услуги на ОС и затоа не се ограничени на моделот на системот.

Историја
--------

Двете системски виртуелни машини и обработни виртуелни машини датираат од 1960-тите и продолжуваат да бидат области на активен развој.

*Системските за виртуелни машини* прераснале од споделување на време, како што е имплементирано во Компатибилниот систем за споделување на време (CTSS). Размената на време им овозможила на повеќе корисници да користат сметач истовремено: се чини дека секоја програма има целосен пристап до машината, но само една програма беше извршена во тоа време, при што системот се менувал меѓу програмите во временски парчиња, заштедувајќи и обновувајќи ја состојбата секој пат. Ова еволуирало во виртуелни машини, особено преку истражувачките системи на IBM: M44 / 44X, кој користеше делумна виртуелизација, и CP-40 и SIMMON, кои користеа целосна виртуелизација и беа рани примери на хипервизори. Првата широко достапна архитектура за виртуелна машина била CP-67 / CMS (видете историја на CP / CMS за детали). Важна разлика била помеѓу користењето на повеќе виртуелни машини на еден систем домаќин за споделување на времето, како во M44 / 44X и CP-40, и користењето на една виртуелна машина на системот за домаќини за прототипи, како во SIMMON. Емулатори, со хардверска емулација на претходните системи за компатибилност, датираат од IBM System / 360 во 1963 година, додека емулацијата на софтверот (т.н. „симулација").

*Обработните виртуелните машини се* појавиле првично како апстрактни платформи за среден јазик што се користи како средно претставување на програмата од страна на компајлерот; раните примери датираат околу 1966 година. Еден ран пример од 1966 година била машината О-код, виртуелна машина што извршува О-код (код за објектот) испуштен од предниот крај на компајлерот BCPL. Оваа апстракција овозможи компајлерот лесно да се пренесе во нова архитектура со имплементирање на нов заден дел што го зема постојниот О-код и го составува во машинскиот код за основната физичка машина. Јазикот на Ејлер користел сличен дизајн, со средно јазик по име *P* (преносен). Ова било популаризирано околу 1970 година од страна на Паскал, особено во системот Паскал-П (1973) и компајлерот Паскал-С (1975), во кое беше наречен п-код и како резултат машина како машина за П-код. Ова било влијателно, а виртуелните машини во оваа смисла честопати се нарекуваа машини за P-код. Покрај тоа што е среден јазик, p-кодот на Паскал, исто така, бил извршен директно од преведувач што ја спроведува виртуелната машина, особено во UCSD Pascal (1978); ова влијаело врз подоцнежните толкувачи, особено на виртуелната машина Јава (JVM). Друг ран пример беше SNOBOL4 (1967), кој беше напишан на јазик за имплементација SNOBOL (SIL), составувачки јазик за виртуелна машина, која потоа била насочена кон физички машини со пренесување на нивниот мајчин асемблер преку макро составувач. Сепак, макроа отпаднаа во прилог, сепак, овој пристап беше помалку влијателен. Обработните виртуелните машини на биле популарен пристап кон спроведување на ран софтвер за микросметачи, вклучувајќи ги и Tiny BASIC и авантуристичките игри, од еднократни имплементации како што е Pyramid 2000 до мотор со општа намена како z-машината на Infocom, за кој тврди Греам Нелсон е „веројатно повеќето преносни виртуелни машини досега создадени".

Значителни достигнувања се случија при имплементацијата на Smalltalk -80, особено спроведувањето на Deutsch/Schiffmann имплементацијата која ја туркала навремената компилација (JIT) напред како пристап за имплементација што користи обработна виртуелна машина. Подоцна значајни в.м. на Smalltalk биле VisualWorks, Squeak Virtual Machine, и Strongtalk. Поврзан јазик, кој произвел многу виртуелна машина иновација, бил самопрограмскиот јазик, што претставувал прилагодлива оптимизација и генерациско собирање ѓубре. Овие техники се покажаа како комерцијално успешни во 1999 година во виртуелната машина Java HotSpot. Други иновации вклучуваат поседување на виртуелна машина заснована на регистри, за подобро да се совпадне со основниот хардвер, наместо наредено заснована виртуелна машина, што е поблизок натпревар за програмскиот јазик; во 1995 година, ова било пионерирано од виртуелната машина Дис за лимбовиот јазик. OpenJ9 е алтернатива за HotSpot JVM во OpenJDK и е проект за еклипс со отворен извор, кој бара подобро започнување и помалку потрошувачка на ресурси во споредба со HotSpot.

Целосна виртуелизација
----------------------

Логички дијаграм на целосна виртуелизација
Во целосна виртуелизација, виртуелната машина симулира доволно хардвер за да овозможи немодифициран „гостин" оперативен систем (оној дизајниран за истото множество наредби) да работи во изолација. Овој пристап бил пионерски во 1966 година со IBM CP-40 и CP-67, претходници на семејството на VM оперативниот систем.

Примери надвор од опсежното поле вклучуваат Parallels Workstation, Parallels Desktop for Mac, VirtualBox, Virtual Iron, Oracle VM, Virtual PC, Virtual Server, Hyper-V, VMware Workstation, VMware Server (прекинат, претходно наречен GSX Server), VMware ESXi, QEMU, Adeos, Mac-on-Linux, Win4BSD, Win4Lin Pro, and Egenera vBlade technology.

### Виртуелизација со поддршка од хардвер

Во виртуелизација потпомогната од хардвер, хардверот обезбедува архитектонска поддршка што го олеснува градењето на монитор за виртуелна машина и им овозможува на гостите ОС да работат со изолација. Со помош на хардвер, виртуелизацијата за првпат била воведена на IBM System / 370 во 1972 година, понудено за употреба со VM / 370, првиот оперативен систем на виртуелна машина што го нудел IBM како официјален производ.

Во 2005 и 2006 година, Интел и AMD обезбедиле дополнителен хардвер за поддршка на виртуелизацијата. Sun Microsystems (сега Oracle Corporation) додал слични одлики во нивните UltraSPARC T-серија обработувачи во 2005 година. Примери на платформи за виртуелизација, прилагодени на таков хардвер, вклучуваат KVM, VMware Workstation, VMware Fusion, Hyper-V, Windows Virtual PC, Xen, Desktop за Паралели за Mac, Oracle VM Server за SPARC, VirtualBox и Parallels Workstation .

Во 2006 година, била откриена хардверска поддршка од прва генерација 32 и 64-битна x86 која ретко нуди предности за перформанси во однос на виртуелизацијата на софтверот.

Виртуелизација на ниво на оперативен систем
-------------------------------------------

Во виртуелизација на ниво на оперативен систем, физички опслужувач се виртуелизира на ниво на оперативен систем, овозможувајќи му на повеќе изолирани и безбедни виртуелизирани опслужувачи да работат на единствен физички опслужувач. Опкружувањата за "гостин" на оперативниот систем го делат истиот тест на оперативен систем како и домаќинот. Така, истиот кернел на оперативниот систем се користи и за спроведување на "гости" околини, а апликациите што работат во дадена околина "гостин" го гледаат како самостоен систем. Пионерската имплементација била FreeBSD затворите ; други примери вклучуваат Docker, Solaris Containers, OpenVZ, Linux-VServer, LXC, AIX партиции за обемот на работа, Паралели за контејнери со Virtuozzo и виртуелни сметки на iCore .

Наводи
------

1. ↑  Popek, Gerald J.; Goldberg, Robert P. (1974). „Formal requirements for virtualizable third generation architectures" (PDF). *Communications of the ACM*. **17** (7): 412–421. doi:10.1145/361011.361073.
2. 1 2  Smith, James E.; Nair, Ravi (2005). „The Architecture of Virtual Machines". *Computer (списание)*. **38** (5): 32–38, 395–396. doi:10.1109/MC.2005.173.
3. ↑  Oliphant, Patrick. „Virtual Machines". VirtualComputing. Архивирано од изворникот на 29 јули 2016. Посетено на 7 март 2020. Some people use that capability to set up a separate virtual machine running Windows on a Mac, giving them access to the full range of applications available for both platforms.
4. ↑  „Super Fast Server Reboots – Another reason Virtualization rocks". *vmwarez.com*. 9 мај 2006. Архивирано од изворникот на 14 јуни 2006. Посетено на 7 март 2020.
5. ↑  „Server Consolidation and Containment With Virtual Infrastructure" (PDF). VMware. 2007. Архивирано од изворникот (PDF) на 2013-12-28. Посетено на 7 март 2020.
6. ↑  Pugh, Emerson W. (1995). *Building IBM: Shaping an Industry and Its Technology*. MIT. стр. 274. ISBN 978-0-262-16147-3.
7. ↑  Pugh, Emerson W.; и др. (1991). *IBM's 360 and Early 370 Systems*. MIT. стр. 160–161. ISBN 978-0-262-16123-7.
8. ↑  Wirth, Niklaus Emil; Weber, Helmut (1966). *EULER: a generalization of ALGOL, and its formal definition: Part II, Communications of the Association for Computing Machinery*. **9**. New York: Association for Computing Machinery. стр. 89–99.[*мртва врска*]
9. ↑  Griswold, Ralph E. *The Macro Implementation of SNOBOL4*. San Francisco, CA: W. H. Freeman and Company, 1972 (ISBN 0-7167-0447-1), Chapter 1.
10. ↑  Nelson, Graham A. „About Interpreters". *Inform website*. Архивирано од изворникот на 3 декември 2009. Посетено на 7 март 2020.
11. ↑  Goldberg, Adele; Robson, David (1983). *Smalltalk-80: The Language and its Implementation*. Addison-Wesley Series in Computer Science. Addison-Wesley. ISBN 978-0-201-11371-6.
12. ↑  Deutsch, L. Peter; Schiffman, Allan M. (1984). „Efficient implementation of the Smalltalk-80 system". *POPL*. Солт Лејк Сити, Јута: ACM. doi:10.1145/800017.800542. ISBN 0-89791-125-3.
13. ↑  Aycock, John (2003). „A brief history of just-in-time". *ACM Comput. Surv*. **35** (2): 97–113. doi:10.1145/857076.857077.
14. ↑  Ingalls, Jr. Daniel "Dan" Henry Holmes; Kaehler, Ted; Maloney, John; Wallace, Scott; Kay, Alan Curtis (1997). „Back to the future: the story of Squeak, a practical Smalltalk written in itself". *OOPSLA '97: Proceedings of the 12th ACM SIGPLAN conference on Object-oriented programming, systems, languages, and applications*. New York, NY, USA: ACM Press. стр. 318–326. doi:10.1145/263698.263754. ISBN 0-89791-908-4.
15. ↑  Bracha, Gilad; Griswold, David (1993). „Strongtalk: Typechecking Smalltalk in a Production Environment". *Proceedings of the Eighth Annual Conference on Object-oriented Programming Systems, Languages, and Applications*. OOPSLA '93. New York, NY, USA: ACM. стр. 215–230. doi:10.1145/165854.165893. ISBN 978-0-89791-587-8.
16. ↑  Ungar, David Michael; Smith, Randall B. (December 1987). „Self: The power of simplicity". *ACM SIGPLAN Notices*. **22** (12): 227–242. doi:10.1145/38807.38828. ISSN 0362-1340.
17. ↑  Hölzle, Urs; Ungar, David Michael (1994). „Optimizing dynamically-dispatched calls with run-time type feedback". *PLDI*. Орландо, Флорида, Соединетите Држави: ACM. стр. 326–336. doi:10.1145/178243.178478. ISBN 0-89791-662-X.
18. ↑  Paleczny, Michael; Vick, Christopher; Click, Cliff (2001). „The Java HotSpot server compiler". *Proceedings of the Java Virtual Machine Research and Technology Symposium on Java Virtual Machine Research and Technology Symposium*. **1**. Monterey, California: USENIX Association.
19. ↑  Uhlig, Rich; Neiger, Gil; Rodgers, Dion; Santoni, Amy L.; Martins, Fernando C. M.; Anderson, Andrew V.; Bennett, Steven M.; Kägi, Alain; Leung, Felix H.; Smith, Larry (мај 2005). „Intel virtualization technology". *Computer*. **38** (5): 48–56. doi:10.1109/MC.2005.163.
20. ↑  Adams, Keith; Agesen, Ole (21 октомври 2006). *A Comparison of Software and Hardware Techniques for x86 Virtualization* (PDF). ASPLOS’06 21–25 октомври 2006. Сан Хозе, Калифорнија, САД. Архивирано од изворникот (PDF) на 20 август 2010. Surprisingly, we find that the first-generation hardware support rarely offers performance advantages over existing software techniques. We ascribe this situation to high VMM/guest transition costs and a rigid programming model that leaves little room for software flexibility in managing either the frequency or cost of these transitions.

Дополнителна литература
-----------------------

* Џејмс Е. Смит, Рави Наир, *Virtual Machines: Versatile Platforms For Systems And Processes*, Морган Кауфман, мај 2005 година,  ISBN 1-55860-910-5, 656 страници (опфаќа и обработни и системски виртуелни машини)
* *Виртуелни машини* Крег, Иин Д. Спрингер, 2006 година,ISBN 1-85233-969-1, 269 страници (опфаќа само обработни виртуелни машини)

Надворешни врски
----------------

* Mendel Rosenblum (31 август 2004). „The Reincarnation of Virtual Machines". *ACM Queue*. Том 2 бр.   5.
* Sandia National Laboratories Runs 1 Million Linux Kernels as Virtual Machines
* The design of the Inferno virtual machine by Phil Winterbottom and Rob Pike